From 01c25dd4349956d3eec1e87251c2751b51d40898 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=BD=97=E7=A5=A5?= <1366971433@qq.com> Date: Mon, 24 Dec 2018 17:41:04 +0800 Subject: [PATCH] spring+druid+mybatis samples --- README.md | 28 +- pictures/druid控制台.png | Bin 0 -> 42132 bytes .../spring-druid-mybatis-annotation/README.md | 488 ++++++++++++++++++ .../spring-druid-mybatis-annotation/pom.xml | 101 ++++ .../main/java/com/heibaiying/bean/Flow.java | 18 + .../java/com/heibaiying/bean/Relation.java | 16 + .../heibaiying/config/DataSourceConfig.java | 31 ++ .../config/DispatcherServletInitializer.java | 23 + .../com/heibaiying/config/ServletConfig.java | 119 +++++ .../config/druid/DruidStatFilter.java | 19 + .../config/druid/DruidStatViewServlet.java | 19 + .../controller/MysqlController.java | 24 + .../controller/OracleController.java | 24 + .../java/com/heibaiying/dao/MysqlDao.java | 17 + .../java/com/heibaiying/dao/OracleDao.java | 16 + .../src/main/resources/mappers/Flow.xml | 11 + .../src/main/resources/mappers/Relation.xml | 14 + .../src/main/resources/mybatisConfig.xml | 17 + .../src/main/resources/mysql.properties | 4 + .../src/main/resources/oracle.properties | 4 + spring/spring-druid-mybatis/README.md | 438 ++++++++++++++++ spring/spring-druid-mybatis/pom.xml | 101 ++++ .../main/java/com/heibaiying/bean/Flow.java | 18 + .../java/com/heibaiying/bean/Relation.java | 16 + .../controller/MysqlController.java | 27 + .../controller/OracleController.java | 24 + .../java/com/heibaiying/dao/MysqlDao.java | 14 + .../java/com/heibaiying/dao/OracleDao.java | 14 + .../src/main/resources/druid.xml | 57 ++ .../src/main/resources/jdbc.properties | 9 + .../src/main/resources/mappers/Flow.xml | 11 + .../src/main/resources/mappers/Relation.xml | 14 + .../src/main/resources/mybatisConfig.xml | 17 + .../src/main/resources/springApplication.xml | 48 ++ .../src/main/webapp/WEB-INF/web.xml | 64 +++ .../src/main/webapp/index.jsp | 9 + spring/spring-jdbc-annotation/README.md | 425 +++++++++++++++ .../com/heibaiying/config/ServletConfig.java | 4 +- spring/spring-jdbc/README.md | 384 ++++++++++++++ .../src/main/resources/springApplication.xml | 8 +- spring/spring-mybatis-annotation/README.md | 410 +++++++++++++++ .../java/com/heibaiying/dao/MysqlDao.java | 2 +- .../java/com/heibaiying/dao/OracleDao.java | 2 +- spring/spring-mybatis/README.md | 358 +++++++++++++ .../java/com/heibaiying/dao/MysqlDao.java | 4 +- .../java/com/heibaiying/dao/OracleDao.java | 4 +- .../src/main/resources/springApplication.xml | 1 + 47 files changed, 3447 insertions(+), 29 deletions(-) create mode 100644 pictures/druid控制台.png create mode 100644 spring/spring-druid-mybatis-annotation/README.md create mode 100644 spring/spring-druid-mybatis-annotation/pom.xml create mode 100644 spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/bean/Flow.java create mode 100644 spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/bean/Relation.java create mode 100644 spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/config/DataSourceConfig.java create mode 100644 spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/config/DispatcherServletInitializer.java create mode 100644 spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/config/ServletConfig.java create mode 100644 spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/config/druid/DruidStatFilter.java create mode 100644 spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/config/druid/DruidStatViewServlet.java create mode 100644 spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/controller/MysqlController.java create mode 100644 spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/controller/OracleController.java create mode 100644 spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/dao/MysqlDao.java create mode 100644 spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/dao/OracleDao.java create mode 100644 spring/spring-druid-mybatis-annotation/src/main/resources/mappers/Flow.xml create mode 100644 spring/spring-druid-mybatis-annotation/src/main/resources/mappers/Relation.xml create mode 100644 spring/spring-druid-mybatis-annotation/src/main/resources/mybatisConfig.xml create mode 100644 spring/spring-druid-mybatis-annotation/src/main/resources/mysql.properties create mode 100644 spring/spring-druid-mybatis-annotation/src/main/resources/oracle.properties create mode 100644 spring/spring-druid-mybatis/README.md create mode 100644 spring/spring-druid-mybatis/pom.xml create mode 100644 spring/spring-druid-mybatis/src/main/java/com/heibaiying/bean/Flow.java create mode 100644 spring/spring-druid-mybatis/src/main/java/com/heibaiying/bean/Relation.java create mode 100644 spring/spring-druid-mybatis/src/main/java/com/heibaiying/controller/MysqlController.java create mode 100644 spring/spring-druid-mybatis/src/main/java/com/heibaiying/controller/OracleController.java create mode 100644 spring/spring-druid-mybatis/src/main/java/com/heibaiying/dao/MysqlDao.java create mode 100644 spring/spring-druid-mybatis/src/main/java/com/heibaiying/dao/OracleDao.java create mode 100644 spring/spring-druid-mybatis/src/main/resources/druid.xml create mode 100644 spring/spring-druid-mybatis/src/main/resources/jdbc.properties create mode 100644 spring/spring-druid-mybatis/src/main/resources/mappers/Flow.xml create mode 100644 spring/spring-druid-mybatis/src/main/resources/mappers/Relation.xml create mode 100644 spring/spring-druid-mybatis/src/main/resources/mybatisConfig.xml create mode 100644 spring/spring-druid-mybatis/src/main/resources/springApplication.xml create mode 100644 spring/spring-druid-mybatis/src/main/webapp/WEB-INF/web.xml create mode 100644 spring/spring-druid-mybatis/src/main/webapp/index.jsp create mode 100644 spring/spring-jdbc-annotation/README.md create mode 100644 spring/spring-jdbc/README.md create mode 100644 spring/spring-mybatis-annotation/README.md create mode 100644 spring/spring-mybatis/README.md diff --git a/README.md b/README.md index 965a7fe..336389d 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Spring-All-In-One +# Spring-Samples-For-All 该仓库提供spring、spring-boot、spirng-cloud 的常用samples。每个用例都提供详细的注释和搭建说明(详见每个sample项目根目录README.md),旨在总结自己工作和学习的结果,也为广大的Java学习和爱好者提供参考。另外因为samples 并不能涵盖该知识点的所有内容,所以每个sample我都会附上本部分内容官方文档的链接作为参考。 @@ -27,19 +27,19 @@ spring-cloud:Finchley.SR2 | samples | 描述 | 官方文档 | | ------------------------------------------------------------ | ------------------------------------------------------------ | ------------------------------------------------------------ | -| [springmvc-base](https://github.com/heibaiying/Spring-All-In-One/tree/master/spring/springmvc-base)
[springmvc-base-annotation](https://github.com/heibaiying/Spring-All-In-One/tree/master/spring/springmvc-base-annotation) | springmvc基础、参数绑定、参数转换、数据校验、
全局异常处理、 文件上传下载、jsp视图 | [spring mvc ](https://docs.spring.io/spring/docs/5.1.3.RELEASE/spring-framework-reference/web.html#mvc) | -| [spring-jdbc](https://github.com/heibaiying/Spring-All-In-One/tree/master/spring/spring-jdbc)
[spring-jdbc-annotation](https://github.com/heibaiying/Spring-All-In-One/tree/master/spring/spring-jdbc-annotation) | spring jdbc-template 的使用 | [Using JdbcTemplat](https://docs.spring.io/spring/docs/5.1.3.RELEASE/spring-framework-reference/data-access.html#jdbc-JdbcTemplate) | -| [spring-mybatis](https://github.com/heibaiying/Spring-All-In-One/tree/master/spring/spring-mybatis)
[spring-mybatis-annotation](https://github.com/heibaiying/Spring-All-In-One/tree/master/spring/mybatis-annotation) | spring 整合 mybatis | [mybatis-spring中文文档](http://www.mybatis.org/spring/zh/index.html) | -| spring-druid-mybtais
spring-druid-mybtais-annotation | spring 整合druid、mybatis | | -| spring-druid-redis
spring-druid-redis-annotation | spring 整合 redis | | -| spring-druid-mongodb
spring-druid-mongodb-annotation | spring 整合 mongodb | | -| spring-druid-memcached
spring-druid-memcached-annotation | spring 整合 memcached | | -| spring-druid-rabbitmq
spring-druid-rabbitmq-annotation | spring 整合 rabbitmq | | -| spring-druid-kafka
spring-druid-kafka-annotation | spring 整合 kafka | | -| spring-druid-dubbo
spring-druid-dubbo-annotation | spring 整合 dubbo | | -| spring-druid-websocket
spring-druid-websocket-annotation | spring 整合 websocket | | -| spring-druid-netty
spring-druid-netty-annotation | spring 整合 netty | | -| spring-druid-scheduled
spring-druid-scheduled-annotation | spring 定时任务 | | +| [springmvc-base](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring/springmvc-base)
[springmvc-base-annotation](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring/springmvc-base-annotation) | springmvc基础、参数绑定、参数转换、数据校验、
全局异常处理、 文件上传下载、jsp视图 | [spring mvc ](https://docs.spring.io/spring/docs/5.1.3.RELEASE/spring-framework-reference/web.html#mvc) | +| [spring-jdbc](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring/spring-jdbc)
[spring-jdbc-annotation](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring/spring-jdbc-annotation) | spring jdbc-template 的使用 | [Using JdbcTemplat](https://docs.spring.io/spring/docs/5.1.3.RELEASE/spring-framework-reference/data-access.html#jdbc-JdbcTemplate) | +| [spring-mybatis](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring/spring-mybatis)
[spring-mybatis-annotation](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring/mybatis-annotation) | spring 整合 mybatis | [mybatis-spring中文文档](http://www.mybatis.org/spring/zh/index.html) | +| [spring-druid-mybatis](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring/spring-druid-mybatis)
[spring-druid-mybatis-annotation](https://github.com/heibaiying/spring-samples-for-all/tree/master/spring/spring-druid-mybatis-annotation) | spring 整合druid、mybatis | [alibaba druid](https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98) | +| spring-redis
spring-redis-annotation | spring 整合 redis | | +| spring-mongodb
spring-mongodb-annotation | spring 整合 mongodb | | +| spring-memcached
spring-memcached-annotation | spring 整合 memcached | | +| spring-rabbitmq
spring-rabbitmq-annotation | spring 整合 rabbitmq | | +| spring-kafka
spring-kafka-annotation | spring 整合 kafka | | +| spring-dubbo
spring-dubbo-annotation | spring 整合 dubbo | | +| spring-websocket
spring-websocket-annotation | spring 整合 websocket | | +| spring-netty
spring-netty-annotation | spring 整合 netty | | +| spring-scheduled
spring-scheduled-annotation | spring 定时任务 | |
diff --git a/pictures/druid控制台.png b/pictures/druid控制台.png new file mode 100644 index 0000000000000000000000000000000000000000..5f0a7e4fb5e1279eab314c647c2410a49dc277a6 GIT binary patch literal 42132 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 literal 0 HcmV?d00001 diff --git a/spring/spring-druid-mybatis-annotation/README.md b/spring/spring-druid-mybatis-annotation/README.md new file mode 100644 index 0000000..070582f --- /dev/null +++ b/spring/spring-druid-mybatis-annotation/README.md @@ -0,0 +1,488 @@ +# spring +druid+ mybatis(注解配置方式) + +1、创建标准web maven工程,导入依赖 + +```xml + + + 4.0.0 + + com.heibaiying + spring-jdbc + 1.0-SNAPSHOT + + 5.1.3.RELEASE + + + + + + org.springframework + spring-context + ${spring-base-version} + + + org.springframework + spring-beans + ${spring-base-version} + + + org.springframework + spring-core + ${spring-base-version} + + + org.springframework + spring-web + ${spring-base-version} + + + org.springframework + spring-webmvc + ${spring-base-version} + + + javax.servlet + javax.servlet-api + 4.0.1 + provided + + + org.projectlombok + lombok + 1.18.4 + provided + + + + org.springframework + spring-jdbc + ${spring-base-version} + + + mysql + mysql-connector-java + 8.0.13 + + + + junit + junit + 4.12 + test + + + org.springframework + spring-test + ${spring-base-version} + test + + + com.oracle + ojdbc6 + 11.2.0.3.0 + + + + org.mybatis + mybatis-spring + 1.3.2 + + + org.mybatis + mybatis + 3.4.6 + + + + com.alibaba + druid + 1.1.12 + + + + +``` + +2、新建 DispatcherServletInitializer.java继承自AbstractAnnotationConfigDispatcherServletInitializer,等价于我们在web.xml中配置的前端控制器 + +```java +public class DispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { + + protected Class[] getRootConfigClasses() { + return new Class[0]; + } + + protected Class[] getServletConfigClasses() { + return new Class[]{ServletConfig.class}; + } + + protected String[] getServletMappings() { + return new String[]{"/"}; + } +} +``` + +3、基础servlet 3.0的支持,可以采用注解的方式注册druid的servlet和filter + +​ 注:关于servlet 注解支持可以查看[Servlet 规范文档](https://github.com/heibaiying/spring-samples-for-all/blob/master/referenced%20documents/Servlet3.1%E8%A7%84%E8%8C%83%EF%BC%88%E6%9C%80%E7%BB%88%E7%89%88%EF%BC%89.pdf)中**8.1小节 注解和可插拔性** + +```java +package com.heibaiying.config.druid; + +import com.alibaba.druid.support.http.StatViewServlet; + +import javax.servlet.annotation.WebInitParam; +import javax.servlet.annotation.WebServlet; + +/** + * @author : heibaiying + * @description : 配置监控页面用户名密码 + */ +@WebServlet(urlPatterns = "/druid/*", + initParams={ + @WebInitParam(name="resetEnable",value="true"), + @WebInitParam(name="loginUsername",value="druid"), + @WebInitParam(name="loginPassword",value="druid") + }) +public class DruidStatViewServlet extends StatViewServlet { +} + +``` + +```java +package com.heibaiying.config.druid; + +import com.alibaba.druid.support.http.WebStatFilter; + +import javax.servlet.annotation.WebFilter; +import javax.servlet.annotation.WebInitParam; + +/** + * @author : heibaiying + * @description : WebStatFilter用于采集web-jdbc关联监控的数据 + */ +@WebFilter(filterName="druidWebStatFilter",urlPatterns="/*", + initParams={ + @WebInitParam(name="exclusions",value="*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*")// 忽略资源 + } +) +public class DruidStatFilter extends WebStatFilter { + +} + +``` + +4、在resources文件夹下新建数据库配置文件mysql.properties、oracle.properties + +```properties +# mysql 数据库配置 +mysql.driverClassName=com.mysql.jdbc.Driver +mysql.url=jdbc:mysql://localhost:3306/mysql +mysql.username=root +mysql.password=root +``` + +```properties +# oracle 数据库配置 +oracle.driverClassName=oracle.jdbc.driver.OracleDriver +oracle.url=jdbc:oracle:thin:@//IP地址:端口号/数据库实例名 +oracle.username=用户名 +oracle.password=密码 +``` + +5、在新建数据库配置映射类DataSourceConfig.java + +```java +package com.heibaiying.config; + +import lombok.Data; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; + +/** + * @author : heibaiying + * @description : + */ + +@Configuration +@PropertySource(value = "classpath:mysql.properties") +@Data +public class DataSourceConfig { + + @Value("${mysql.driverClassName}") + private String driverClassName; + @Value("${mysql.url}") + private String url; + @Value("${mysql.username}") + private String username; + @Value("${mysql.password}") + private String password; + +} + +``` + +6、新建ServletConfig.java,进行数据库相关配置 + +```java +package com.heibaiying.config; + +import com.alibaba.druid.pool.DruidDataSource; +import org.mybatis.spring.SqlSessionFactoryBean; +import org.mybatis.spring.mapper.MapperScannerConfigurer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.jdbc.datasource.DataSourceTransactionManager; +import org.springframework.transaction.annotation.EnableTransactionManagement; +import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import java.io.IOException; +import java.sql.SQLException; + +; + + +/** + * @author : heibaiying + */ +@Configuration +@EnableTransactionManagement // 开启声明式事务处理 等价于xml中 +@EnableWebMvc +@ComponentScan(basePackages = {"com.heibaiying.*"}) +public class ServletConfig implements WebMvcConfigurer { + + /** + * 配置静态资源处理器 + */ + public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { + configurer.enable(); + } + + /** + * 配置druid 数据源 + */ + @Bean + public DruidDataSource dataSource(DataSourceConfig sourceConfig) throws SQLException { + DruidDataSource dataSource = new DruidDataSource(); + dataSource.setUrl(sourceConfig.getUrl()); + dataSource.setUsername(sourceConfig.getUsername()); + dataSource.setPassword(sourceConfig.getPassword()); + + // 配置获取连接等待超时的时间 + dataSource.setMaxWait(60000); + + // 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + dataSource.setTimeBetweenEvictionRunsMillis(2000); + + // 配置一个连接在池中最小生存的时间,单位是毫秒 + dataSource.setMinEvictableIdleTimeMillis(600000); + dataSource.setMaxEvictableIdleTimeMillis(900000); + + /* validationQuery 用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。 + * 但是在 oracle 数据库下需要写成 select 'x' from dual 不然实例化数据源的时候就会失败, + * 这是由于oracle 和 mysql 语法间的差异造成的 + */ + dataSource.setValidationQuery("select 'x'"); + + // 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 + dataSource.setTestWhileIdle(true); + // 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 + dataSource.setTestOnBorrow(false); + // 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能 + dataSource.setTestOnReturn(false); + + // 连接池中的minIdle数量以内的连接,空闲时间超过minEvictableIdleTimeMillis,则会执行keepAlive操作。 + dataSource.setPhyMaxUseCount(100000); + + /*配置监控统计拦截的filters Druid连接池的监控信息主要是通过StatFilter 采集的, + 采集的信息非常全面,包括SQL执行、并发、慢查、执行时间区间分布等*/ + dataSource.setFilters("stat"); + + return dataSource; + } + + + /** + * 配置mybatis 会话工厂 + * + * @param dataSource 这个参数的名称需要保持和上面方法名一致 才能自动注入,因为 + * 采用@Bean注解生成的bean 默认采用方法名为名称,当然也可以在使用@Bean时指定name属性 + */ + @Bean + public SqlSessionFactoryBean sessionFactoryBean(DruidDataSource dataSource) throws IOException { + SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean(); + sessionFactoryBean.setDataSource(dataSource); + PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); + sessionFactoryBean.setMapperLocations(resolver.getResources("classpath*:/mappers/**/*.xml")); + sessionFactoryBean.setConfigLocation(resolver.getResource("classpath:mybatisConfig.xml")); + return sessionFactoryBean; + } + + /** + * 配置mybatis 会话工厂 + */ + @Bean + public MapperScannerConfigurer MapperScannerConfigurer() { + MapperScannerConfigurer configurer = new MapperScannerConfigurer(); + configurer.setSqlSessionFactoryBeanName("sessionFactoryBean"); + configurer.setBasePackage("com.heibaiying.dao"); + return configurer; + } + + /** + * 定义事务管理器 + */ + @Bean + public DataSourceTransactionManager transactionManager(DruidDataSource dataSource) { + DataSourceTransactionManager manager = new DataSourceTransactionManager(); + manager.setDataSource(dataSource); + return manager; + } + +} + +``` + +7、新建mybtais 配置文件 更多settings配置项可以参考[官方文档](http://www.mybatis.org/mybatis-3/zh/configuration.html) + +```xml + + + + + + + + + + + + + + + + +``` + +8、新建查询接口及其对应的mapper文件 + +```java +public interface MysqlDao { + + List get(); +} +``` + +```xml + + + + + + + +``` + +```mysql +public interface OracleDao { + + List queryById(long id); +} + +``` + +```xml + + + + + + + +``` + +9.新建测试controller进行测试 + +```java +package com.heibaiying.controller; + +import com.heibaiying.bean.Relation; +import com.heibaiying.dao.MysqlDao; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * @author : heibaiying + * @description : + */ + +@RestController +public class MysqlController { + + @Autowired + private MysqlDao mysqlDao; + + @GetMapping("relation/{id}") + public String get(@PathVariable(name = "id") String id) { + return mysqlDao.queryById(id).get(0).toString(); + } +} + +``` + +```java +package com.heibaiying.controller; + +import com.heibaiying.dao.OracleDao; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author : heibaiying + * @description : + */ + +@RestController +public class OracleController { + + @Autowired + private OracleDao oracleDao; + + @GetMapping("flow/{id}") + public String get(@PathVariable(name = "id") Long id) { + return oracleDao.queryById(id).get(0).toString(); + } +} + +``` + +10、druid 监控页面访问地址http://localhost:8080/druid/index.html + +![druid控制台](D:\spring-samples-for-all\pictures\druid控制台.png) + diff --git a/spring/spring-druid-mybatis-annotation/pom.xml b/spring/spring-druid-mybatis-annotation/pom.xml new file mode 100644 index 0000000..1d4f41b --- /dev/null +++ b/spring/spring-druid-mybatis-annotation/pom.xml @@ -0,0 +1,101 @@ + + + 4.0.0 + + com.heibaiying + spring-jdbc + 1.0-SNAPSHOT + + 5.1.3.RELEASE + + + + + + org.springframework + spring-context + ${spring-base-version} + + + org.springframework + spring-beans + ${spring-base-version} + + + org.springframework + spring-core + ${spring-base-version} + + + org.springframework + spring-web + ${spring-base-version} + + + org.springframework + spring-webmvc + ${spring-base-version} + + + javax.servlet + javax.servlet-api + 4.0.1 + provided + + + org.projectlombok + lombok + 1.18.4 + provided + + + + org.springframework + spring-jdbc + ${spring-base-version} + + + mysql + mysql-connector-java + 8.0.13 + + + + junit + junit + 4.12 + test + + + org.springframework + spring-test + ${spring-base-version} + test + + + com.oracle + ojdbc6 + 11.2.0.3.0 + + + + org.mybatis + mybatis-spring + 1.3.2 + + + org.mybatis + mybatis + 3.4.6 + + + + com.alibaba + druid + 1.1.12 + + + + \ No newline at end of file diff --git a/spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/bean/Flow.java b/spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/bean/Flow.java new file mode 100644 index 0000000..cdebadf --- /dev/null +++ b/spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/bean/Flow.java @@ -0,0 +1,18 @@ +package com.heibaiying.bean; + +import lombok.Data; + +/** + * @author : heibaiying + * @description : + */ + +@Data +public class Flow { + + private long id; + + private long flowId; + + private long plugId; +} diff --git a/spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/bean/Relation.java b/spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/bean/Relation.java new file mode 100644 index 0000000..74adb91 --- /dev/null +++ b/spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/bean/Relation.java @@ -0,0 +1,16 @@ +package com.heibaiying.bean; + +import lombok.Data; + +/** + * @author : heibaiying + * @description : + */ +@Data +public class Relation { + + private String id; + + private String name; + +} diff --git a/spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/config/DataSourceConfig.java b/spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/config/DataSourceConfig.java new file mode 100644 index 0000000..51dd508 --- /dev/null +++ b/spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/config/DataSourceConfig.java @@ -0,0 +1,31 @@ +package com.heibaiying.config; + +import lombok.Data; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; + +/** + * @author : heibaiying + * @description : + */ + +@Configuration +@PropertySource(value = "classpath:mysql.properties") +@Data +public class DataSourceConfig { + + /** + * 感觉这种注入的方式并不够好 + * 没有spring-boot中使用@ConfigurationProperties(prefix = "config")指定前缀注入的方式优雅 + */ + @Value("${mysql.driverClassName}") + private String driverClassName; + @Value("${mysql.url}") + private String url; + @Value("${mysql.username}") + private String username; + @Value("${mysql.password}") + private String password; + +} diff --git a/spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/config/DispatcherServletInitializer.java b/spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/config/DispatcherServletInitializer.java new file mode 100644 index 0000000..fb2f8b7 --- /dev/null +++ b/spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/config/DispatcherServletInitializer.java @@ -0,0 +1,23 @@ +package com.heibaiying.config; + +import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer; + +/** + * @author : heibaiying + */ + +public class DispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { + + protected Class[] getRootConfigClasses() { + return new Class[0]; + } + + protected Class[] getServletConfigClasses() { + return new Class[]{ServletConfig.class}; + } + + protected String[] getServletMappings() { + return new String[]{"/"}; + } + +} diff --git a/spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/config/ServletConfig.java b/spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/config/ServletConfig.java new file mode 100644 index 0000000..39ad5fa --- /dev/null +++ b/spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/config/ServletConfig.java @@ -0,0 +1,119 @@ +package com.heibaiying.config; + +import com.alibaba.druid.pool.DruidDataSource; +import org.mybatis.spring.SqlSessionFactoryBean; +import org.mybatis.spring.mapper.MapperScannerConfigurer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.jdbc.datasource.DataSourceTransactionManager; +import org.springframework.transaction.annotation.EnableTransactionManagement; +import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer; +import org.springframework.web.servlet.config.annotation.EnableWebMvc; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import java.io.IOException; +import java.sql.SQLException; + +; + + +/** + * @author : heibaiying + */ +@Configuration +@EnableTransactionManagement // 开启声明式事务处理 等价于xml中 +@EnableWebMvc +@ComponentScan(basePackages = {"com.heibaiying.*"}) +public class ServletConfig implements WebMvcConfigurer { + + /** + * 配置静态资源处理器 + */ + public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) { + configurer.enable(); + } + + /** + * 配置druid 数据源 + */ + @Bean + public DruidDataSource dataSource(DataSourceConfig sourceConfig) throws SQLException { + DruidDataSource dataSource = new DruidDataSource(); + dataSource.setUrl(sourceConfig.getUrl()); + dataSource.setUsername(sourceConfig.getUsername()); + dataSource.setPassword(sourceConfig.getPassword()); + + // 配置获取连接等待超时的时间 + dataSource.setMaxWait(60000); + + // 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 + dataSource.setTimeBetweenEvictionRunsMillis(2000); + + // 配置一个连接在池中最小生存的时间,单位是毫秒 + dataSource.setMinEvictableIdleTimeMillis(600000); + dataSource.setMaxEvictableIdleTimeMillis(900000); + + /* validationQuery 用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。 + * 但是在 oracle 数据库下需要写成 select 'x' from dual 不然实例化数据源的时候就会失败, + * 这是由于oracle 和 mysql 语法间的差异造成的 + */ + dataSource.setValidationQuery("select 'x'"); + + // 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 + dataSource.setTestWhileIdle(true); + // 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 + dataSource.setTestOnBorrow(false); + // 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能 + dataSource.setTestOnReturn(false); + + // 连接池中的minIdle数量以内的连接,空闲时间超过minEvictableIdleTimeMillis,则会执行keepAlive操作。 + dataSource.setPhyMaxUseCount(100000); + + /*配置监控统计拦截的filters Druid连接池的监控信息主要是通过StatFilter 采集的, + 采集的信息非常全面,包括SQL执行、并发、慢查、执行时间区间分布等*/ + dataSource.setFilters("stat"); + + return dataSource; + } + + + /** + * 配置mybatis 会话工厂 + * + * @param dataSource 这个参数的名称需要保持和上面方法名一致 才能自动注入,因为 + * 采用@Bean注解生成的bean 默认采用方法名为名称,当然也可以在使用@Bean时指定name属性 + */ + @Bean + public SqlSessionFactoryBean sessionFactoryBean(DruidDataSource dataSource) throws IOException { + SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean(); + sessionFactoryBean.setDataSource(dataSource); + PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); + sessionFactoryBean.setMapperLocations(resolver.getResources("classpath*:/mappers/**/*.xml")); + sessionFactoryBean.setConfigLocation(resolver.getResource("classpath:mybatisConfig.xml")); + return sessionFactoryBean; + } + + /** + * 配置mybatis 会话工厂 + */ + @Bean + public MapperScannerConfigurer MapperScannerConfigurer() { + MapperScannerConfigurer configurer = new MapperScannerConfigurer(); + configurer.setSqlSessionFactoryBeanName("sessionFactoryBean"); + configurer.setBasePackage("com.heibaiying.dao"); + return configurer; + } + + /** + * 定义事务管理器 + */ + @Bean + public DataSourceTransactionManager transactionManager(DruidDataSource dataSource) { + DataSourceTransactionManager manager = new DataSourceTransactionManager(); + manager.setDataSource(dataSource); + return manager; + } + +} diff --git a/spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/config/druid/DruidStatFilter.java b/spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/config/druid/DruidStatFilter.java new file mode 100644 index 0000000..146440e --- /dev/null +++ b/spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/config/druid/DruidStatFilter.java @@ -0,0 +1,19 @@ +package com.heibaiying.config.druid; + +import com.alibaba.druid.support.http.WebStatFilter; + +import javax.servlet.annotation.WebFilter; +import javax.servlet.annotation.WebInitParam; + +/** + * @author : heibaiying + * @description : WebStatFilter用于采集web-jdbc关联监控的数据 + */ +@WebFilter(filterName="druidWebStatFilter",urlPatterns="/*", + initParams={ + @WebInitParam(name="exclusions",value="*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*")// 忽略资源 + } +) +public class DruidStatFilter extends WebStatFilter { + +} diff --git a/spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/config/druid/DruidStatViewServlet.java b/spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/config/druid/DruidStatViewServlet.java new file mode 100644 index 0000000..27d9451 --- /dev/null +++ b/spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/config/druid/DruidStatViewServlet.java @@ -0,0 +1,19 @@ +package com.heibaiying.config.druid; + +import com.alibaba.druid.support.http.StatViewServlet; + +import javax.servlet.annotation.WebInitParam; +import javax.servlet.annotation.WebServlet; + +/** + * @author : heibaiying + * @description : 配置监控页面用户名密码 + */ +@WebServlet(urlPatterns = "/druid/*", + initParams={ + @WebInitParam(name="resetEnable",value="true"), + @WebInitParam(name="loginUsername",value="druid"), + @WebInitParam(name="loginPassword",value="druid") + }) +public class DruidStatViewServlet extends StatViewServlet { +} diff --git a/spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/controller/MysqlController.java b/spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/controller/MysqlController.java new file mode 100644 index 0000000..079664d --- /dev/null +++ b/spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/controller/MysqlController.java @@ -0,0 +1,24 @@ +package com.heibaiying.controller; + +import com.heibaiying.dao.MysqlDao; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author : heibaiying + * @description : + */ + +@RestController +public class MysqlController { + + @Autowired + private MysqlDao mysqlDao; + + @GetMapping("relation/{id}") + public String get(@PathVariable(name = "id") String id) { + return mysqlDao.queryById(id).get(0).toString(); + } +} diff --git a/spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/controller/OracleController.java b/spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/controller/OracleController.java new file mode 100644 index 0000000..f3df7b7 --- /dev/null +++ b/spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/controller/OracleController.java @@ -0,0 +1,24 @@ +package com.heibaiying.controller; + +import com.heibaiying.dao.OracleDao; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author : heibaiying + * @description : + */ + +@RestController +public class OracleController { + + @Autowired + private OracleDao oracleDao; + + @GetMapping("flow/{id}") + public String get(@PathVariable(name = "id") Long id) { + return oracleDao.queryById(id).get(0).toString(); + } +} diff --git a/spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/dao/MysqlDao.java b/spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/dao/MysqlDao.java new file mode 100644 index 0000000..c89e188 --- /dev/null +++ b/spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/dao/MysqlDao.java @@ -0,0 +1,17 @@ +package com.heibaiying.dao; + +import com.heibaiying.bean.Relation; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * @author : heibaiying + * @description : + */ + +@Mapper +public interface MysqlDao { + + List queryById(String id); +} diff --git a/spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/dao/OracleDao.java b/spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/dao/OracleDao.java new file mode 100644 index 0000000..62cbff2 --- /dev/null +++ b/spring/spring-druid-mybatis-annotation/src/main/java/com/heibaiying/dao/OracleDao.java @@ -0,0 +1,16 @@ +package com.heibaiying.dao; + +import com.heibaiying.bean.Flow; +import org.apache.ibatis.annotations.Mapper; + +import java.util.List; + +/** + * @author : heibaiying + * @description : + */ +@Mapper +public interface OracleDao { + + List queryById(long id); +} diff --git a/spring/spring-druid-mybatis-annotation/src/main/resources/mappers/Flow.xml b/spring/spring-druid-mybatis-annotation/src/main/resources/mappers/Flow.xml new file mode 100644 index 0000000..b2f83a2 --- /dev/null +++ b/spring/spring-druid-mybatis-annotation/src/main/resources/mappers/Flow.xml @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/spring/spring-druid-mybatis-annotation/src/main/resources/mappers/Relation.xml b/spring/spring-druid-mybatis-annotation/src/main/resources/mappers/Relation.xml new file mode 100644 index 0000000..e882900 --- /dev/null +++ b/spring/spring-druid-mybatis-annotation/src/main/resources/mappers/Relation.xml @@ -0,0 +1,14 @@ + + + + + + + + \ No newline at end of file diff --git a/spring/spring-druid-mybatis-annotation/src/main/resources/mybatisConfig.xml b/spring/spring-druid-mybatis-annotation/src/main/resources/mybatisConfig.xml new file mode 100644 index 0000000..d60965c --- /dev/null +++ b/spring/spring-druid-mybatis-annotation/src/main/resources/mybatisConfig.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + diff --git a/spring/spring-druid-mybatis-annotation/src/main/resources/mysql.properties b/spring/spring-druid-mybatis-annotation/src/main/resources/mysql.properties new file mode 100644 index 0000000..e860927 --- /dev/null +++ b/spring/spring-druid-mybatis-annotation/src/main/resources/mysql.properties @@ -0,0 +1,4 @@ +# mysql ݿ +mysql.url=jdbc:mysql://localhost:3306/mysql +mysql.username=root +mysql.password=root diff --git a/spring/spring-druid-mybatis-annotation/src/main/resources/oracle.properties b/spring/spring-druid-mybatis-annotation/src/main/resources/oracle.properties new file mode 100644 index 0000000..f51ea9f --- /dev/null +++ b/spring/spring-druid-mybatis-annotation/src/main/resources/oracle.properties @@ -0,0 +1,4 @@ +# oracle ݿ +oracle.url=jdbc:oracle:thin:@//IPַ:˿ں/ݿʵ +oracle.username=û +oracle.password= \ No newline at end of file diff --git a/spring/spring-druid-mybatis/README.md b/spring/spring-druid-mybatis/README.md new file mode 100644 index 0000000..8b4acaf --- /dev/null +++ b/spring/spring-druid-mybatis/README.md @@ -0,0 +1,438 @@ +# spring +druid+ mybatis(xml配置方式) + +1、创建标准web maven工程,导入依赖 + +```xml + + + 4.0.0 + + com.heibaiying + spring-jdbc + 1.0-SNAPSHOT + + 5.1.3.RELEASE + + + + + + org.springframework + spring-context + ${spring-base-version} + + + org.springframework + spring-beans + ${spring-base-version} + + + org.springframework + spring-core + ${spring-base-version} + + + org.springframework + spring-web + ${spring-base-version} + + + org.springframework + spring-webmvc + ${spring-base-version} + + + javax.servlet + javax.servlet-api + 4.0.1 + provided + + + org.projectlombok + lombok + 1.18.4 + provided + + + + org.springframework + spring-jdbc + ${spring-base-version} + + + mysql + mysql-connector-java + 8.0.13 + + + + junit + junit + 4.12 + test + + + org.springframework + spring-test + ${spring-base-version} + test + + + com.oracle + ojdbc6 + 11.2.0.3.0 + + + + org.mybatis + mybatis-spring + 1.3.2 + + + org.mybatis + mybatis + 3.4.6 + + + + com.alibaba + druid + 1.1.12 + + + + +``` + +2、在web.xml 进行如下配置 + +```xml + + + + + + springMvc + org.springframework.web.servlet.DispatcherServlet + + contextConfigLocation + classpath:springApplication.xml + + 1 + + + + springMvc + / + + + + + DruidStatView + com.alibaba.druid.support.http.StatViewServlet + + + resetEnable + true + + + + loginUsername + druid + + + + loginPassword + druid + + + + DruidStatView + /druid/* + + + + + DruidWebStatFilter + com.alibaba.druid.support.http.WebStatFilter + + exclusions + *.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/* + + + + DruidWebStatFilter + /* + + + + +``` + +3、在resources文件夹下新建数据库配置文件jdbc.properties + +```properties +# mysql 数据库配置 +mysql.url=jdbc:mysql://localhost:3306/mysql +mysql.username=root +mysql.password=root + +# oracle 数据库配置 +oracle.url=jdbc:oracle:thin:@//IP地址:端口号/数据库实例名 +oracle.username=用户名 +oracle.password=密码 +``` + +4、在resources文件夹下创建springApplication.xml 配置文件和druid.xml配置文件 + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +5、新建mybtais 配置文件 更多settings配置项可以参考[官方文档](http://www.mybatis.org/mybatis-3/zh/configuration.html) + +```xml + + + + + + + + + + + + + + + + +``` + +6、新建查询接口及其对应的mapper文件 + +```java +public interface MysqlDao { + + List get(); +} +``` + +```xml + + + + + + + +``` + +```mysql +public interface OracleDao { + + List queryById(long id); +} + +``` + +```xml + + + + + + + +``` + +7.新建测试controller进行测试 + +```java +package com.heibaiying.controller; + +import com.heibaiying.bean.Relation; +import com.heibaiying.dao.MysqlDao; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * @author : heibaiying + * @description : + */ + +@RestController +public class MysqlController { + + @Autowired + private MysqlDao mysqlDao; + + @GetMapping("relation/{id}") + public String get(@PathVariable(name = "id") String id) { + return mysqlDao.queryById(id).get(0).toString(); + } +} + +``` + +```java +package com.heibaiying.controller; + +import com.heibaiying.dao.OracleDao; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author : heibaiying + * @description : + */ + +@RestController +public class OracleController { + + @Autowired + private OracleDao oracleDao; + + @GetMapping("flow/{id}") + public String get(@PathVariable(name = "id") Long id) { + return oracleDao.queryById(id).get(0).toString(); + } +} + +``` + +8、druid 监控页面访问地址http://localhost:8080/druid/index.html + +![druid控制台](D:\spring-samples-for-all\pictures\druid控制台.png) \ No newline at end of file diff --git a/spring/spring-druid-mybatis/pom.xml b/spring/spring-druid-mybatis/pom.xml new file mode 100644 index 0000000..1d4f41b --- /dev/null +++ b/spring/spring-druid-mybatis/pom.xml @@ -0,0 +1,101 @@ + + + 4.0.0 + + com.heibaiying + spring-jdbc + 1.0-SNAPSHOT + + 5.1.3.RELEASE + + + + + + org.springframework + spring-context + ${spring-base-version} + + + org.springframework + spring-beans + ${spring-base-version} + + + org.springframework + spring-core + ${spring-base-version} + + + org.springframework + spring-web + ${spring-base-version} + + + org.springframework + spring-webmvc + ${spring-base-version} + + + javax.servlet + javax.servlet-api + 4.0.1 + provided + + + org.projectlombok + lombok + 1.18.4 + provided + + + + org.springframework + spring-jdbc + ${spring-base-version} + + + mysql + mysql-connector-java + 8.0.13 + + + + junit + junit + 4.12 + test + + + org.springframework + spring-test + ${spring-base-version} + test + + + com.oracle + ojdbc6 + 11.2.0.3.0 + + + + org.mybatis + mybatis-spring + 1.3.2 + + + org.mybatis + mybatis + 3.4.6 + + + + com.alibaba + druid + 1.1.12 + + + + \ No newline at end of file diff --git a/spring/spring-druid-mybatis/src/main/java/com/heibaiying/bean/Flow.java b/spring/spring-druid-mybatis/src/main/java/com/heibaiying/bean/Flow.java new file mode 100644 index 0000000..cdebadf --- /dev/null +++ b/spring/spring-druid-mybatis/src/main/java/com/heibaiying/bean/Flow.java @@ -0,0 +1,18 @@ +package com.heibaiying.bean; + +import lombok.Data; + +/** + * @author : heibaiying + * @description : + */ + +@Data +public class Flow { + + private long id; + + private long flowId; + + private long plugId; +} diff --git a/spring/spring-druid-mybatis/src/main/java/com/heibaiying/bean/Relation.java b/spring/spring-druid-mybatis/src/main/java/com/heibaiying/bean/Relation.java new file mode 100644 index 0000000..74adb91 --- /dev/null +++ b/spring/spring-druid-mybatis/src/main/java/com/heibaiying/bean/Relation.java @@ -0,0 +1,16 @@ +package com.heibaiying.bean; + +import lombok.Data; + +/** + * @author : heibaiying + * @description : + */ +@Data +public class Relation { + + private String id; + + private String name; + +} diff --git a/spring/spring-druid-mybatis/src/main/java/com/heibaiying/controller/MysqlController.java b/spring/spring-druid-mybatis/src/main/java/com/heibaiying/controller/MysqlController.java new file mode 100644 index 0000000..a107a07 --- /dev/null +++ b/spring/spring-druid-mybatis/src/main/java/com/heibaiying/controller/MysqlController.java @@ -0,0 +1,27 @@ +package com.heibaiying.controller; + +import com.heibaiying.bean.Relation; +import com.heibaiying.dao.MysqlDao; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +import java.util.List; + +/** + * @author : heibaiying + * @description : + */ + +@RestController +public class MysqlController { + + @Autowired + private MysqlDao mysqlDao; + + @GetMapping("relation/{id}") + public String get(@PathVariable(name = "id") String id) { + return mysqlDao.queryById(id).get(0).toString(); + } +} diff --git a/spring/spring-druid-mybatis/src/main/java/com/heibaiying/controller/OracleController.java b/spring/spring-druid-mybatis/src/main/java/com/heibaiying/controller/OracleController.java new file mode 100644 index 0000000..f3df7b7 --- /dev/null +++ b/spring/spring-druid-mybatis/src/main/java/com/heibaiying/controller/OracleController.java @@ -0,0 +1,24 @@ +package com.heibaiying.controller; + +import com.heibaiying.dao.OracleDao; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.RestController; + +/** + * @author : heibaiying + * @description : + */ + +@RestController +public class OracleController { + + @Autowired + private OracleDao oracleDao; + + @GetMapping("flow/{id}") + public String get(@PathVariable(name = "id") Long id) { + return oracleDao.queryById(id).get(0).toString(); + } +} diff --git a/spring/spring-druid-mybatis/src/main/java/com/heibaiying/dao/MysqlDao.java b/spring/spring-druid-mybatis/src/main/java/com/heibaiying/dao/MysqlDao.java new file mode 100644 index 0000000..cba54bc --- /dev/null +++ b/spring/spring-druid-mybatis/src/main/java/com/heibaiying/dao/MysqlDao.java @@ -0,0 +1,14 @@ +package com.heibaiying.dao; + +import com.heibaiying.bean.Relation; + +import java.util.List; + +/** + * @author : heibaiying + * @description : + */ +public interface MysqlDao { + + List queryById(String id); +} diff --git a/spring/spring-druid-mybatis/src/main/java/com/heibaiying/dao/OracleDao.java b/spring/spring-druid-mybatis/src/main/java/com/heibaiying/dao/OracleDao.java new file mode 100644 index 0000000..c3b0d0b --- /dev/null +++ b/spring/spring-druid-mybatis/src/main/java/com/heibaiying/dao/OracleDao.java @@ -0,0 +1,14 @@ +package com.heibaiying.dao; + +import com.heibaiying.bean.Flow; + +import java.util.List; + +/** + * @author : heibaiying + * @description : + */ +public interface OracleDao { + + List queryById(long id); +} diff --git a/spring/spring-druid-mybatis/src/main/resources/druid.xml b/spring/spring-druid-mybatis/src/main/resources/druid.xml new file mode 100644 index 0000000..dd136ee --- /dev/null +++ b/spring/spring-druid-mybatis/src/main/resources/druid.xml @@ -0,0 +1,57 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring/spring-druid-mybatis/src/main/resources/jdbc.properties b/spring/spring-druid-mybatis/src/main/resources/jdbc.properties new file mode 100644 index 0000000..e633488 --- /dev/null +++ b/spring/spring-druid-mybatis/src/main/resources/jdbc.properties @@ -0,0 +1,9 @@ +# mysql ݿ +mysql.url=jdbc:mysql://localhost:3306/mysql +mysql.username=root +mysql.password=root + +# oracle ݿ +oracle.url=jdbc:oracle:thin:@//IPַ:˿ں/ݿʵ +oracle.username=û +oracle.password= \ No newline at end of file diff --git a/spring/spring-druid-mybatis/src/main/resources/mappers/Flow.xml b/spring/spring-druid-mybatis/src/main/resources/mappers/Flow.xml new file mode 100644 index 0000000..b2f83a2 --- /dev/null +++ b/spring/spring-druid-mybatis/src/main/resources/mappers/Flow.xml @@ -0,0 +1,11 @@ + + + + + + + \ No newline at end of file diff --git a/spring/spring-druid-mybatis/src/main/resources/mappers/Relation.xml b/spring/spring-druid-mybatis/src/main/resources/mappers/Relation.xml new file mode 100644 index 0000000..e882900 --- /dev/null +++ b/spring/spring-druid-mybatis/src/main/resources/mappers/Relation.xml @@ -0,0 +1,14 @@ + + + + + + + + \ No newline at end of file diff --git a/spring/spring-druid-mybatis/src/main/resources/mybatisConfig.xml b/spring/spring-druid-mybatis/src/main/resources/mybatisConfig.xml new file mode 100644 index 0000000..d60965c --- /dev/null +++ b/spring/spring-druid-mybatis/src/main/resources/mybatisConfig.xml @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + diff --git a/spring/spring-druid-mybatis/src/main/resources/springApplication.xml b/spring/spring-druid-mybatis/src/main/resources/springApplication.xml new file mode 100644 index 0000000..ef93af8 --- /dev/null +++ b/spring/spring-druid-mybatis/src/main/resources/springApplication.xml @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/spring/spring-druid-mybatis/src/main/webapp/WEB-INF/web.xml b/spring/spring-druid-mybatis/src/main/webapp/WEB-INF/web.xml new file mode 100644 index 0000000..1b0fa72 --- /dev/null +++ b/spring/spring-druid-mybatis/src/main/webapp/WEB-INF/web.xml @@ -0,0 +1,64 @@ + + + + + + springMvc + org.springframework.web.servlet.DispatcherServlet + + contextConfigLocation + classpath:springApplication.xml + + 1 + + + + springMvc + / + + + + + DruidStatView + com.alibaba.druid.support.http.StatViewServlet + + + resetEnable + true + + + + loginUsername + druid + + + + loginPassword + druid + + + + DruidStatView + /druid/* + + + + + DruidWebStatFilter + com.alibaba.druid.support.http.WebStatFilter + + exclusions + *.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/* + + + + DruidWebStatFilter + /* + + + + \ No newline at end of file diff --git a/spring/spring-druid-mybatis/src/main/webapp/index.jsp b/spring/spring-druid-mybatis/src/main/webapp/index.jsp new file mode 100644 index 0000000..47961e3 --- /dev/null +++ b/spring/spring-druid-mybatis/src/main/webapp/index.jsp @@ -0,0 +1,9 @@ +<%@ page contentType="text/html;charset=UTF-8" language="java" %> + + + index + + + hello Spring ! + + \ No newline at end of file diff --git a/spring/spring-jdbc-annotation/README.md b/spring/spring-jdbc-annotation/README.md new file mode 100644 index 0000000..e13afda --- /dev/null +++ b/spring/spring-jdbc-annotation/README.md @@ -0,0 +1,425 @@ +# spring 整合 jdbc template(注解配置方式) + +1、创建标准web maven工程,导入依赖 + +```xml + + + 4.0.0 + + com.heibaiying + spring-jdbc + 1.0-SNAPSHOT + + 5.1.3.RELEASE + + + + + + org.springframework + spring-context + ${spring-base-version} + + + org.springframework + spring-beans + ${spring-base-version} + + + org.springframework + spring-core + ${spring-base-version} + + + org.springframework + spring-web + ${spring-base-version} + + + org.springframework + spring-webmvc + ${spring-base-version} + + + javax.servlet + javax.servlet-api + 4.0.1 + provided + + + org.projectlombok + lombok + 1.18.4 + provided + + + + org.springframework + spring-jdbc + ${spring-base-version} + + + mysql + mysql-connector-java + 8.0.13 + + + + junit + junit + 4.12 + test + + + org.springframework + spring-test + ${spring-base-version} + test + + + com.oracle + ojdbc6 + 11.2.0.3.0 + + + + +``` + +2、新建 DispatcherServletInitializer.java继承自AbstractAnnotationConfigDispatcherServletInitializer,等价于我们在web.xml中配置的前端控制器 + +```java +public class DispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { + + protected Class[] getRootConfigClasses() { + return new Class[0]; + } + + protected Class[] getServletConfigClasses() { + return new Class[]{ServletConfig.class}; + } + + protected String[] getServletMappings() { + return new String[]{"/"}; + } +} +``` + +3、在resources文件夹下新建数据库配置文件mysql.properties、oracle.properties + +```properties +# mysql 数据库配置 +mysql.driverClassName=com.mysql.jdbc.Driver +mysql.url=jdbc:mysql://localhost:3306/mysql +mysql.username=root +mysql.password=root +``` + +```properties +# oracle 数据库配置 +oracle.driverClassName=oracle.jdbc.driver.OracleDriver +oracle.url=jdbc:oracle:thin:@//IP地址:端口号/数据库实例名 +oracle.username=用户名 +oracle.password=密码 +``` + +4、在新建数据库配置映射类DataSourceConfig.java + +```java +package com.heibaiying.config; + +import lombok.Data; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; + +/** + * @author : heibaiying + * @description : + */ + +@Configuration +@PropertySource(value = "classpath:mysql.properties") +@Data +public class DataSourceConfig { + + @Value("${mysql.driverClassName}") + private String driverClassName; + @Value("${mysql.url}") + private String url; + @Value("${mysql.username}") + private String username; + @Value("${mysql.password}") + private String password; + +} + +``` + +5、新建ServletConfig.java,进行数据库相关配置 + +```java +package com.heibaiying.config; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.datasource.DataSourceTransactionManager; +import org.springframework.jdbc.datasource.DriverManagerDataSource; +import org.springframework.transaction.annotation.EnableTransactionManagement; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +/** + * @author : heibaiying + */ +@Configuration +@EnableTransactionManagement // 开启声明式事务处理 等价于xml中 +@ComponentScan(basePackages = {"com.heibaiying.*"}) +public class ServletConfig implements WebMvcConfigurer { + + /** + * 配置数据源 + */ + @Bean + public DriverManagerDataSource dataSource(DataSourceConfig sourceConfig) { + DriverManagerDataSource dataSource = new DriverManagerDataSource(); + dataSource.setDriverClassName(sourceConfig.getDriverClassName()); + dataSource.setUrl(sourceConfig.getUrl()); + dataSource.setUsername(sourceConfig.getUsername()); + dataSource.setPassword(sourceConfig.getPassword()); + return dataSource; + } + + /** + * 配置jdbcTemplate + * @param dataSource 这个参数的名称需要保持和上面方法名一致 才能自动注入,因为 + * 采用@Bean注解生成的bean 默认采用方法名为名称,当然也可以在使用@Bean时指定name属性 + */ + @Bean + public JdbcTemplate jdbcTemplate(DriverManagerDataSource dataSource) { + JdbcTemplate jdbcTemplate = new JdbcTemplate(); + jdbcTemplate.setDataSource(dataSource); + return jdbcTemplate; + } + + /** + * 定义事务管理器 + */ + @Bean + public DataSourceTransactionManager transactionManager(DriverManagerDataSource dataSource) { + DataSourceTransactionManager manager = new DataSourceTransactionManager(); + manager.setDataSource(dataSource); + return manager; + } + +} +``` + +6、新建查询接口及其实现类,这里我查询的表是mysql和oracle中的字典表 + +```java +public interface MysqlDao { + + List get(); +} +``` + +```java +package com.heibaiying.dao; + +import com.heibaiying.bean.Relation; +import com.heibaiying.dao.impl.MysqlDao; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Repository; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +/** + * @author : heibaiying + * @description : + */ + +@Repository +public class MysqlDaoImpl implements MysqlDao { + + @Autowired + private JdbcTemplate jdbcTemplate; + + /** + * 更多JDBC 的使用可以参考官方文档 + * @see JdbcTemplate + */ + public List get() { + List relations = jdbcTemplate.query("select * from help_keyword where help_keyword_id = ? ", new Object[]{691}, + new RowMapper() { + public Relation mapRow(ResultSet rs, int rowNum) throws SQLException { + Relation relation = new Relation(); + relation.setId(rs.getString("help_keyword_id")); + relation.setName(rs.getString("name")); + return relation; + } + + }); + return relations; + } +} + +``` + +```mysql +package com.heibaiying.dao.impl; + +import com.heibaiying.bean.Flow; +import java.util.List; + +/** + * @author : heibaiying + * @description : + */ +public interface OracleDao { + + List get(); +} + +``` + +```java +package com.heibaiying.dao; + +import com.heibaiying.bean.Flow; +import com.heibaiying.dao.impl.OracleDao; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Repository; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +/** + * @author : heibaiying + * @description : + */ + +@Repository +public class OracleDaoImpl implements OracleDao { + + @Autowired + private JdbcTemplate jdbcTemplate; + + /** + * 更多JDBC 的使用可以参考官方文档 + * @see JdbcTemplate + */ + public List get() { + List flows = jdbcTemplate.query("select * from APEX_030200.WWV_FLOW_CALS where ID = ? ", new Object[]{217584603977429772L}, + new RowMapper() { + public Flow mapRow(ResultSet rs, int rowNum) throws SQLException { + Flow flow = new Flow(); + flow.setId(rs.getLong("ID")); + flow.setFlowId(rs.getLong("FLOW_ID")); + flow.setPlugId(rs.getLong("PLUG_ID")); + return flow; + } + + }); + return flows; + } +} + +``` + +7、新建测试类进行测试 + +```java +package com.heibaiying.dao; + +import com.heibaiying.bean.Relation; +import com.heibaiying.config.DispatcherServletInitializer; +import com.heibaiying.config.ServletConfig; +import com.heibaiying.dao.impl.MysqlDao; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.List; + +/** + * @author : heibaiying + * @description : + */ + +@RunWith(SpringRunner.class) +@ContextConfiguration(classes = {DispatcherServletInitializer.class, ServletConfig.class}) +public class MysqlDaoTest { + + @Autowired + private MysqlDao mysqlDao; + + @Test + public void get() { + List relations = mysqlDao.get(); + if (relations != null) { + for (Relation relation : relations) { + System.out.println(relation.getId() + " " + relation.getName()); + } + } + } +} +``` + +```java +package com.heibaiying.dao; + +import com.heibaiying.bean.Flow; +import com.heibaiying.config.DispatcherServletInitializer; +import com.heibaiying.config.ServletConfig; +import com.heibaiying.dao.impl.OracleDao; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.List; + +/** + * @author : heibaiying + * @description : + */ + +@RunWith(SpringRunner.class) +@ContextConfiguration(classes = {DispatcherServletInitializer.class, ServletConfig.class}) +public class OracleDaoTest { + + /*注入接口时: 如果接口有多个实现类 可以用这个指定具体的实现类*/ + @Qualifier("oracleDaoImpl") + @Autowired + private OracleDao oracleDao; + + @Test + public void get() { + List flows = oracleDao.get(); + if (flows != null) { + for (Flow flow : flows) { + System.out.println(flow.getId() + " " + flow.getPlugId()); + } + } + } +} + + +``` + diff --git a/spring/spring-jdbc-annotation/src/main/java/com/heibaiying/config/ServletConfig.java b/spring/spring-jdbc-annotation/src/main/java/com/heibaiying/config/ServletConfig.java index 549574d..43face4 100644 --- a/spring/spring-jdbc-annotation/src/main/java/com/heibaiying/config/ServletConfig.java +++ b/spring/spring-jdbc-annotation/src/main/java/com/heibaiying/config/ServletConfig.java @@ -1,16 +1,14 @@ package com.heibaiying.config; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; -import org.springframework.context.annotation.Configuration;; +import org.springframework.context.annotation.Configuration; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.DataSourceTransactionManager; import org.springframework.jdbc.datasource.DriverManagerDataSource; import org.springframework.transaction.annotation.EnableTransactionManagement; import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - /** * @author : heibaiying */ diff --git a/spring/spring-jdbc/README.md b/spring/spring-jdbc/README.md new file mode 100644 index 0000000..9d92447 --- /dev/null +++ b/spring/spring-jdbc/README.md @@ -0,0 +1,384 @@ +# spring 整合 jdbc template(xml配置方式) + +1、创建标准web maven工程,导入依赖 + +```xml + + + 4.0.0 + + com.heibaiying + spring-jdbc + 1.0-SNAPSHOT + + 5.1.3.RELEASE + + + + + + org.springframework + spring-context + ${spring-base-version} + + + org.springframework + spring-beans + ${spring-base-version} + + + org.springframework + spring-core + ${spring-base-version} + + + org.springframework + spring-web + ${spring-base-version} + + + org.springframework + spring-webmvc + ${spring-base-version} + + + javax.servlet + javax.servlet-api + 4.0.1 + provided + + + org.projectlombok + lombok + 1.18.4 + provided + + + + org.springframework + spring-jdbc + ${spring-base-version} + + + mysql + mysql-connector-java + 8.0.13 + + + + junit + junit + 4.12 + test + + + org.springframework + spring-test + ${spring-base-version} + test + + + com.oracle + ojdbc6 + 11.2.0.3.0 + + + + +``` + +2、在web.xml 进行如下配置 + +```xml + + + + + + springMvc + org.springframework.web.servlet.DispatcherServlet + + contextConfigLocation + classpath:springApplication.xml + + 1 + + + + springMvc + / + + + +``` + +3、在resources文件夹下新建数据库配置文件jdbc.properties + +```properties +# mysql 数据库配置 +mysql.driverClassName=com.mysql.jdbc.Driver +mysql.url=jdbc:mysql://localhost:3306/mysql +mysql.username=root +mysql.password=root + +# oracle 数据库配置 +oracle.driverClassName=oracle.jdbc.driver.OracleDriver +oracle.url=jdbc:oracle:thin:@//IP地址:端口号/数据库实例名 +oracle.username=用户名 +oracle.password=密码 +``` + +4、在resources文件夹下创建springApplication.xml 配置文件 + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +5、新建查询接口及其实现类,这里我查询的表是mysql和oracle中的字典表 + +```java +public interface MysqlDao { + + List get(); +} +``` + +```java +package com.heibaiying.dao; + +import com.heibaiying.bean.Relation; +import com.heibaiying.dao.impl.MysqlDao; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Repository; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +/** + * @author : heibaiying + * @description : + */ + +@Repository +public class MysqlDaoImpl implements MysqlDao { + + @Autowired + private JdbcTemplate jdbcTemplate; + + /** + * 更多JDBC 的使用可以参考官方文档 + * @see JdbcTemplate + */ + public List get() { + List relations = jdbcTemplate.query("select * from help_keyword where help_keyword_id = ? ", new Object[]{691}, + new RowMapper() { + public Relation mapRow(ResultSet rs, int rowNum) throws SQLException { + Relation relation = new Relation(); + relation.setId(rs.getString("help_keyword_id")); + relation.setName(rs.getString("name")); + return relation; + } + + }); + return relations; + } +} + +``` + +```mysql +package com.heibaiying.dao.impl; + +import com.heibaiying.bean.Flow; +import java.util.List; + +/** + * @author : heibaiying + * @description : + */ +public interface OracleDao { + + List get(); +} + +``` + +```java +package com.heibaiying.dao; + +import com.heibaiying.bean.Flow; +import com.heibaiying.dao.impl.OracleDao; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.jdbc.core.JdbcTemplate; +import org.springframework.jdbc.core.RowMapper; +import org.springframework.stereotype.Repository; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +/** + * @author : heibaiying + * @description : + */ + +@Repository +public class OracleDaoImpl implements OracleDao { + + @Autowired + private JdbcTemplate jdbcTemplate; + + /** + * 更多JDBC 的使用可以参考官方文档 + * @see JdbcTemplate + */ + public List get() { + List flows = jdbcTemplate.query("select * from APEX_030200.WWV_FLOW_CALS where ID = ? ", new Object[]{217584603977429772L}, + new RowMapper() { + public Flow mapRow(ResultSet rs, int rowNum) throws SQLException { + Flow flow = new Flow(); + flow.setId(rs.getLong("ID")); + flow.setFlowId(rs.getLong("FLOW_ID")); + flow.setPlugId(rs.getLong("PLUG_ID")); + return flow; + } + + }); + return flows; + } +} + +``` + +6.新建测试类进行测试 + +```java +package com.heibaiying.dao; + +import com.heibaiying.bean.Relation; +import com.heibaiying.dao.impl.MysqlDao; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.List; + +/** + * @author : heibaiying + * @description : + */ + +@RunWith(SpringRunner.class) +@ContextConfiguration({"classpath:springApplication.xml"}) +public class MysqlDaoTest { + + @Autowired + private MysqlDao mysqlDao; + + @Test + public void get() { + List relations = mysqlDao.get(); + if (relations != null) { + for (Relation relation : relations) { + System.out.println(relation.getId() + " " + relation.getName()); + } + } + } +} + +``` + +```java +package com.heibaiying.dao; + +import com.heibaiying.bean.Flow; +import com.heibaiying.dao.impl.OracleDao; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.List; + +/** + * @author : heibaiying + * @description : + */ + +@RunWith(SpringRunner.class) +@ContextConfiguration({"classpath:springApplication.xml"}) +public class OracleDaoTest { + + /*注入接口时: 如果接口有多个实现类 可以用这个注解指定具体的实现类*/ + @Qualifier("oracleDaoImpl") + @Autowired + private OracleDao oracleDao; + + @Test + public void get() { + List flows = oracleDao.get(); + if (flows != null) { + for (Flow flow : flows) { + System.out.println(flow.getId() + " " + flow.getPlugId()); + } + } + } +} + +``` + diff --git a/spring/spring-jdbc/src/main/resources/springApplication.xml b/spring/spring-jdbc/src/main/resources/springApplication.xml index 0042bd7..c430a1f 100644 --- a/spring/spring-jdbc/src/main/resources/springApplication.xml +++ b/spring/spring-jdbc/src/main/resources/springApplication.xml @@ -14,15 +14,15 @@ - + - + diff --git a/spring/spring-mybatis-annotation/README.md b/spring/spring-mybatis-annotation/README.md new file mode 100644 index 0000000..af6d0fc --- /dev/null +++ b/spring/spring-mybatis-annotation/README.md @@ -0,0 +1,410 @@ +# spring 整合 mybatis(注解配置方式) + +1、创建标准web maven工程,导入依赖 + +```xml + + + 4.0.0 + + com.heibaiying + spring-jdbc + 1.0-SNAPSHOT + + 5.1.3.RELEASE + + + + + + org.springframework + spring-context + ${spring-base-version} + + + org.springframework + spring-beans + ${spring-base-version} + + + org.springframework + spring-core + ${spring-base-version} + + + org.springframework + spring-web + ${spring-base-version} + + + org.springframework + spring-webmvc + ${spring-base-version} + + + javax.servlet + javax.servlet-api + 4.0.1 + provided + + + org.projectlombok + lombok + 1.18.4 + provided + + + + org.springframework + spring-jdbc + ${spring-base-version} + + + mysql + mysql-connector-java + 8.0.13 + + + + junit + junit + 4.12 + test + + + org.springframework + spring-test + ${spring-base-version} + test + + + com.oracle + ojdbc6 + 11.2.0.3.0 + + + + org.mybatis + mybatis-spring + 1.3.2 + + + org.mybatis + mybatis + 3.4.6 + + + + +``` + +2、新建 DispatcherServletInitializer.java继承自AbstractAnnotationConfigDispatcherServletInitializer,等价于我们在web.xml中配置的前端控制器 + +```java +public class DispatcherServletInitializer extends AbstractAnnotationConfigDispatcherServletInitializer { + + protected Class[] getRootConfigClasses() { + return new Class[0]; + } + + protected Class[] getServletConfigClasses() { + return new Class[]{ServletConfig.class}; + } + + protected String[] getServletMappings() { + return new String[]{"/"}; + } +} +``` + +3、在resources文件夹下新建数据库配置文件mysql.properties、oracle.properties + +```properties +# mysql 数据库配置 +mysql.driverClassName=com.mysql.jdbc.Driver +mysql.url=jdbc:mysql://localhost:3306/mysql +mysql.username=root +mysql.password=root +``` + +```properties +# oracle 数据库配置 +oracle.driverClassName=oracle.jdbc.driver.OracleDriver +oracle.url=jdbc:oracle:thin:@//IP地址:端口号/数据库实例名 +oracle.username=用户名 +oracle.password=密码 +``` + +4、在新建数据库配置映射类DataSourceConfig.java + +```java +package com.heibaiying.config; + +import lombok.Data; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.PropertySource; + +/** + * @author : heibaiying + * @description : + */ + +@Configuration +@PropertySource(value = "classpath:mysql.properties") +@Data +public class DataSourceConfig { + + @Value("${mysql.driverClassName}") + private String driverClassName; + @Value("${mysql.url}") + private String url; + @Value("${mysql.username}") + private String username; + @Value("${mysql.password}") + private String password; + +} + +``` + +5、新建ServletConfig.java,进行数据库相关配置 + +```java +package com.heibaiying.config; + +import org.mybatis.spring.SqlSessionFactoryBean; +import org.mybatis.spring.mapper.MapperScannerConfigurer; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.ComponentScan; +import org.springframework.context.annotation.Configuration;; +import org.springframework.core.io.support.PathMatchingResourcePatternResolver; +import org.springframework.jdbc.datasource.DataSourceTransactionManager; +import org.springframework.jdbc.datasource.DriverManagerDataSource; +import org.springframework.transaction.annotation.EnableTransactionManagement; +import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; + +import java.io.IOException; + + +/** + * @author : heibaiying + */ +@Configuration +@EnableTransactionManagement // 开启声明式事务处理 等价于xml中 +@ComponentScan(basePackages = {"com.heibaiying.*"}) +public class ServletConfig implements WebMvcConfigurer { + + /* @Autowired + * private DataSourceConfig sourceConfig; + * 不要采用这种方式注入DataSourceConfig,由于类的加载顺序影响会报空指针异常 + * 最好的方式是在DriverManagerDataSource构造中采用参数注入 + */ + + /** + * 配置数据源 + */ + @Bean + public DriverManagerDataSource dataSource(DataSourceConfig sourceConfig) { + DriverManagerDataSource dataSource = new DriverManagerDataSource(); + dataSource.setDriverClassName(sourceConfig.getDriverClassName()); + dataSource.setUrl(sourceConfig.getUrl()); + dataSource.setUsername(sourceConfig.getUsername()); + dataSource.setPassword(sourceConfig.getPassword()); + return dataSource; + } + + + /** + * 配置mybatis 会话工厂 + * + * @param dataSource 这个参数的名称需要保持和上面方法名一致 才能自动注入,因为 + * 采用@Bean注解生成的bean 默认采用方法名为名称,当然也可以在使用@Bean时指定name属性 + */ + @Bean + public SqlSessionFactoryBean sessionFactoryBean(DriverManagerDataSource dataSource) throws IOException { + SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean(); + sessionFactoryBean.setDataSource(dataSource); + PathMatchingResourcePatternResolver resolver = new PathMatchingResourcePatternResolver(); + sessionFactoryBean.setMapperLocations(resolver.getResources("classpath*:/mappers/**/*.xml")); + sessionFactoryBean.setConfigLocation(resolver.getResource("classpath:mybatisConfig.xml")); + return sessionFactoryBean; + } + + /** + * 配置mybatis 会话工厂 + */ + @Bean + public MapperScannerConfigurer MapperScannerConfigurer() { + MapperScannerConfigurer configurer = new MapperScannerConfigurer(); + configurer.setSqlSessionFactoryBeanName("sessionFactoryBean"); + configurer.setBasePackage("com.heibaiying.dao"); + return configurer; + } + + /** + * 定义事务管理器 + */ + @Bean + public DataSourceTransactionManager transactionManager(DriverManagerDataSource dataSource) { + DataSourceTransactionManager manager = new DataSourceTransactionManager(); + manager.setDataSource(dataSource); + return manager; + } + +} + +``` + +5、新建mybtais 配置文件 更多settings配置项可以参考[官方文档](http://www.mybatis.org/mybatis-3/zh/configuration.html) + +```xml + + + + + + + + + + + + + + + + +``` + +5、新建查询接口及其对应的mapper文件 + +```java +public interface MysqlDao { + + List get(); +} +``` + +```xml + + + + + + + +``` + +```mysql +public interface OracleDao { + + List queryById(long id); +} + +``` + +```xml + + + + + + + +``` + +6.新建测试类进行测试 + +```java +package com.heibaiying.dao; + +import com.heibaiying.bean.Relation; +import com.heibaiying.config.DataSourceConfig; +import com.heibaiying.config.DispatcherServletInitializer; +import com.heibaiying.config.ServletConfig; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.List; + +/** + * @author : heibaiying + * @description : + */ + +@RunWith(SpringRunner.class) +@ContextConfiguration(classes = {DispatcherServletInitializer.class, ServletConfig.class}) +public class MysqlDaoTest { + + @Autowired + private MysqlDao mysqlDao; + + @Test + public void get() { + List relations = mysqlDao.queryById("691"); + if (relations != null) { + for (Relation relation : relations) { + System.out.println(relation.getId() + " " + relation.getName()); + } + } + } +} +``` + +```java +package com.heibaiying.dao; + +import com.heibaiying.bean.Flow; +import com.heibaiying.config.DataSourceConfig; +import com.heibaiying.config.DispatcherServletInitializer; +import com.heibaiying.config.ServletConfig; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.List; + +/** + * @author : heibaiying + * @description : + */ + +@RunWith(SpringRunner.class) +@ContextConfiguration(classes = {DispatcherServletInitializer.class, ServletConfig.class}) +public class OracleDaoTest { + + @Autowired + private OracleDao oracleDao; + + @Test + public void get() { + List flows = oracleDao.queryById(217584603977429772L); + if (flows != null) { + for (Flow flow : flows) { + System.out.println(flow.getId() + " " + flow.getPlugId()); + } + } + } +} +``` + diff --git a/spring/spring-mybatis-annotation/src/main/java/com/heibaiying/dao/MysqlDao.java b/spring/spring-mybatis-annotation/src/main/java/com/heibaiying/dao/MysqlDao.java index c89e188..a3050fd 100644 --- a/spring/spring-mybatis-annotation/src/main/java/com/heibaiying/dao/MysqlDao.java +++ b/spring/spring-mybatis-annotation/src/main/java/com/heibaiying/dao/MysqlDao.java @@ -10,7 +10,7 @@ import java.util.List; * @description : */ -@Mapper + public interface MysqlDao { List queryById(String id); diff --git a/spring/spring-mybatis-annotation/src/main/java/com/heibaiying/dao/OracleDao.java b/spring/spring-mybatis-annotation/src/main/java/com/heibaiying/dao/OracleDao.java index 62cbff2..7dfc8da 100644 --- a/spring/spring-mybatis-annotation/src/main/java/com/heibaiying/dao/OracleDao.java +++ b/spring/spring-mybatis-annotation/src/main/java/com/heibaiying/dao/OracleDao.java @@ -9,7 +9,7 @@ import java.util.List; * @author : heibaiying * @description : */ -@Mapper + public interface OracleDao { List queryById(long id); diff --git a/spring/spring-mybatis/README.md b/spring/spring-mybatis/README.md new file mode 100644 index 0000000..492f2f2 --- /dev/null +++ b/spring/spring-mybatis/README.md @@ -0,0 +1,358 @@ +# spring 整合 mybatis(xml配置方式) + +1、创建标准web maven工程,导入依赖 + +```xml + + + 4.0.0 + + com.heibaiying + spring-jdbc + 1.0-SNAPSHOT + + 5.1.3.RELEASE + + + + + + org.springframework + spring-context + ${spring-base-version} + + + org.springframework + spring-beans + ${spring-base-version} + + + org.springframework + spring-core + ${spring-base-version} + + + org.springframework + spring-web + ${spring-base-version} + + + org.springframework + spring-webmvc + ${spring-base-version} + + + javax.servlet + javax.servlet-api + 4.0.1 + provided + + + org.projectlombok + lombok + 1.18.4 + provided + + + + org.springframework + spring-jdbc + ${spring-base-version} + + + mysql + mysql-connector-java + 8.0.13 + + + + junit + junit + 4.12 + test + + + org.springframework + spring-test + ${spring-base-version} + test + + + com.oracle + ojdbc6 + 11.2.0.3.0 + + + + org.mybatis + mybatis-spring + 1.3.2 + + + org.mybatis + mybatis + 3.4.6 + + + + +``` + +2、在web.xml 进行如下配置 + +```xml + + + + + + springMvc + org.springframework.web.servlet.DispatcherServlet + + contextConfigLocation + classpath:springApplication.xml + + 1 + + + + springMvc + / + + + +``` + +3、在resources文件夹下新建数据库配置文件jdbc.properties + +```properties +# mysql 数据库配置 +mysql.driverClassName=com.mysql.jdbc.Driver +mysql.url=jdbc:mysql://localhost:3306/mysql +mysql.username=root +mysql.password=root + +# oracle 数据库配置 +oracle.driverClassName=oracle.jdbc.driver.OracleDriver +oracle.url=jdbc:oracle:thin:@//IP地址:端口号/数据库实例名 +oracle.username=用户名 +oracle.password=密码 +``` + +4、在resources文件夹下创建springApplication.xml 配置文件 + +```xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +``` + +5、新建mybtais 配置文件 更多settings配置项可以参考[官方文档](http://www.mybatis.org/mybatis-3/zh/configuration.html) + +```xml + + + + + + + + + + + + + + + + +``` + +5、新建查询接口及其对应的mapper文件 + +```java +public interface MysqlDao { + + List get(); +} +``` + +```xml + + + + + + + +``` + +```mysql +public interface OracleDao { + + List queryById(long id); +} + +``` + +```xml + + + + + + + +``` + +6.新建测试类进行测试 + +```java +package com.heibaiying.dao; + +import com.heibaiying.bean.Relation; +import com.heibaiying.dao.impl.MysqlDao; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.List; + +/** + * @author : heibaiying + * @description : + */ + +@RunWith(SpringRunner.class) +@ContextConfiguration({"classpath:springApplication.xml"}) +public class MysqlDaoTest { + + @Autowired + private MysqlDao mysqlDao; + + @Test + public void get() { + List relations = mysqlDao.get(); + if (relations != null) { + for (Relation relation : relations) { + System.out.println(relation.getId() + " " + relation.getName()); + } + } + } +} + +``` + +```java +package com.heibaiying.dao; + +import com.heibaiying.bean.Flow; +import com.heibaiying.dao.impl.OracleDao; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; +import org.springframework.test.context.ContextConfiguration; +import org.springframework.test.context.junit4.SpringRunner; + +import java.util.List; + +/** + * @author : heibaiying + * @description : + */ + +@RunWith(SpringRunner.class) +@ContextConfiguration({"classpath:springApplication.xml"}) +public class OracleDaoTest { + + /*注入接口时: 如果接口有多个实现类 可以用这个注解指定具体的实现类*/ + @Qualifier("oracleDaoImpl") + @Autowired + private OracleDao oracleDao; + + @Test + public void get() { + List flows = oracleDao.get(); + if (flows != null) { + for (Flow flow : flows) { + System.out.println(flow.getId() + " " + flow.getPlugId()); + } + } + } +} + +``` + diff --git a/spring/spring-mybatis/src/main/java/com/heibaiying/dao/MysqlDao.java b/spring/spring-mybatis/src/main/java/com/heibaiying/dao/MysqlDao.java index f32534e..5a2bb4a 100644 --- a/spring/spring-mybatis/src/main/java/com/heibaiying/dao/MysqlDao.java +++ b/spring/spring-mybatis/src/main/java/com/heibaiying/dao/MysqlDao.java @@ -1,8 +1,6 @@ package com.heibaiying.dao; import com.heibaiying.bean.Relation; -import org.apache.ibatis.annotations.Mapper; -import org.springframework.stereotype.Repository; import java.util.List; @@ -11,7 +9,7 @@ import java.util.List; * @description : */ -@Mapper + public interface MysqlDao { List queryById(String id); diff --git a/spring/spring-mybatis/src/main/java/com/heibaiying/dao/OracleDao.java b/spring/spring-mybatis/src/main/java/com/heibaiying/dao/OracleDao.java index 2409955..c8413f9 100644 --- a/spring/spring-mybatis/src/main/java/com/heibaiying/dao/OracleDao.java +++ b/spring/spring-mybatis/src/main/java/com/heibaiying/dao/OracleDao.java @@ -1,8 +1,6 @@ package com.heibaiying.dao; import com.heibaiying.bean.Flow; -import org.apache.ibatis.annotations.Mapper; -import org.springframework.stereotype.Repository; import java.util.List; @@ -10,7 +8,7 @@ import java.util.List; * @author : heibaiying * @description : */ -@Mapper + public interface OracleDao { List queryById(long id); diff --git a/spring/spring-mybatis/src/main/resources/springApplication.xml b/spring/spring-mybatis/src/main/resources/springApplication.xml index a9088a4..ea5b5db 100644 --- a/spring/spring-mybatis/src/main/resources/springApplication.xml +++ b/spring/spring-mybatis/src/main/resources/springApplication.xml @@ -28,6 +28,7 @@ +