Hello,明天给各位童鞋们分享 Spring Boot,连忙拿出小本子记下来吧!
Spring Boot 整合 Druid
概述
Druid 是阿里巴巴开源平台上的一个我的项目,整个我的项目由数据库连接池、插件框架和 SQL 解析器组成。该我的项目次要是为了扩大 JDBC 的一些限度,能够让程序员实现一些非凡的需要,比方向密钥服务申请凭证、统计 SQL 信息、SQL 性能收集、SQL 注入查看、SQL 翻译等,程序员能够通过定制来实现本人须要的性能。
Druid 是目前最好的数据库连接池,在性能、性能、扩展性方面,都超过其余数据库连接池,包含 DBCP、C3P0、BoneCP、Proxool、JBoss DataSource。Druid 曾经在阿里巴巴部署了超过 600 个利用,通过多年生产环境大规模部署的严苛考验。Druid 是阿里巴巴开发的号称为监控而生的数据库连接池!
引入依赖
在 pom.xml 文件中引入 druid-spring-boot-starter 依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
引入数据库连贯依赖
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
配置 application.yml
在 application.yml 中配置数据库连贯
spring:
datasource:
url: jdbc:mysql://ip:port/dbname?useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: 123456
type: com.alibaba.druid.pool.DruidDataSource
initial-size: 1
min-idle: 1
max-active: 20
test-on-borrow: true
# MySQL 8.x: com.mysql.cj.jdbc.Driver
driver-class-name: com.mysql.jdbc.Driver
MySQL 服务应用 docker 容器开启
Spring Boot 整合 tk.mybatis
tk.mybatis 是在 MyBatis 框架的根底上提供了很多工具,让开发更加高效
在 pom.xml 文件中引入 mapper-spring-boot-starter 依赖,该依赖会主动引入 MyBaits 相干依赖
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>2.0.2</version>
配置 MyBatis
mybatis:
type-aliases-package: 实体类的寄存门路,如:com.zysheep.spring.boot.mybatis.entity
mapper-locations: classpath:mapper/*.xml
创立一个通用的父级接口
次要作用是让 DAO 层的接口继承该接口,以达到应用 tk.mybatis 的目标, 特地留神: 该接口不能被扫描到,否则会出错
package tk.mybatis;
import tk.mybatis.mapper.common.Mapper;
import tk.mybatis.mapper.common.MySqlMapper;
/**
* 本人的 Mapper
* @author:zysheep
* @date:Created in 2020/1/11 22:49
* @description:${description}
* @version: ${version}$
*/
public interface MyMapper<T> extends Mapper<T>, MySqlMapper<T> {
}
Spring Boot 整合 PageHelper
PageHelper 是 Mybatis 的分页插件,反对多数据库、多数据源。能够简化数据库的分页查问操作,整合过程也极其简略,只需引入依赖即可。
在 pom.xml 文件中引入 pagehelper-spring-boot-starter 依赖
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.5</version>
应用 MyBatis 的 Maven 插件生成代码
咱们无需手动编写 实体类、DAO、XML 配置文件,只须要应用 MyBatis 提供的一个 Maven 插件就能够主动生成所需的各种文件便可能满足根本的业务需要,如果业务比较复杂只须要批改相干文件即可。
配置插件
在 pom.xml 文件中减少 mybatis-generator-maven-plugin 插件,configurationFile:主动生成所需的配置文件门路
主动生成的配置
在 src/main/resources/generator/ 目录下创立 generatorConfig.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>
<!– 引入数据库连贯配置 –>
<properties resource=”jdbc.properties”/>
<context id=”Mysql” targetRuntime=”MyBatis3Simple” defaultModelType=”flat”>
<property name=”beginningDelimiter” value=”`”/>
<property name=”endingDelimiter” value=”`”/>
<!– 配置 tk.mybatis 插件 –>
<plugin type=”tk.mybatis.mapper.generator.MapperPlugin”>
<property name=”mappers” value=”cn.tk.mybatis.MyMapper”/>
</plugin>
<!– 配置数据库连贯 –>
<jdbcConnection
driverClass=”${jdbc.driverClass}”
connectionURL=”${jdbc.connectionURL}”
userId=”${jdbc.username}”
password=”${jdbc.password}”>
</jdbcConnection>
<!– 配置实体类寄存门路 –>
<javaModelGenerator targetPackage=”cn.panyucable.pojo” targetProject=”src/main/java”/>
<!– 配置 XML 寄存门路 –>
<sqlMapGenerator targetPackage=”mapper” targetProject=”src/main/resources”/>
<!– 配置 DAO 寄存门路 –>
<javaClientGenerator
targetPackage=”cn.panyucable.mapper”
targetProject=”src/main/java”
type=”XMLMAPPER”/>
<!– 配置须要指定生成的数据库和表,% 代表所有表 –>
<table catalog=”panyucable_cn” tableName=”%”>
<!– mysql 配置 –>
<generatedKey column=”id” sqlStatement=”Mysql” identity=”true”/>
</table>
</context>
</generatorConfiguration>
配置数据源
在 src/main/resources 目录下创立 jdbc.properties
数据源配置:
# MySQL 8.x: com.mysql.cj.jdbc.Driver
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.connectionURL=jdbc:mysql://ip:port/dbname?useUnicode=true&characterEncoding=utf-8&useSSL=false
jdbc.username=root
jdbc.password=root
插件主动生成命令
mvn mybatis-generator:generate
测试 MyBatis 操作数据库
应用 tk.mybatis 操作数据库
批改入口类
创立测试类
@RunWith(SpringRunner.class)
@SpringBootTest(classes = HelloSpringBootApplication.class)
@Transactional
@Rollback
public class MyBatisTests {
/**
* 注入数据查问接口
*/
@Autowired
private TbUserMapper tbUserMapper;
* 测试插入数据
@Test
public void testInsert() {
// 结构一条测试数据
TbUser tbUser = new TbUser();
tbUser.setUsername(“Lusifer”);
tbUser.setPassword(“123456”);
tbUser.setPhone(“15888888888”);
tbUser.setEmail(“topsale@vip.qq.com”);
tbUser.setCreated(new Date());
tbUser.setUpdated(new Date());
// 插入数据
tbUserMapper.insert(tbUser);
}
* 测试删除数据
public void testDelete() {
// 结构条件,等同于 DELETE from tb_user WHERE username = ‘Lusifer’
Example example = new Example(TbUser.class);
example.createCriteria().andEqualTo(“username”, “Lusifer”);
// 删除数据
tbUserMapper.deleteByExample(example);
* 测试批改数据
public void testUpdate() {
// 结构条件
tbUser.setUsername(“LusiferNew”);
// 批改数据
tbUserMapper.updateByExample(tbUser, example);
* 测试查问汇合
public void testSelect() {
List<TbUser> tbUsers = tbUserMapper.selectAll();
for (TbUser tbUser : tbUsers) {
System.out.println(tbUser.getUsername());
}
* 测试分页查问
public void testPage() {
// PageHelper 应用非常简单,只须要设置页码和每页显示笔数即可
PageHelper.startPage(0, 2);
// 设置分页查问条件
PageInfo<TbUser> pageInfo = new PageInfo<>(tbUserMapper.selectByExample(example));
// 获取查问后果
List<TbUser> tbUsers = pageInfo.getList();
// 当前页
private int pageNum;
// 每页的数量
private int pageSize;
// 当前页的数量
private int size;
// 因为 startRow 和 endRow 不罕用,这里说个具体的用法
// 能够在页面中 ” 显示 startRow 到 endRow 共 size 条数据 ”
// 以后页面第一个元素在数据库中的行号
private int startRow;
// 以后页面最初一个元素在数据库中的行号
private int endRow;
// 总记录数
private long total;
// 总页数
private int pages;
// 后果集
private List<T> list;
// 前一页
private int prePage;
// 下一页
private int nextPage;
// 是否为第一页
private boolean isFirstPage = false;
// 是否为最初一页
private boolean isLastPage = false;
// 是否有前一页
private boolean hasPreviousPage = false;
// 是否有下一页
private boolean hasNextPage = false;
// 导航页码数
private int navigatePages;
// 所有导航页号
private int[] navigatepageNums;
// 导航条上的第一页
private int navigateFirstPage;
// 导航条上的最初一页
private int navigateLastPage;
TkMybatis 的罕用办法介绍
Select
List select(T record);
依据实体中的属性值进行查问,查问条件应用等号
T selectByPrimaryKey(Object key);
依据主键字段进行查问,办法参数必须蕴含残缺的主键属性,查问条件应用等号
List selectAll();
查问全副后果,select(null)办法能达到同样的成果
T selectOne(T record);
依据实体中的属性进行查问,只能有一个返回值,有多个后果是抛出异样,查问条件应用等号
int selectCount(T record);
依据实体中的属性查问总数,查问条件应用等号
Insert
int insert(T record);
保留一个实体,null 的属性也会保留,不会应用数据库默认值
int insertSelective(T record);
保留一个实体,null 的属性不会保留,会应用数据库默认值
Update
int updateByPrimaryKey(T record);
依据主键更新实体全副字段,null 值会被更新
int updateByPrimaryKeySelective(T record);
依据主键更新属性不为 null 的值
Delete
int delete(T record);
依据实体属性作为条件进行删除,查问条件应用等号
int deleteByPrimaryKey(Object key);
依据主键字段进行删除,办法参数必须蕴含残缺的主键属性
Example 办法
List selectByExample(Object example);
依据 Example 条件进行查问
重点: 这个查问反对通过 Example 类指定查问列,通过 selectProperties 办法指定查问列
int selectCountByExample(Object example);
依据 Example 条件进行查问总数
int updateByExample(@Param(“record”) T record, @Param(“example”) Object example);
依据 Example 条件更新实体 record 蕴含的全副属性,null 值会被更新
int updateByExampleSelective(@Param(“record”) T record, @Param(“example”) Object example);
依据 Example 条件更新实体 record 蕴含的不是 null 的属性值
int deleteByExample(Object example);
依据 Example 条件删除数据
Example 应用办法详解
Example 用于增加条件,相当 where 前面的局部
作用:
example
用来放一些去重,排序,分类,分页等信息
criteria
用来传字段参数
罕用的办法及应用阐明:
首先进行初始化:
Example example = new Example(实体类.class);
Example.Criteria criteria = example.createCriteria();
增加升序排列条件,DESC 为降序:
example.setOrderByClause(“ 字段名 ASC”);
去除反复,boolean 型,true 为抉择不反复的记录:
example.setDistinct(false)
增加字段 xxx 为 null 的条件:
criteria.andXxxIsNull
增加字段 xxx 不为 null 的条件:
criteria.andXxxIsNotNull
增加 xxx 字段等于 value 条件:
criteria.andXxxEqualTo(value)
增加 xxx 字段不等于 value 条件:
criteria.andXxxNotEqualTo(value)
增加 xxx 字段大于 value 条件:
criteria.andXxxGreaterThan(value)
增加 xxx 字段大于等于 value 条件:
criteria.andXxxGreaterThanOrEqualTo(value)
增加 xxx 字段小于 value 条件:
criteria.andXxxLessThan(value)
增加 xxx 字段小于等于 value 条件:
criteria.andXxxLessThanOrEqualTo(value)
增加 xxx 字段值在 List<?> 条件:
criteria.andXxxIn(List<?>)
增加 xxx 字段值不在 List<?> 条件:
criteria.andXxxNotIn(List<?>)
增加 xxx 字段值为 value 的含糊查问条件:
criteria.andXxxLike(“%”+value+”%”)
增加 xxx 字段值不为 value 的含糊查问条件:
criteria.andXxxNotLike(“%”+value+”%””)
增加 xxx 字段值在 value1 和 value2 之间条件:
criteria.andXxxBetween(value1,value2)
增加 xxx 字段值不在 value1 和 value2 之间条件:
criteria.andXxxNotBetween(value1,value2)
须要留神的点:
首先要生成实例化及实例对应的 example,而后记住肯定要先初始化;
应用 and 和 or 办法进行判断时,“与”、“或”的逻辑关系分清,避免出现拿数据时呈现反复拿或者逻辑抵触拿不到的状况;
mapper.selectByExample()办法外面应该传入的参数是 example 对象, 而非其余的。
附:残缺的 POM
<?xml version=”1.0″ encoding=”UTF-8″?>
<project xmlns=”http://maven.apache.org/POM/4.0.0″ xmlns:xsi=”http://www.w3.org/2001/XMLSchema-instance”
xsi:schemaLocation=”http://maven.apache.org/POM/4.0.0