SpringData简介
对于数据访问层,无论是 SQL(关系型数据库) 还是 NOSQL(非关系型数据库),Spring Boot 底层都是采用 Spring Data 的方式进行统一处理。
Spring Boot 底层都是采用 Spring Data 的方式进行统一处理各种数据库,Spring Data 也是 Spring 中与 Spring Boot、Spring Cloud 等齐名的知名项目。
Sping Data 官网:https://spring.io/projects/spring-data
数据库相关的启动器 :弹簧启动参考文档 (spring.io)
一. 整合JDBC
1. 新建项目
选择的Dependencies有:Spring Web
,JDBC API
和 MySQL Driver
2. 新建application.yml
文件并配置
1 | spring: |
3. 连接MySQL数据库
4. 测试数据库连接
Demo5JdbcApplicationTests.java文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Demo5JdbcApplicationTests {
DataSource dataSource;
void contextLoads() throws SQLException {
//查看一下默认的数据源
System.out.println(dataSource.getClass());
//获得数据库连接
Connection connection = dataSource.getConnection();
System.out.println(connection);
//关闭
connection.close();
}
}
报错问题
getConnection() 引入爆红
原因:
导入的包错误
import javax.activation.DataSource;
正确的是:
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
且要抛出异常:
void contextLoads() throws SQLException {}
5.Controller中的增删改查
在SpringBoot中有许多的模板,如:XXX Template ;这是SpringBoot已经配置好的模板bean,拿来即用!其中JdbcTemplate
模板可以用来对数据库进行操作!
JdbcTemplate
- 有了数据源(com.zaxxer
- .hikari.HikariDataSource),然后可以拿到数据库连接 (java.sql.Connection),有了连接,就可以使用原生的 JDBC 语句来操作数据库;
- 即使不使用第三方第数据库操作框架,如 MyBatis等,Spring 本身也对原生的JDBC 做了轻量级的封装,即
JdbcTemplate
。 - 数据库操作的所有 CRUD 方法都在 JdbcTemplate 中。
- Spring Boot不仅提供了默认的数据源,同时默认已经配置好了 JdbcTemplate 放在了容器中,程序员只需自己注入即可使用。
- JdbcTemplate 的自动配置是依赖 org.springframework.boot.autoconfigure.jdbc 包下的JdbcTemplateConfiguration类。
JdbcTemplate主要提供以下几类方法:
- execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
- update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate 方法用于执行批处理相关语句;
- query方法及queryForXXX方法:用于执行查询相关语句;
- call方法:用于执行存储过程、函数相关语句。
JDBCController.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
public class JDBCController {
JdbcTemplate jdbcTemplate;
//查询数据库的所有信息
//没有实体类,数据库中的东西,怎么获取? Map
//查
//List中的1个Map对应数据库的1行数据;Map中的key对应数据库的字段名,value对应数据库的字段值
public List<Map<String,Object>> userList(){
String sql = "select * from user";
List<Map<String,Object>> list_maps = jdbcTemplate.queryForList(sql);
return list_maps;
}
//增
public String addUser(){
String sql = "insert into mybatis.user(id,name,pwd) values (4,'陈大花','123456')";
jdbcTemplate.update(sql);
return "update-ok";
}
//改
public String updateUser(int id){
String sql = "update mybatis.user set name=?,pwd=? where id="+id;
//封装
Object[] objects = new Object[2];
objects[0] = "小明2";
objects[1] = "zzz";
jdbcTemplate.update(sql,objects);
return "update-ok";
}
//删
public String deleteUser(int id){
String sql = "delete from mybatis.user where id =?";
jdbcTemplate.update(sql,id);
return "deleteUser-ok";
}
}总结:
数据库操作语句:
- 查询:
"select * from user";
- 插入:
"insert into mybatis.user(id,name,pwd) values (4,'陈大花','123456')";
- 更改:
"update mybatis.user set name=?,pwd=? where id="+id;
- 删除:
"delete from mybatis.user where id =?";
springboot语句:
- 查询:
List<Map<String,Object>> list_maps = jdbcTemplate.queryForList(sql);
- 插入:
jdbcTemplate.update(sql);
- 更改:
jdbcTemplate.update(sql,objects);
- 删除:
jdbcTemplate.update(sql,id);
即,查询用的是
queryForList
属性,查询完放在List
中;新增/更改/删除用的都是update
属性- 查询:
二. 整合Druid
1. Druid简介
- Druid是阿里巴巴开源平台上一个数据库连接池实现,结合了 C3P0、DBCP 等DB池的优点,同时加入了日志监控
- Druid可以很好的监控 DB 池连接和 SQL 的执行情况,天生就是针对监控而生的DB连接池
- Github地址:https://github.com/alibaba/druid
2. 配置数据源
pom.xml文件
添加上Druid数据源依赖和导入Log4j的依赖
1
2
3
4
5
6
7
8
9
10
11
12
13<!--druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.11</version>
</dependency>
<!--log4j-->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.12</version>
</dependency>application.yml文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30spring:
datasource:
username: root
password: root
# ?serverTimezone=UTC解决时区的报错
url: jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
driver-class-name: com.mysql.cj.jdbc.Driver
type: com.alibaba.druid.pool.DruidDataSource # 自定义数据源
#Spring Boot 默认是不注入这些属性值的,需要自己绑定
#druid 数据源专有配置
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
#配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入
#如果允许时报错 java.lang.ClassNotFoundException: org.apache.log4j.Priority
#则导入 log4j 依赖即可,Maven 地址:https://mvnrepository.com/artifact/log4j/log4j
filters: stat,wall,log4j
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500将自定义的 Druid数据源添加到容器中,绑定全局配置——DruidConfig.java文件
为DruidDataSource 绑定全局配置文件中的参数,再添加到容器中,而不再使用Spring Boot的自动生成了;需要自己添加DruidDataSource组件到容器中,并绑定属性;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class DruidConfig {
/**
* 将自定义的 Druid数据源添加到容器中,不再让 Spring Boot 自动创建
* 绑定全局配置文件中的 druid 数据源属性到 com.alibaba.druid.pool.DruidDataSource从而让它们生效
* @ConfigurationProperties(prefix = "spring.datasource"):作用就是将 全局配置文件中
* 前缀为 spring.datasource的属性值注入到 com.alibaba.druid.pool.DruidDataSource 的同名参数中
*/
public DataSource druidDataSource() {
return new DruidDataSource();
}
}测试是否成功
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class SpringbootDataJdbcApplicationTests {
// DI注入数据源
DataSource dataSource;
public void contextLoads() throws SQLException {
// 查看默认数据源
System.out.println(dataSource.getClass());
// 获得连接
Connection connection = dataSource.getConnection();
System.out.println(connection);
DruidDataSource druidDataSource = (DruidDataSource) dataSource;
System.out.println("druidDataSource 数据源最大连接数:" + druidDataSource.getMaxActive());
System.out.println("druidDataSource 数据源初始化连接数:" + druidDataSource.getInitialSize());
// 关闭连接
connection.close();
}
}
3. 配置Druid数据源监控
Druid 数据源具有监控的功能,并提供了一个web界面方便用户查看,类似安装路由器时,人家也提供了一个默认的web页面。
所以第一步需要设置 Druid 的后台管理页面,比如登录账号、密码等;配置后台管理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24// 配置 Druid 监控管理后台的Servlet;
// 内置 Servlet 容器时没有web.xml文件,所以使用 Spring Boot 的注册 Servlet 方式
public ServletRegistrationBean statViewServlet() {
ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
// 这些参数可以在 com.alibaba.druid.support.http.StatViewServlet
// 的父类 com.alibaba.druid.support.http.ResourceServlet 中找到
Map<String, String> initParams = new HashMap<>();
initParams.put("loginUsername", "admin"); //后台管理界面的登录账号
initParams.put("loginPassword", "123456"); //后台管理界面的登录密码
// 后台允许谁可以访问
// initParams.put("allow", "localhost"):表示只有本机可以访问
// initParams.put("allow", ""):为空或者为null时,表示允许所有访问
initParams.put("allow", "");
// deny:Druid 后台拒绝谁访问
// initParams.put("kuangshen", "192.168.1.20");表示禁止此ip访问
// 设置初始化参数
bean.setInitParameters(initParams);
return bean;
}
配置监控filter过滤器(平时在工作中,按需求进行配置即可,主要用作监控!)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17// 配置 Druid 监控 之 web 监控的 filter
// WebStatFilter:用于配置Web和Druid数据源之间的管理关联监控统计
public FilterRegistrationBean webStatFilter() {
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(new WebStatFilter());
// exclusions:设置哪些请求进行过滤排除掉,从而不进行统计
Map<String, String> initParams = new HashMap<>();
initParams.put("exclusions", "*.js,*.css,/druid/*,/jdbc/*");
bean.setInitParameters(initParams);
// "/*" 表示过滤所有请求
bean.setUrlPatterns(Arrays.asList("/*"));
return bean;
}
4. 结果
三. 整合MyBatis
1. 配置数据源
pom.xml文件——导入MyBatis依赖
1
2
3
4
5
6<!--mybatis-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.1</version>
</dependency>application.properties文件——连接数据库,整合MyBatis
1
2
3
4
5
6
7
8spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
# 整合mybatis
mybatis.type-aliases-package=com.cc.pojo
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
2. 测试数据库是否成功连接
test文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
class Demo5MybatisApplicationTests {
//DI注入数据源
DataSource dataSource;
void contextLoads() {
//查看默认数据源
System.out.println(dataSource.getClass());
try {
System.out.println(dataSource.getConnection());
} catch (SQLException e) {
e.printStackTrace();
}
}
}
3. 创建实体类pojo——User类
导入lombok依赖
1
2
3
4
5<!--lombook-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>User.java文件
1
2
3
4
5
6
7
8
public class User {
private Integer id;
private String name;
private String pwd;
}
4. 创建接口mapper——UserMapper接口
UserMapper.java文件
声明controller中的方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20// @Mapper: 表示本类是一个 MyBatis 的 Mapper类
public interface UserMapper {
//查询用户的信息
List<User> queryUserList();
//通过id查询用户信息
User queryUserById(int id);
//增加用户信息
int addUser(User uer);
//更新用户
int updateUser(User user);
//删除用户
int deleteUser(int id);
}
5. 创建对应的mapper映射文件/maven配置资源过滤/指定文件路径
UserMapper.xml文件
resources
目录下新建mybatis.mapper
包,包下新建UserMapper.xml
文件1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<mapper namespace="com.cc.mapper.UserMapper">
<select id="queryUserList" resultType="User">
select * from user
</select>
<select id="queryUserById" resultType="User">
select * from user where id = #{id}
</select>
<insert id="addUser" parameterType="User">
insert into user (id,name,pwd) values (#{id},#{name},#{pwd})
</insert>
<update id="updateUser" parameterType="User">
update user set name=#{name},pwd=#{pwd} where id=#{id}
</update>
<delete id="deleteUser" parameterType="int">
delete from user where id = #{id}
</delete>
</mapper>
resultType与parameterType 的基本使用区别 :
resultType :主要针对于从数据库中提取相应的数据出来,用于指定sql输出的结果类型
- 基本数据类型
- pojo类型
parameterType:主要针对于将信息存入到数据库中,如:insert 增加数据到数据库,用于对应的mapper接口方法接受的参数类型
- 基本数据类型:int, string, long., Date
- 复杂数据类型:类和Map
pom.xml文件
1
2
3
4
5
6
7
8
9<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>application.properties文件
1
2
3
4# 对应实体类的路径
mybatis.type-aliases-package=com.cc.pojo
# 指定myBatis的核心配置文件与Mapper映射文件
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml
6. 创建controller层进行测试
UserController.java文件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
public class UserController {
private UserMapper userMapper;
//查询用户
public List<User> queryUserList(){
List<User> userList = userMapper.queryUserList();
for(User user : userList){
System.out.println(user);
}
return userList;
}
//添加一个用户
public String addUser(){
userMapper.addUser(new User(5,"阿狗","456789"));
return "ok";
}
//修改一个用户
public String updateUser(){
userMapper.updateUser(new User(1,"阿狗","789456"));
return "ok";
}
//根据id删除用户
public String deleteUser(){
userMapper.deleteUser(5);
return "ok";
}
}
四、三类方法总结
回顾这3种方法:整合JDBC是最简便,最易上手的;整合MyBatis是条理最清晰的,更有逻辑感;整合Druid更适合开发者,但上手较为繁琐
整合JDBC和整合MyBatis类似,但又各有不同:
JDBC的配置文件是——
application.yml
;MyBatis的配置文件是——application.properties
JDBC中的controller层既写业务层的操作,也写对数据库的操作;MyBatis中只写业务层操作
JDBC在controller中用自带的JdbcTemplate模板;MyBatis在controller中用UserMapper接口方法
整合JDBC只需在配置文件中连接数据库,在controller中写方法就OK了
整合MyBatis需要分:
- 实体类层
- mapper接口层
- mapper映射
- controller层
除此,还需要在
pom.xml文件
中配置资源过滤;在application.properties文件
指定实体类路径和映射文件路径、
五、MyBatis整合实验
尝试把demo3的员工部门项目连接一个数据库失败!目前还需要学习的地方还有很多,这个尝试在后面一定要完成!