本文主要介绍了SpringBoot整合几种常用的数据访问技术。 而这些技术又是企业开发中,比较常见的。
整合JDBC
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<!-- 一定要指定版本号,使用spring boot自带的的会有问题 -->
<version>5.1.19</version>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
编写配置
在application.properties
中加入如下配置:
#数据库链接
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springboot
spring.datasource.username=root
spring.datasource.password=root
#数据库脚本
spring.datasource.schema=classpath:schema.sql
spring.datasource.data=classpath:data.sql
单元测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {
@Autowired
private DataSource dataSource;
@Autowired
private JdbcTemplate jdbcTemplate;
@Autowired
private NamedParameterJdbcTemplate namedParameterJdbcTemplate;
@Test
public void contextLoads() throws SQLException {
System.out.println(dataSource.getClass());
System.out.println(dataSource.getConnection());
System.out.println(jdbcTemplate);
System.out.println(namedParameterJdbcTemplate);
}
}
输出
class org.apache.tomcat.jdbc.pool.DataSource
ProxyConnection[PooledConnection[com.mysql.jdbc.JDBC4Connection@49c8f6e8]]
org.springframework.jdbc.core.JdbcTemplate@6b0615ae
org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate@4e73b552
说明:
- Spring Boot默认使用
Tomcat JDBC
数据源连接池。 - 可直接注入
dataSource
。 - 可直接注入
JdbcTemplate
。 - 可直接注入
NamedParameterJdbcTemplate
。 - 执行单元测试的时候,会自动执行指定的数据库脚本。
整合Druid
这里说明一下:Spring Boot默认使用的Tomcat数据库连接池。
引入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.8</version>
</dependency>
编写配置
在application.properties
中,新加入:
#数据库连接池配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=20
spring.datasource.maxWait=60000
spring.datasource.timeBetweenEvictionRunsMillis=60000
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=SELECT 1 FROM DUAL
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
spring.datasource.poolPreparedStatements=true
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
spring.datasource.filters=stat,wall,log4j
spring.datasource.useGlobalDataSourceStat=true
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
再运行单元测试,输出:
class com.alibaba.druid.pool.DruidDataSource
com.mysql.jdbc.JDBC4Connection@989da1
org.springframework.jdbc.core.JdbcTemplate@31cb96e1
org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate@3eed0f5
说明已经配置上个了Druid
。
配置监控
@Configuration
public class DruidConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource druidDataSource() {
return new DruidDataSource();
}
//1、配置管理后台的Servlet
@Bean
public ServletRegistrationBean statViewServlet() {
ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
Map<String, String> initParams = new HashMap<>();
initParams.put("loginUsername", "admin");
initParams.put("loginPassword", "123");
initParams.put("allow", "");//默认就是允许所有访问
initParams.put("deny", "127.0.0.1");
bean.setInitParameters(initParams);
return bean;
}
//2、配置web监控的filter
@Bean
public FilterRegistrationBean webStatFilter() {
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(new WebStatFilter());
Map<String, String> initParams = new HashMap<>();
initParams.put("exclusions", "*.js,*.css,/druid/*");
bean.setInitParameters(initParams);
bean.setUrlPatterns(Arrays.asList("/*"));
return bean;
}
}
启动服务器,访问:http://localhost:8080/druid/login.html 看到:
登录后看到:
整合Spring Data JPA
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
编写配置
在application.properties中加入如下配置:
#数据库链接
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springboot
spring.datasource.username=root
spring.datasource.password=root
#控制台输出SQL
spring.jpa.show-sql=true
编写Repository接口
public interface DeptRepository extends JpaRepository<Dept,Long> {
}
只需要继承JpaRepository
即可。
单元测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {
@Autowired
private DeptRepository deptRepository;
@Test
public void test(){
List<Dept> depts = deptRepository.findAll();
System.out.println(depts);
}
}
整合MyBatis
引入依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
编写配置
#指定全局配置文件的位置(可选)
mybatis.config-locations=classpath:mybatis/mybatis‐config.xml
#指定sql映射文件的位置
mybatis.mapper-locations=classpath:mybatis/mapper/*Mapper.xml
#指定实体类类型别名所在包的位置
mybatis.type-aliases-package=org.yun.springboot.model
编写DeptMapper接口
@Mapper //标记一个Mapper接口
public interface DeptMapper {
List<Dept> findAll();
}
这里有一个问题,就是当XxxMapper接口很多的时候,要在每个上打上@Mapper
标记,很繁琐。解决方法如下:
首先,将原来的@Mapper
注释掉。
//@Mapper //标记一个Mapper接口
public interface DeptMapper {
List<Dept> findAll();
}
其次,在SpringBoot的启动类上加入@@MapperScan
注解。
//指定XxxMapper接口文件所在的包
@MapperScan("org.yun.springboot.mapper")
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
别忘了还有对应XxxMapper.xml文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="org.yun.springboot.mapper.DeptMapper" >
<select id="findAll" resultType="Dept">
select * from t_dept
</select>
</mapper>
这里的quanresultType="Dept"
不需要写全限定类名。因为,已经在application.properties
中配置过mybatis.type-aliases-package=org.yun.springboot.model
。而且,这里的Dept
是不区分大小写的。
单元测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {
@Autowired
private DeptMapper deptMapper;
@Test
public void test2() {
List<Dept> depts = deptMapper.findAll();
System.out.println(depts);
}
}
整合MyBatis-Generator(MBG)
引入依赖
<!-- mybatis整合spring boot依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<!-- MBG依赖 -->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.2</version>
</dependency>
编写配置
application.properties
中加入如下配置:
#mysql数据库连接
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/springboot
spring.datasource.username=root
spring.datasource.password=root
#spring.datasource.schema=classpath:/schema.sql
#spring.datasource.data=classpath:/data.sql
#指定全局配置文件的位置
mybatis.config-locations=classpath:mybatis/mybatis‐config.xml
#指定sql映射文件的位置
mybatis.mapper-locations=classpath:mybatis/mapper/*Mapper.xml
#指定实体类类型别名所在包的位置
mybatis.type-aliases-package=org.yun.springboot.model
在项目的跟目录下创建mbg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="DB2Tables" targetRuntime="MyBatis3">
<commentGenerator>
<!-- 是否取消注释 -->
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!-- 配置数据库连接 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/springboot"
userId="root"
password="root">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- 指定javaBean生成的位置 -->
<javaModelGenerator targetPackage="org.yun.springboot.model"
targetProject=".\src\main\java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!--指定sql映射文件生成的位置 -->
<sqlMapGenerator targetPackage="mapper"
targetProject=".\src\main\resources">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!-- 指定dao接口生成的位置,mapper接口 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="org.yun.springboot.mapper"
targetProject=".\src\main\java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!-- table指定每个表的生成策略 -->
<table tableName="t_dept" domainObjectName="Dept"/>
</context>
</generatorConfiguration>
编写代码生成器
public class MBGTest {
public static void main(String[] args) throws Exception {
List<String> warnings = new ArrayList<>();
boolean overwrite = true;
File configFile = new File("mbg.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
System.out.println("success...");
}
}
在Spring Boot的启动类上,指明要扫描的mapper的位置
@MapperScan("org.yun.springboot.mapper")
@SpringBootApplication
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
单元测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {
@Autowired
private DeptMapper deptMapper;
@Test
public void test() {
List<Dept> depts = deptMapper.selectByExample(null);
System.out.println(depts);
}
}
整合MyBatis Plus
引入依赖
<!-- mybatis-plus 整合 spring boot -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.1.0</version>
</dependency>
编写配置
在application.properties
中加入如下配置:
#mysql数据库连接
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#spring.datasource.url=jdbc:mysql://localhost:3306/crud
spring.datasource.url=jdbc:mysql://localhost:3306/springboot
spring.datasource.username=root
spring.datasource.password=root
# 数据库脚本
#spring.datasource.schema=classpath:/schema.sql
#spring.datasource.data=classpath:/data.sql
#指定全局配置文件的位置
mybatis.config-locations=classpath:mybatis/mybatis‐config.xml
#指定sql映射文件的位置
mybatis.mapper-locations=classpath:mybatis/mapper/*Mapper.xml
#指定实体类类型别名所在包的位置
mybatis.type-aliases-package=org.yun.springboot.model
#主键类型
mybatis-plus.global-config.db-config.id-type=auto
#驼峰下划线转换
mybatis-plus.global-config.db-column-underline=true
#全局表前缀
mybatis-plus.global-config.db-config.table-prefix=t_
编写DeptMapper接口
public interface DeptMapper extends BaseMapper<Dept> {
}
BaseMapper
是MyBatisPlus提供。
MybatisPlusConfig
@Configuration
@MapperScan("org.yun.springboot.mapper") //扫描Mapper接口
public class MybatisPlusConfig {
// 其他配置
}
当然,这里的@MapperScan
也可以放在Application
类中。
单元测试
@RunWith(SpringRunner.class)
@SpringBootTest
public class ApplicationTests {
@Autowired
private DeptMapper deptMapper;
@Test
public void test3() {
Dept dept = deptMapper.selectById(1L);
System.out.println(dept);
}
}