首先我们需要导入web和测试基础依赖包 Mysql驱动包
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
在整合数据访问之前我们先需要一个数据源
如果我们在yml或者properties中不配置数据源 springboot会有一个默认的数据源 在数据源自动配置类DataSourceConfiguration中可以看到springboot自己支持的多种数据源:
org.apache.tomcat.jdbc.pool.DataSource
org.apache.tomcat.jdbc.pool.HikariDataSource
org.apache.tomcat.jdbc.pool.BasicDataSource
上面的代码中的这2个注解中
@ConditionalOnClass 判断当前项目有没有这个类
@ConditionalOnProperty
判断配置文件中是否存在某个配置 spring.datasource.type;
这里注意如果我们想自己配置数据源 就需要配置这个属性
即使我们配置文件中不配置因为matchIfMissing=true,也是默认生效的;
@ConditionalOnClass(org.apache.tomcat.jdbc.pool.DataSource.class)
@ConditionalOnProperty(name = "spring.datasource.type", havingValue = "org.apache.tomcat.jdbc.pool.DataSource", matchIfMissing = true)
在上面的图片中我们可以看我选择的springboot2.0.1版本 默认数据源为HikariDataSource。
然而在开发中我们常常选择Durid数据源 它属于阿里巴巴旗下的一款数据源
业界把 Druid 和 HikariCP 做对比后,虽说 HikariCP 的性能比 Druid 高,但是因为 Druid 包括很多维度的统计和分析功能,所以这也是大家都选择使用它的原因。
接下来我们看看怎么配置Durid 首先需要在maven导入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.18</version>
</dependency>
接着 在配置文件中配置属性spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
和其他相关属性
数据库访问配置
# 主数据源
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/jy
spring.datasource.username=root
spring.datasource.password=123
# 下面为连接池的补充设置,应用到上面所有数据源中
# 初始化大小,最小,最大
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
# 打开PSCache,并且指定每个连接上PSCache的大小
spring.datasource.poolPreparedStatements=true
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
spring.datasource.filters=stat,wall,log4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 合并多个DruidDataSource的监控数据
spring.datasource.useGlobalDataSourceStat=true
接下来我们就可以配置durid自带的监控页面,实时监控应用的连接池情况
很简单只需要用javaConfig的方式配置一个servlet和过滤器
/**
* druid 配置.
* <p>
*
* @author Administrator
*/
@Configuration
public class DruidConfiguration {
/**
* 注册一个StatViewServlet
*
* @return
*/
@Bean
public ServletRegistrationBean DruidStatViewServle2() {
//org.springframework.boot.context.embedded.ServletRegistrationBean提供类的进行注册.
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
//添加初始化参数:initParams
//白名单:
servletRegistrationBean.addInitParameter("allow", "127.0.0.1");
//IP黑名单 (存在共同时,deny优先于allow) : 如果满足deny的话提示:Sorry, you are not permitted to view this page.
servletRegistrationBean.addInitParameter("deny", "192.168.1.73");
//登录查看信息的账号密码.
servletRegistrationBean.addInitParameter("loginUsername", "root");
servletRegistrationBean.addInitParameter("loginPassword", "123");
//是否能够重置数据.
servletRegistrationBean.addInitParameter("resetEnable", "false");
return servletRegistrationBean;
}
/**
* 注册一个:filterRegistrationBean
*
* @return
*/
@Bean
public FilterRegistrationBean druidStatFilter2() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
//添加过滤规则.
filterRegistrationBean.addUrlPatterns("/*");
//添加不需要忽略的格式信息.
filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return filterRegistrationBean;
}
}
配置完之后我们就可以访问localhost:8080/durid 进入到监控页面
接着我们就可以对进行数据访问啦 嘻嘻
首先介绍整合JDBC
很简单因为我们上面已经加入了jdcb依赖包
springboot就会帮我们自动装配JdbcTemplate
我们就可以进行对应的数据访问
整合Mybatis
首先也是引入依赖
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis‐spring‐boot‐starter</artifactId>
<version>1.3.1</version>
</dependency>
注意这个依赖和上面的依赖的区别是 这个依赖是Mybatis自己为了适配springboot而出的
而上面的依赖比如spring-boot-starter-web是springboot官方出的 所以我们需要在此给出版本信息。因为parent的pom文件里没有约定版本。
我们可以看一下 这个依赖 其实帮我们附带配置了这些依赖这也是我们和spring整合所需要的
那么怎么才能对数据进行访问呢?我们可以像和以前整合spring一样用配置文件版 也可以用注解版
先介绍用注解版
参考上图 我们只需要在mapper接口中定义注解@Mapper 并且在对应的增删改查方法上加上对应的注解 springboot就能帮我们找到这个接口运用动态代理生成实现类
这时候我们就会想到 那原来和spring整合时有一个专门的mybatis配置文件来配置相关信息 比如 驼峰命名转换 现在该用什么配置呢 我们可以和原来一样 写一个mybatis配置文件 然后在主配置文件中告诉他的位置
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!--设置启用数据库字段下划线映射到java对象的驼峰式命名属性,默认为false-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<typeAliases>
<package name="com.wmh.springboot01"></package>
</typeAliases>
</configuration>
除了这样我们还可以直接在主配置文件中配置所需要的属性
我们可以在导入的mybatis 和boot整合包中找到这个类
我们可以从中看到这个注解
我们再点进去看这个类
发现MybatisProerties类的作业就是将我们的主配置文件前缀为mybatis的配置信息与这个类中的属性绑定在一起
从而可以利用MybatisProerties中的信息 用javaConfig的形式进行配置我们原本用XML配置相关信息 (这里的javaConfig就是MyatisAutoConfiguration)
所以! 我们就可以直接在主配置文件中 配置我们所需要的信息
这时候我们进行测试发现顺利完成对数据的查询和 修改
其实除了直接在主配置文件中配置 我们还可以用javaConfig的方式往spring容器中注入一个实现ConfigurationCustomizer接口的类 实现配置
@Configuration
public class MyBatisConfig {
@Bean
public ConfigurationCustomizer configurationCustomizer() {
return new ConfigurationCustomizer() {
@Override
public void customize(org.apache.ibatis.session.Configuration configuration) {
configuration.setMapUnderscoreToCamelCase(true);
}
};
}
}
接下来介绍XML版本
首先需要写一个sql映射文件
<?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="com.wmh.springboot01.UserMapper1">
<select id="findUser" resultType="User" parameterType="int">
select * from user where id = #{id}
</select>
<insert id="insertUser" parameterType="user" >
<selectKey resultType="int" order="AFTER" keyProperty="id">
SELECT LAST_INSERT_ID()
</selectKey>
insert into user (user_name) values(#{userName})
</insert>
</mapper>
那么springboot如何才能找到他呢 我们可以直接在主配置文件中配置
那mybatis相关的配置呢?我们一样可以跟上图配置中的一样另外写一个配置文件然后告诉它的位置 也可以和注解版本一样 直接在springboot主配置文件中写 也可以用javaConfig的方式配置
最后注意mapper接口上必须注明@Mapper注解让springboot找到他 或者在启动类上注明@MapperScan注解扫描整个mapper包 其实还可以在配置文件中配置mapper接口所在的位置
最后介绍整合springDataJpa
整合之前我先介绍一下springData springData其实就是spring来帮我们简化数据访问的一个模块 比如jpa mongdb redis springdata都能轻松应付 它为我们提供使用统一的API来对数据访问层来进行操作 他让我们在使用关系型或非关系型数据库时都基于spring提供的统一标准 下面我们我们可以看到它使数据访问相当方便。
springdata提供了统一的Repository的接口
我们只要实现这些接口 定义相应的接口方法 就可以实现对数据的访问不需要像mybatis那样写sql语句
我们可以认为JPA是标准,事实上也是,JPA几乎都是接口,实现都是Hibernate在做,宏观上面看,在JPA的统一之下Hibernate很良好的运行。
接下来我们导入springdatajpa依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
<version>2.0.6.RELEASE</version>
</dependency>
然后只需要在实体类上加上这些对应的注解
然后写一个接口继承JpaRespository<实体类,实体类主键类型> 这个接口就具备了一系列数据访问的功能
最后测试成功 整合完毕