Springboot+mybatis demo
新建springboot项目
添加依赖
org.springframework.boot
spring-boot-starter-test
test
org.springframework.boot
spring-boot-starter-jdbc
mysql
mysql-connector-java
runtime
配置application.yml
server:
port: 8081
spring:
datasource:
url: jdbc:mysql://xxxxx:3306/cyzfeb20?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
username: mysql
password: xxxxx
测试
在springboot自带的test类中输出datasource
@SpringBootTest
class JavaWebSbmb202003ApplicationTests {
@Autowired
DataSource dataSource;
@Test
void contextLoads() {
System.out.println(dataSource.getClass());
}
}
若配置正常,则会输出: class com.zaxxer.hikari.HikariDataSource
初识jdbcTemplate
(此步与配置springboot+mybatis无关, 可跳过)
springboot为我们提供了jdbctemplate, 作为一个轻量化的操作数据库的工具, 以下是详细介绍.
1、有了数据源(com.zaxxer.hikari.HikariDataSource),然后可以拿到数据库连接(java.sql.Connection),有了连接,就可以使用连接和原生的 JDBC 语句来操作数据库
2、即使不使用第三方第数据库操作框架,如 MyBatis等,Spring 本身也对原生的JDBC 做了轻量级的封装,即 org.springframework.jdbc.core.JdbcTemplate。
3、数据库操作的所有 CRUD 方法都在 JdbcTemplate 中。
4、Spring Boot 不仅提供了默认的数据源,同时默认已经配置好了 JdbcTemplate 放在了容器中,程序员只需自己注入即可使用
5、JdbcTemplate 的自动配置原理是依赖 org.springframework.boot.autoconfigure.jdbc 包下的 org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration 类
JdbcTemplate主要提供以下几类方法:
execute方法:可以用于执行任何SQL语句,一般用于执行DDL语句;
update方法及batchUpdate方法:update方法用于执行新增、修改、删除等语句;batchUpdate方法用于执行批处理相关语句;
query方法及queryForXXX方法:用于执行查询相关语句;
call方法:用于执行存储过程、函数相关语句。
在springboot主类父目录下, 新建controller包
并创建restcontroller
@RestController
public class IndexController {
//JdbcTemplate 是 core 包的核心类,用于简化 JDBC操作,还能避免一些常见的错误,如忘记关闭数据库连接
//Spring Boot 默认提供了数据源,默认提供了 org.springframework.jdbc.core.JdbcTemplate
//JdbcTemplate 中会自己注入数据源,使用起来也不用再自己来关闭数据库连接
JdbcTemplate jdbcTemplate;
@Autowired
public IndexController(JdbcTemplate jdbcTemplate){
this.jdbcTemplate = jdbcTemplate;
}
//查询user表中所有数据
//List 中的1个 Map 对应数据库的 1行数据
//Map 中的 key 对应数据库的字段名,value 对应数据库的字段值
@GetMapping("/userList")
public List
测试OK
自定义数据源 - 阿里巴巴DruidDataSource
优点:可视化+监控
依赖:https://mvnrepository.com/art...
com.alibaba
druid
1.1.12
在spring.datasource下, 添加type: com.alibaba.druid.pool.DruidDataSource
此时, 执行test类,会发现datasource已经变成了class com.alibaba.druid.pool.DruidDataSource
(可选) 在application.yml中, 添加druid参数
#spring.datasource下
#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
(可选) 添加log4j依赖
log4j
log4j
1.2.17
(重要) 创建Druid组件
现在需要程序员自己为 com.alibaba.druid.pool.DruidDataSource 绑定全局配置文件中的参数,再添加到容器中,而不再使用 Spring Boot 的自动生成了;我们需要 自己添加 DruidDataSource 组件到容器中,并绑定属性;
在主类兄弟节点创建config包,config下创建DruidConfiguration类
@Configuration
public class DruidConfiguration {
/*
将自定义的 Druid数据源添加到容器中,不再让 Spring Boot 自动创建
绑定全局配置文件中的 druid 数据源属性到 com.alibaba.druid.pool.DruidDataSource从而让它们生效
@ConfigurationProperties(prefix = "spring.datasource"):作用就是将 全局配置文件中
前缀为 spring.datasource的属性值注入到 com.alibaba.druid.pool.DruidDataSource 的同名参数中
*/
@ConfigurationProperties(prefix = "spring.datasource")
@Bean
public DataSource druidDataSource() {
return new DruidDataSource();
}
}
Test中测试一下
@Test
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();
}
测试OK
配置 Druid 数据源监控
Druid 数据源具有监控的功能,并提供了一个 web 界面方便用户查看,类似安装 路由器 时,人家也提供了一个默认的 web 页面。
所以第一步需要设置 Druid 的后台管理页面,比如 登录账号、密码 等;配置后台管理;
在之前创建的DruidConfiguration中, 新建一个bean
//配置 Druid 监控管理后台的Servlet;
//内置 Servler 容器时没有web.xml文件,所以使用 Spring Boot 的注册 Servlet 方式
@Bean
public ServletRegistrationBean statViewServlet() {
ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
Map 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("admin", "192.168.1.20");表示禁止此ip访问
//设置初始化参数
bean.setInitParameters(initParams);
return bean;
//这些参数可以在 com.alibaba.druid.support.http.StatViewServlet 的父类 com.alibaba.druid.support.http.ResourceServlet 中找到
}
重启项目后, 访问http://localhost:8081/druid/index.html 并使用bean中注册的用户名密码登陆,即可访问druid控制台.
配置druid的filter
这个过滤器会拦截所有和sql相关的操作并做处理. 比如sql访问时间,次数等等.
//配置 Druid 监控 之 web 监控的 filter
//WebStatFilter:用于配置Web和Druid数据源之间的管理关联监控统计
@Bean
public FilterRegistrationBean webStatFilter() {
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(new WebStatFilter());
//exclusions:设置哪些请求进行过滤排除掉,从而不进行统计
Map initParams = new HashMap<>();
initParams.put("exclusions", "*.js,*.css,/druid/*");
bean.setInitParameters(initParams);
//"/*" 表示过滤所有请求
bean.setUrlPatterns(Arrays.asList("/*"));
return bean;
springboot整合mybatis
导入依赖
注意: mybatis的依赖并不是由springboot提供, 看artificact名字可以看出来
org.mybatis.spring.boot
mybatis-spring-boot-starter
2.1.0
Mybatis配置需要三步
- 创建与数据库相同的实体类
- 创建这个实体类的mapper接口
添加application.yml中的配置
#指定myBatis的核心配置文件与Mapper映射文件
mybatis:
mapper-locations: classpath:mybatis/mapper/*.xml
# 注意:对应实体类的路径
type-aliases-package: pro.yizheng.core.vo
创建实体类
在配置中指定的包下创建
public class User {
private int id;
private String name;
private String pwd;
public User() {
}
public User(int id, String name, String pwd) {
this.id = id;
this.name = name;
this.pwd = pwd;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPwd() {
return pwd;
}
public void setPwd(String pwd) {
this.pwd = pwd;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", pwd='" + pwd + '\'' +
'}';
}
创建mapper接口
package pro.yizheng.core.mapper;
import org.apache.ibatis.annotations.Mapper;
import org.springframework.stereotype.Repository;
import pro.yizheng.core.vo.User;
import java.util.List;
//@Mapper : 表示本类是一个 MyBatis 的 Mapper,等价于以前 Spring 整合 MyBatis 时的 Mapper 接口
@Mapper
@Repository
public interface UserMapper {
//选择全部用户
List selectUser();
//根据id选择用户
User selectUserById(int id);
//添加一个用户
int addUser(User user);
//修改一个用户
int updateUser(User user);
//根据id删除用户
int deleteUser(int id);
创建mapper映射文件
在resource下新建mybatis.mapper
此xml文件名是否与java相同, 存疑
insert into user (id,name,pwd) values (#{id},#{name},#{pwd})
update user set name=#{name},pwd=#{pwd} where id = #{id}
delete from user where id = #{id}
更改controller
去掉jdbctemplate, 用usermapper取代
@Autowired
private UserMapper userMapper;
//选择全部用户
@GetMapping("/listUser")
public String selectUser(){
List users = userMapper.selectUser();
for (User user : users) {
System.out.println(user);
}
return "ok";
}
测试
OK