diff --git a/javase/src/main/java/com/hongyi/day24/ProxyTest.java b/javase/src/main/java/com/hongyi/day24/ProxyTest.java new file mode 100644 index 0000000000000000000000000000000000000000..3f9ff909c8fa7a7e6116890d1d095f14f5af58c0 --- /dev/null +++ b/javase/src/main/java/com/hongyi/day24/ProxyTest.java @@ -0,0 +1,81 @@ +package com.hongyi.day24; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; +import java.lang.reflect.Proxy; + +/** + * @Author Kisugi Takumi + * @Date 2023/6/21 11:14 + * @Version 1.0 + */ + +interface Human { + String getBelief(); + + void eat(String food); +} + +// 被代理类 +class SuperMan implements Human { + + @Override + public String getBelief() { + return "I believe I can fly!"; + } + + @Override + public void eat(String food) { + System.out.println("I like eating " + food); + } +} + +// 代理类的工厂 +class ProxyFactory { + /** + * 通过被代理类对象 动态获取 代理类对象 + * @param obj 被代理类的对象 + * @return 代理类对象 + */ + public static Object getProxyInstance(Object obj) { + MyInvocationHandler handler = new MyInvocationHandler(); + handler.bind(obj); + return Proxy.newProxyInstance( + obj.getClass().getClassLoader(), + obj.getClass().getInterfaces(), + handler + ); + } +} + +class MyInvocationHandler implements InvocationHandler { + + private Object obj; + + public void bind(Object obj) { + this.obj = obj; + } + + /** + * 当通过代理类的对象,调用方法A时,就会动态调用这个方法 + * @param proxy 代理类对象 + * @param method 要调用的代理类对象的方法 + * @param args 方法参数 + * @return + * @throws Throwable + */ + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + return method.invoke(obj, args); + } + +} + +public class ProxyTest { + public static void main(String[] args) { + // 代理类对象 + Human proxyInstance = (Human) ProxyFactory.getProxyInstance(new SuperMan()); + System.out.println(proxyInstance.getBelief()); + proxyInstance.eat("banana"); + } +} diff --git a/javase/src/main/java/com/hongyi/proxy/Human.java b/javase/src/main/java/com/hongyi/proxy/Human.java new file mode 100644 index 0000000000000000000000000000000000000000..969a96ca2123ece0ddf0482f7979a854dd5fc057 --- /dev/null +++ b/javase/src/main/java/com/hongyi/proxy/Human.java @@ -0,0 +1,12 @@ +package com.hongyi.proxy; + +/** + * @Author Kisugi Takumi + * @Date 2023/6/21 11:44 + * @Version 1.0 + */ +public interface Human { + String getBelief(); + + void eat(String food); +} diff --git a/javase/src/main/java/com/hongyi/proxy/MyInvocationHandler.java b/javase/src/main/java/com/hongyi/proxy/MyInvocationHandler.java new file mode 100644 index 0000000000000000000000000000000000000000..fbb5dd57b44f309c12a28f73e1cb8543641e125e --- /dev/null +++ b/javase/src/main/java/com/hongyi/proxy/MyInvocationHandler.java @@ -0,0 +1,32 @@ +package com.hongyi.proxy; + +import java.lang.reflect.InvocationHandler; +import java.lang.reflect.Method; + +/** + * @Author Kisugi Takumi + * @Date 2023/6/21 11:45 + * @Version 1.0 + */ +class MyInvocationHandler implements InvocationHandler { + + private Object obj; + + public void bind(Object obj) { + this.obj = obj; + } + + /** + * 当通过代理类的对象,调用方法A时,就会动态调用这个方法 + * @param proxy 代理类对象 + * @param method 要调用的代理类对象的方法 + * @param args 方法参数 + * @return + * @throws Throwable + */ + @Override + public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { + return method.invoke(obj, args); + } + +} diff --git a/javase/src/main/java/com/hongyi/proxy/ProxyFactory.java b/javase/src/main/java/com/hongyi/proxy/ProxyFactory.java new file mode 100644 index 0000000000000000000000000000000000000000..d000d320541813124b8dd5001c3568f0eca9e8cc --- /dev/null +++ b/javase/src/main/java/com/hongyi/proxy/ProxyFactory.java @@ -0,0 +1,26 @@ +package com.hongyi.proxy; + +import java.lang.reflect.Proxy; + +/** + * @Author Kisugi Takumi + * @Date 2023/6/21 11:45 + * @Version 1.0 + */ +// 代理类的工厂 +class ProxyFactory { + /** + * 通过被代理类对象 动态获取 代理类对象 + * @param obj 被代理类的对象 + * @return 代理类对象 + */ + public static Object getProxyInstance(Object obj) { + return Proxy.newProxyInstance( + obj.getClass().getClassLoader(), + obj.getClass().getInterfaces(), + (proxy, method, args) -> { + return method.invoke(obj, args); + } + ); + } +} diff --git a/javase/src/main/java/com/hongyi/proxy/ProxyTest.java b/javase/src/main/java/com/hongyi/proxy/ProxyTest.java new file mode 100644 index 0000000000000000000000000000000000000000..60845744c858f4b4f3bf5c243e086b800631fc6d --- /dev/null +++ b/javase/src/main/java/com/hongyi/proxy/ProxyTest.java @@ -0,0 +1,16 @@ +package com.hongyi.proxy; + + +/** + * @Author Kisugi Takumi + * @Date 2023/6/21 11:44 + * @Version 1.0 + */ +public class ProxyTest { + public static void main(String[] args) { + // 代理类对象 + Human proxyInstance = (Human) ProxyFactory.getProxyInstance(new SuperMan()); + System.out.println(proxyInstance.getBelief()); + proxyInstance.eat("banana"); + } +} diff --git a/javase/src/main/java/com/hongyi/proxy/SuperMan.java b/javase/src/main/java/com/hongyi/proxy/SuperMan.java new file mode 100644 index 0000000000000000000000000000000000000000..7d38bf96e95baf2661f70ec8000e7eed1a3d119f --- /dev/null +++ b/javase/src/main/java/com/hongyi/proxy/SuperMan.java @@ -0,0 +1,19 @@ +package com.hongyi.proxy; + +/** + * @Author Kisugi Takumi + * @Date 2023/6/21 11:44 + * @Version 1.0 + */ +// 被代理类 +public class SuperMan implements Human{ + @Override + public String getBelief() { + return "I believe I can fly!"; + } + + @Override + public void eat(String food) { + System.out.println("I like eating " + food); + } +} diff --git a/javase/src/main/java/com/hongyi/test/InvokeTest.java b/javase/src/main/java/com/hongyi/test/InvokeTest.java new file mode 100644 index 0000000000000000000000000000000000000000..d794043f0329fbe3a5b4b8b00d71726e5a6fe786 --- /dev/null +++ b/javase/src/main/java/com/hongyi/test/InvokeTest.java @@ -0,0 +1,27 @@ +package com.hongyi.test; + +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Method; + +/** + * @Author Kisugi Takumi + * @Date 2023/6/20 18:00 + * @Version 1.0 + */ +public class InvokeTest { + + public void test(String[] arg){ + for (String string : arg) { + System.out.println(string); + } + } + + public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException { + Class clazz = InvokeTest.class; + String[] s = new String[]{"Hello","World"}; + // test: 方法名 + // String[].class: test方法的形参类型 + Method method = clazz.getMethod("test", String[].class); + method.invoke(new InvokeTest(), (Object) s); + } +} diff --git a/javase/src/main/java/com/hongyi/test/Test.java b/javase/src/main/java/com/hongyi/test/Test.java new file mode 100644 index 0000000000000000000000000000000000000000..8d245140d1fd1746e1d9db1bb86f5d6ae7d8f390 --- /dev/null +++ b/javase/src/main/java/com/hongyi/test/Test.java @@ -0,0 +1,21 @@ +package com.hongyi.test; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; + +/** + * @Author Kisugi Takumi + * @Date 2023/6/20 16:38 + * @Version 1.0 + */ +public class Test { + public static void main(String[] args) { + ArrayList arrayList = new ArrayList(); + arrayList.add(123); + System.out.println(arrayList); + Map map = new HashMap<>(); + map.put(null, null); + System.out.println(map); + } +} diff --git a/ssm/ssm_demo/pom.xml b/ssm/ssm_demo/pom.xml new file mode 100644 index 0000000000000000000000000000000000000000..d224e4df60a35fd879cc8cb7f05383b89fc56fe6 --- /dev/null +++ b/ssm/ssm_demo/pom.xml @@ -0,0 +1,99 @@ + + + + 4.0.0 + + com.hongyi + ssm_demo + 1.0-SNAPSHOT + war + + + UTF-8 + 1.7 + 1.7 + + + + + org.projectlombok + lombok + 1.18.22 + + + org.springframework + spring-webmvc + 5.2.10.RELEASE + + + + org.springframework + spring-jdbc + 5.2.10.RELEASE + + + + org.springframework + spring-test + 5.2.10.RELEASE + + + + org.mybatis + mybatis + 3.5.6 + + + + org.mybatis + mybatis-spring + 1.3.0 + + + + mysql + mysql-connector-java + 5.1.47 + + + + com.alibaba + druid + 1.1.16 + + + + javax.servlet + javax.servlet-api + 3.1.0 + + + + com.fasterxml.jackson.core + jackson-databind + 2.9.10 + + + + junit + junit + 4.11 + test + + + + + + + org.apache.tomcat.maven + tomcat7-maven-plugin + 2.1 + + 80 + / + + + + + diff --git a/ssm/ssm_demo/src/main/java/com/hongyi/config/JdbcConfig.java b/ssm/ssm_demo/src/main/java/com/hongyi/config/JdbcConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..a96baf5f77ff4e20c9157777c106567d1a9e8bdf --- /dev/null +++ b/ssm/ssm_demo/src/main/java/com/hongyi/config/JdbcConfig.java @@ -0,0 +1,37 @@ +package com.hongyi.config; + +import com.alibaba.druid.pool.DruidDataSource; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; + +import javax.sql.DataSource; + +/** + * @Author Kisugi Takumi + * @Date 2023/6/24 13:56 + * @Version 1.0 + */ + +public class JdbcConfig { + @Value("${jdbc.driver}") + private String driver; + + @Value("${jdbc.url}") + private String url; + + @Value("${jdbc.username}") + private String username; + + @Value("${jdbc.password}") + private String password; + + @Bean + public DataSource dataSource() { + DruidDataSource dataSource = new DruidDataSource(); + dataSource.setDriverClassName(driver); + dataSource.setUrl(url); + dataSource.setUsername(username); + dataSource.setPassword(password); + return dataSource; + } +} diff --git a/ssm/ssm_demo/src/main/java/com/hongyi/config/MybatisConfig.java b/ssm/ssm_demo/src/main/java/com/hongyi/config/MybatisConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..009cb4ef7b821f7099e09fbe10bd1819b8cd1b98 --- /dev/null +++ b/ssm/ssm_demo/src/main/java/com/hongyi/config/MybatisConfig.java @@ -0,0 +1,31 @@ +package com.hongyi.config; + +import org.mybatis.spring.SqlSessionFactoryBean; +import org.mybatis.spring.mapper.MapperScannerConfigurer; +import org.springframework.context.annotation.Bean; + +import javax.sql.DataSource; + +/** + * @Author Kisugi Takumi + * @Date 2023/6/24 13:56 + * @Version 1.0 + */ +public class MybatisConfig { + + @Bean + public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource) { + SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean(); + // 设置数据源 + factoryBean.setDataSource(dataSource); + factoryBean.setTypeAliasesPackage("com.hongyi.domain"); + return factoryBean; + } + + @Bean + public MapperScannerConfigurer mapperScannerConfigurer() { + MapperScannerConfigurer msc = new MapperScannerConfigurer(); + msc.setBasePackage("com.hongyi.dao"); + return msc; + } +} diff --git a/ssm/ssm_demo/src/main/java/com/hongyi/config/ServletConfig.java b/ssm/ssm_demo/src/main/java/com/hongyi/config/ServletConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..97b425bd03b1b545fd3825151799fa52d96389b3 --- /dev/null +++ b/ssm/ssm_demo/src/main/java/com/hongyi/config/ServletConfig.java @@ -0,0 +1,25 @@ +package com.hongyi.config; + +import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; + +/** + * @Author Kisugi Takumi + * @Date 2023/6/24 14:13 + * @Version 1.0 + */ +public class ServletConfig extends AbstractAnnotationConfigDispatcherServletInitializer { + @Override + protected Class[] getRootConfigClasses() { + return new Class[]{SpringConfig.class}; + } + + @Override + protected Class[] getServletConfigClasses() { + return new Class[]{SpringMvcConfig.class}; + } + + @Override + protected String[] getServletMappings() { + return new String[]{"/"}; + } +} diff --git a/ssm/ssm_demo/src/main/java/com/hongyi/config/SpringConfig.java b/ssm/ssm_demo/src/main/java/com/hongyi/config/SpringConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..242d87377f32ccde7d90ccfd5cbf8d1ee9179d36 --- /dev/null +++ b/ssm/ssm_demo/src/main/java/com/hongyi/config/SpringConfig.java @@ -0,0 +1,19 @@ +package com.hongyi.config; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.context.annotation.PropertySource; + +/** + * @Author Kisugi Takumi + * @Date 2023/6/24 13:55 + * @Version 1.0 + */ +@Configuration +@ComponentScan({"com.hongyi.service"}) +@PropertySource("jdbc.properties") +@Import({JdbcConfig.class, MybatisConfig.class}) +public class SpringConfig { + +} diff --git a/ssm/ssm_demo/src/main/java/com/hongyi/config/SpringMvcConfig.java b/ssm/ssm_demo/src/main/java/com/hongyi/config/SpringMvcConfig.java new file mode 100644 index 0000000000000000000000000000000000000000..8221b93ba7bb722e25e04eeb5b439e879c6d651d --- /dev/null +++ b/ssm/ssm_demo/src/main/java/com/hongyi/config/SpringMvcConfig.java @@ -0,0 +1,17 @@ +package com.hongyi.config; + +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; + +/** + * @Author Kisugi Takumi + * @Date 2023/6/24 14:14 + * @Version 1.0 + */ +@Configuration +@ComponentScan("com.hongyi.controller") +@EnableWebMvc +public class SpringMvcConfig { + +} diff --git a/ssm/ssm_demo/src/main/java/com/hongyi/controller/BookController.java b/ssm/ssm_demo/src/main/java/com/hongyi/controller/BookController.java new file mode 100644 index 0000000000000000000000000000000000000000..7f3489b23dd91faaba0bc829c0341b6aef2136cc --- /dev/null +++ b/ssm/ssm_demo/src/main/java/com/hongyi/controller/BookController.java @@ -0,0 +1,45 @@ +package com.hongyi.controller; + +import com.hongyi.domain.Book; +import com.hongyi.service.BookService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +/** + * @Author Kisugi Takumi + * @Date 2023/6/24 15:05 + * @Version 1.0 + */ +@RestController +@RequestMapping("/books") +public class BookController { + @Autowired + private BookService bookService; + + @PostMapping + public boolean save(@RequestBody Book book) { + return bookService.save(book); + } + + @PutMapping + public boolean update(@RequestBody Book book) { + return bookService.update(book); + } + + @DeleteMapping("/{id}") + public boolean delete(@PathVariable Integer id) { + return bookService.delete(id); + } + + @GetMapping("/{id}") + public Book getById(@PathVariable Integer id) { + return bookService.getById(id); + } + + @GetMapping + public List getAll() { + return bookService.getAll(); + } +} diff --git a/ssm/ssm_demo/src/main/java/com/hongyi/dao/BookDao.java b/ssm/ssm_demo/src/main/java/com/hongyi/dao/BookDao.java new file mode 100644 index 0000000000000000000000000000000000000000..a0906ad613f2582bad609b79b535a6e6f41b684c --- /dev/null +++ b/ssm/ssm_demo/src/main/java/com/hongyi/dao/BookDao.java @@ -0,0 +1,33 @@ +package com.hongyi.dao; + +import com.hongyi.domain.Book; +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; +import org.springframework.stereotype.Repository; + +import java.util.List; + +/** + * @Author Kisugi Takumi + * @Date 2023/6/24 15:04 + * @Version 1.0 + */ +@Repository +public interface BookDao { + @Insert("INSERT INTO tbl_book VALUES (null, #{type}, #{name}, #{description})") + public void save(Book book); + + @Update("UPDATE tbl_book SET type=#{type}, name=#{name}, description=#{description} WHERE id=#{id}") + public void update(Book book); + + @Delete("DELETE FROM tbl_book WHERE id=#{id}") + public void delete(Integer id); + + @Select("SELECT * FROM tbl_book WHERE id=#{id}") + public Book getById(Integer id); + + @Select("SELECT * FROM tbl_book") + public List getAll(); +} diff --git a/ssm/ssm_demo/src/main/java/com/hongyi/domain/Book.java b/ssm/ssm_demo/src/main/java/com/hongyi/domain/Book.java new file mode 100644 index 0000000000000000000000000000000000000000..8cd4ecede78640bbefaaf0f21fc414ae59a4bb02 --- /dev/null +++ b/ssm/ssm_demo/src/main/java/com/hongyi/domain/Book.java @@ -0,0 +1,18 @@ +package com.hongyi.domain; + +import lombok.Data; +import lombok.ToString; + +/** + * @Author Kisugi Takumi + * @Date 2023/6/24 15:02 + * @Version 1.0 + */ +@Data +@ToString +public class Book { + private Integer id; + private String type; + private String name; + private String description; +} diff --git a/ssm/ssm_demo/src/main/java/com/hongyi/service/BookService.java b/ssm/ssm_demo/src/main/java/com/hongyi/service/BookService.java new file mode 100644 index 0000000000000000000000000000000000000000..733be1eac528cd2a0b5192b1d995816e362bfecb --- /dev/null +++ b/ssm/ssm_demo/src/main/java/com/hongyi/service/BookService.java @@ -0,0 +1,28 @@ +package com.hongyi.service; + +import com.hongyi.domain.Book; +import org.apache.ibatis.annotations.Delete; +import org.apache.ibatis.annotations.Insert; +import org.apache.ibatis.annotations.Select; +import org.apache.ibatis.annotations.Update; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * @Author Kisugi Takumi + * @Date 2023/6/24 15:04 + * @Version 1.0 + */ +@Service +public interface BookService { + public boolean save(Book book); + + public boolean update(Book book); + + public boolean delete(Integer id); + + public Book getById(Integer id); + + public List getAll(); +} diff --git a/ssm/ssm_demo/src/main/java/com/hongyi/service/impl/BookServiceImpl.java b/ssm/ssm_demo/src/main/java/com/hongyi/service/impl/BookServiceImpl.java new file mode 100644 index 0000000000000000000000000000000000000000..6d6883a962f0644430b6f7180f317d41cadf226b --- /dev/null +++ b/ssm/ssm_demo/src/main/java/com/hongyi/service/impl/BookServiceImpl.java @@ -0,0 +1,47 @@ +package com.hongyi.service.impl; + +import com.hongyi.dao.BookDao; +import com.hongyi.domain.Book; +import com.hongyi.service.BookService; +import org.springframework.beans.factory.annotation.Autowired; + +import java.util.List; + +/** + * @Author Kisugi Takumi + * @Date 2023/6/24 15:04 + * @Version 1.0 + */ +public class BookServiceImpl implements BookService { + + @Autowired + private BookDao bookDao; + + @Override + public boolean save(Book book) { + bookDao.save(book); + return true; + } + + @Override + public boolean update(Book book) { + bookDao.update(book); + return true; + } + + @Override + public boolean delete(Integer id) { + bookDao.delete(id); + return true; + } + + @Override + public Book getById(Integer id) { + return bookDao.getById(id); + } + + @Override + public List getAll() { + return bookDao.getAll(); + } +} diff --git a/ssm/ssm_demo/src/main/resources/jdbc.properties b/ssm/ssm_demo/src/main/resources/jdbc.properties new file mode 100644 index 0000000000000000000000000000000000000000..a9d42617247d5c7cb465456ffaa511348d3e1547 --- /dev/null +++ b/ssm/ssm_demo/src/main/resources/jdbc.properties @@ -0,0 +1,4 @@ +jdbc.driver=com.mysql.jdbc.Driver +jdbc.url=jdbc:mysql://localhost:3306/ssm_db +jdbc.username=root +jdbc.password=root \ No newline at end of file diff --git a/ssm/ssm_demo/src/main/webapp/WEB-INF/web.xml b/ssm/ssm_demo/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000000000000000000000000000000000000..9f88c1f9632445500e3b3688fe477b860f77d8f2 --- /dev/null +++ b/ssm/ssm_demo/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,7 @@ + + + + Archetype Created Web Application + diff --git a/ssm/ssm_demo/src/main/webapp/index.jsp b/ssm/ssm_demo/src/main/webapp/index.jsp new file mode 100644 index 0000000000000000000000000000000000000000..c38169bb958579c635a5c09ee2f379cc5956c0c2 --- /dev/null +++ b/ssm/ssm_demo/src/main/webapp/index.jsp @@ -0,0 +1,5 @@ + + +

Hello World!

+ +