第一章-mybatisPlus概述
1实体类注解
mybatisPlus实体类注解
@TableName 作用于表名上,解决表名和实体类名不一致
@TableId(value = “oid”, type = IdType.AUTO) 作用与字段上,指定主键字段名,类型。
@TableField(value="数据库字段名”,exist=false)
注解其他属性:exist=boolean 是否存在于数据库
3mybatis逆向工程
详细介绍:https://mp.baomidou.com/config/generator-config.html#service-2
重要:若使用通用mapper时候需要调整 SqlSessionFactory 为 MyBatis-Plus 的 SqlSessionFactory
1
2
3
|
<bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
</bean>
|
使用的mybatis-plus插件,功能强大,自动生成实体类。
全的pom.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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>3.3.1</version>
</dependency>
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.3.1.tmp</version>
</dependency>
<!-- 模板引擎 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.0</version>
</dependency>
<!--Lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.10</version>
</dependency>
<!-- 日志记录-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!-- 注意 当mapper.xml文件不在resource目录下 需要加入-->
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
|
1导包
集成mybatis-plus要把mybatis、mybatis-spring去掉,避免冲突,但需要mybatis-plus-generator
1
2
3
4
5
|
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus</artifactId>
<version>3.3.1</version>
</dependency>
|
MyBatis-Plus 从 3.0.3
之后移除了代码生成器与模板引擎的默认依赖,需要手动添加相关依赖:
1
2
3
4
5
|
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.3.1.tmp</version>
</dependency>
|
需要新建一个生成类的文件进行生成。
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
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
|
package com.lsl.util;
import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.po.TableFill;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import java.util.ArrayList;
public class GenerateCode {
public static void main(String[] args) {
// 需要构建一个 代码自动生成器 对象
AutoGenerator mpg = new AutoGenerator();
// 配置策略
// 1、全局配置
GlobalConfig gc = new GlobalConfig();
String projectPath = System.getProperty("user.dir");//获得当前用户的路径
gc.setOutputDir(projectPath+"/mybatis-study/mybatis4-plus/src/main/java");//前面两个是模块名 生成到当前路径的java文件下
gc.setAuthor("卢森林");
gc.setOpen(false);//是否打开资源管理器
gc.setFileOverride(false); // 是否覆盖
gc.setServiceName("%sService"); // 去Service的I前缀 %s会自动填充表实体名
gc.setIdType(IdType.AUTO);
gc.setDateType(DateType.ONLY_DATE);
//gc.setSwagger2(true); Swagger2接口文档
mpg.setGlobalConfig(gc);
//2、设置数据源
DataSourceConfig dsc = new DataSourceConfig();
//8.0要加上时区 serverTimezone=UTC
dsc.setUrl("jdbc:mysql://localhost:3306/mysql1?useSSL=false&useUnicode=true&characterEncoding=utf8");
//8.0 com.mysql.cj.jdbc.Driver
dsc.setDriverName("com.mysql.jdbc.Driver");
dsc.setUsername("root");
dsc.setPassword("123456");
dsc.setDbType(DbType.MYSQL);
mpg.setDataSource(dsc);
//3、包的配置
PackageConfig pc = new PackageConfig();
//pc.setModuleName("lx");//生成的包的路径 会在controller前加上lx,也会在parent设置的路径后加上.name
pc.setParent("com.lx");//生成包路径的父路径
pc.setEntity("entity");//实体类包的名称
pc.setMapper("mapper");
pc.setService("service");
pc.setController("controller");
mpg.setPackageInfo(pc);
//4、策略配置
StrategyConfig strategy = new StrategyConfig();
strategy.setInclude("zz_employee","zz_department"); //多表用逗号隔开,数组 输入表名,生成实体类,不写默认生成数据库所有的表
//strategy.setExclude("books");
strategy.setNaming(NamingStrategy.underline_to_camel);//表名策略,下划线转驼峰
strategy.setColumnNaming(NamingStrategy.underline_to_camel);//列名策略,下划线转驼峰
strategy.setEntityLombokModel(true); // 使用lombok;
strategy.setLogicDeleteFieldName("deleted");
// 自动填充配置
TableFill gmtCreate = new TableFill("gmt_create", FieldFill.INSERT);
TableFill gmtModified = new TableFill("gmt_modified",
FieldFill.INSERT_UPDATE);
ArrayList<TableFill> tableFills = new ArrayList<>();
tableFills.add(gmtCreate);
tableFills.add(gmtModified);
strategy.setTableFillList(tableFills);
// 乐观锁
strategy.setVersionFieldName("version");
strategy.setRestControllerStyle(false);//Rest风格的Controller
strategy.setControllerMappingHyphenStyle(false); //localhost:8080/hello_id_2
mpg.setStrategy(strategy);
mpg.execute(); //执行
}
}
|

4plus分页插件
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
|
<!--写法一:mybatis.xml中书写-->
<plugins>
<plugin interceptor="com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor" >
<!-- COUNT SQL 解析.可以没有 -->
<property name="countSqlParser" ref="countSqlParser"/>
</plugin>
</plugins>
<!--写法二:创建sqlsessionFactory时书写-->
<!-- 3.配置SqlSessionFactory对象 -->
<bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
<!-- 注入数据库连接池 -->
<property name="dataSource" ref="dataSource"/>
<!-- 配置MyBaties全局配置文件:mybatis-config.xml -->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<!--也可以不配置MyBatis全局配置文件,再这里说明-->
<property name="mapperLocations" value="classpath:com/lx/mapper/xml/*.xml"></property>
<property name="typeAliasesPackage" value="com.lx.entity"></property>
<property name="plugins">
<array>
<bean id="paginationInterceptor" class="com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor">
<!-- COUNT SQL 解析.可以没有 -->
<property name="countSqlParser" ref="countSqlParser"/>
</bean>
</array>
</property>
</bean>
|
java类中使用
1
2
3
4
5
6
7
8
9
10
11
|
//创建page对象
Page<ZzDepartment> page = new Page<>(1,3);
//创建wrapper
QueryWrapper<ZzDepartment> wrapper=new QueryWrapper<ZzDepartment>();
wrapper.orderByDesc("oid");
//调用分页方法
bean.page(page,wrapper);
//获得分页后的集合
page.getRecords();
|
当前分页无法进行连接查询
建议自行编写方法扩展
1ZzDepartmentMapper接口中编写方法IPage<ZzDepartment> selectPageDept(Page<?> page);
21ZzDepartmentMapper.xml配置文件中编写
1
2
3
|
<select id="selectPageDept" resultType="zzDepartment">
select * from zz_Department where oid>20
</select>
|
3service接口编写调用方法
IPage<ZzDepartment> findPageDept(Page<?> page);
4service实现类进行调用
1
2
3
4
5
6
7
|
@Autowired
ZzDepartmentMapper deptMapper;
@Override
public IPage<ZzDepartment> findPageDept(Page<?> page) {
return deptMapper.selectPageDept(page);
}
|
5Controller进行使用
1
2
3
4
5
6
|
QueryWrapper wrapper = new QueryWrapper();
Page<ZzDepartment> page = new Page<>(1,3);
deptService.findPageDept(page);
List<ZzDepartment> list = page.getRecords();
|
5service接口使用
调用service接口进行CRUD
通用 Service CRUD 封装IService接口,进一步封装 CRUD 采用 get 查询单行
remove 删除
list 查询集合
page 分页
前缀命名方式区分 Mapper
层避免混淆
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
47
48
49
50
51
52
53
54
55
56
57
58
|
public class ZzDepartmentServiceImplTest {
//serviceImpl测试
ZzDepartmentServiceImpl bean;
@Before
public void init(){
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
bean = context.getBean(ZzDepartmentServiceImpl.class);;
}
//增
@Test
public void save(){
ZzDepartment dept=new ZzDepartment();
dept.setDeptName("thursday");
bean.save(dept);
}
//删
@Test
public void delete(){
bean.removeById(45);//按照id删除一个
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("oid",47);
map.put("phone","123456");
bean.removeByMap(map);//多个条件 phone = ? AND oid = ?
}
//改
@Test
public void update(){
ZzDepartment dept=new ZzDepartment();
dept.setOid(19);
dept.setDeptName("总部");
UpdateWrapper<ZzDepartment> wrapper = new UpdateWrapper<ZzDepartment>();
wrapper.eq("oid",19);
bean.update(dept,wrapper);
}
//查询
@Test
public void find(){
//bean.list();
QueryWrapper<ZzDepartment> wrapper = new QueryWrapper<>();
//wrapper.groupBy("oid");
//wrapper.eq("oid",15);
//wrapper.orderBy(true,false,"oid");
// wrapper.order
//wrapper.like(boolean,"oid",15);//boolean条件是否生效
bean.list(wrapper);
}
}
|
6mapper使用
mapper使用的是insert,update,delete,select和service接口进行区分
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
public void mapperSave(){
//增加
ZzDepartment dept=new ZzDepartment();
dept.setDeptName("命名");
//mapper.insert(dept);
//删
QueryWrapper wrapper = new QueryWrapper();
wrapper.eq("oid",50);
mapper.delete(wrapper);
//查询
mapper.selectById(48);
//修改
QueryWrapper wrapper = new QueryWrapper();
wrapper.eq("phone",12345);
dept.setAddress("nonono");
mapper.update(dept,wrapper);//这里是批量修改,dept是修改的数据,mapper是修改条件
}
|
7修改注意
mybatis修改对象的时候,若某个属性为null,那么就不会进行修改。(要么前端传递参数为null,或者后端进行判断,再或者前端不传递该属性名)
若是json格式
若没有属性名称:则为空
若由属性名称:可以给Null,undefined。
最好是进行判断 Integer是不为Null不为0,String不为null不为””
第2章-pagehepler
1什么是pagehepler
文档教程https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md
2快速入门
1导入依赖
1
2
3
4
5
|
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.11</version>
</dependency>
|
2 配置拦截器插件
特别注意,新版拦截器是 com.github.pagehelper.PageInterceptor
。 com.github.pagehelper.PageHelper
现在是一个特殊的 dialect
实现类,是分页插件的默认实现类,提供了和以前相同的用法。
1. 在 MyBatis 配置 xml 中配置拦截器插件(还可以在spring中配置,具体看官网)
下面介绍两个常用属性。
helperDialect:分页插件会自动检测当前的数据库链接,自动选择合适的分页方式。 指定分页插件使用哪种方言。缩写值:oracle,mysql,mariadb,sqlite,hsqldb,postgresql,db2,sqlserver,informix,h2,sqlserver2012,derby
reasonable
:分页合理化参数,默认值为false
。当该参数设置为 true
时,pageNum<=0
时会查询第一页,pageNum>pages
(超过总数时),会查询最后一页。默认false
时,直接根据参数进行查询。
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
|
<!----------------mybatis.xml配置---------------------->
<?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>
<!--
plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下:
properties?, settings?,
typeAliases?, typeHandlers?,
objectFactory?,objectWrapperFactory?,
plugins?,
environments?, databaseIdProvider?, mappers?
-->
<settings>
<!--打印sql-->
<setting name="logImpl" value="org.apache.ibatis.logging.stdout.StdOutImpl"/>
</settings>
<plugins>
<!-- com.github.pagehelper为PageHelper类所在包名 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!-- 使用下面的方式配置参数,后面会有所有的参数介绍 -->
<property name="helperDialect" value="mysql"/>
<property name="reasonable" value="true"/>
</plugin>
</plugins>
</configuration>
<!----------------Spring配置---------------------->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 注意其他配置 -->
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<!--使用下面的方式配置参数,一行配置一个 -->
<value>
params=value1
</value>
</property>
</bean>
</array>
</property>
</bean>
|
3 在代码中使用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
//pagehepler分页展示所有商品
@RequestMapping(value = "/pageCommodity",method = RequestMethod.GET)
@ResponseBody
public PageInfo<Commodity> pageCommodity(Commodity commodity , HttpServletRequest request){
//设置开始页和每页个数
PageHelper.startPage(0,8);
//查询数据
List<Commodity> list = commodityService.list(null);
//获得当前分页对象 可以给出两参数
PageInfo<Commodity> pageInfo=new PageInfo<Commodity>(list);
return pageInfo;
}
|
返回json格式的数据
total总数据, list数据, pageNum当前页数, pagesize每页大小,
size当前数据个数,prePage上一页,pages总页数,
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
|
{
"total": 3, //总数据条数
"list": [
{
"id": 10,
"cid": 2202004082140450600,
"cname": "阿萨德",
"price": 0.02
},
{
"id": 12,
"cid": 4202004082149136400,
"cname": "了",
"price": 0.01
}
],
"pageNum": 1, //当前页
"pageSize": 8, //每页大小
"size": 3, //当前返回数据条数
"startRow": 1, //开始行
"endRow": 3, //结束行
"pages": 1, //总页数
"prePage": 0, //上一页
"nextPage": 0, //下一页
"isFirstPage": true, //属于第一页吗
"isLastPage": true,
"hasPreviousPage": false,
"hasNextPage": false,
"navigatePages": 8, //导航页码数 new PageInfo<Zhuanke>(list,导航页数);
"navigatepageNums": [
1
],
"navigateFirstPage": 1,
"navigateLastPage": 1
}
|
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
47
48
49
|
//当前页
private int pageNum;
//每页的数量
private int pageSize;
//当前页的数量
private int size;
//由于startRow和endRow不常用,这里说个具体的用法
//可以在页面中"显示startRow到endRow 共size条数据"
//当前页面第一个元素在数据库中的行号
private int startRow; //从0开始
//当前页面最后一个元素在数据库中的行号
private int endRow;
//总记录数
private long total;
//总页数
private int pages;
//结果集(每页显示的数据)
private List<T> list;
//第一页
private int firstPage;
//前一页
private int prePage;
//是否为第一页
private boolean isFirstPage = false;
//是否为最后一页
private boolean isLastPage = false;
//是否有前一页
private boolean hasPreviousPage = false;
//是否有下一页
private boolean hasNextPage = false;
//导航页码数
private int navigatePages;
//所有导航页号
private int[] navigatepageNums;
|
第三章-generator
2快速入门
pom.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
|
<!--加入Jia包-->
<!--代码生成-->
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
</dependencies>
<!--插件 注意版本,和configuration子标签的顺序-->
<plugins>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.5</version>
<configuration>
<verbose>true</verbose>
<configurationFile>src/main/resources/generatorConfig.xml</configurationFile>
<overwrite>true</overwrite>
</configuration>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.42</version>
</dependency>
</dependencies>
</plugin>
</plugins>
|
generatorConfig.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
31
32
33
34
35
36
37
|
<?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="suppressDate" value="true"/>
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/mysql1?useSSL=false&useUnicode=true&characterEncoding=utf8"
userId="root"
password="123456">
</jdbcConnection>
<!--生成entity类存放位置-->
<javaModelGenerator targetPackage="com.lsl.entity" targetProject="src/main/java">
</javaModelGenerator>
<!--生成映射文件存放位置-->
<sqlMapGenerator targetPackage="com.lsl.mapper.xml" targetProject="src/main/java">
<!-- <property name="enableSubPackages" value="true"/>-->
</sqlMapGenerator>
<!--生成Dao类存放位置-->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.lsl.mapper"
targetProject="src/main/java">
<!--<property name="enableSubPackages" value="true"/>-->
</javaClientGenerator>
<table tableName="zz_employee" domainObjectName="Employee">
</table>
</context>
</generatorConfiguration>
|
然后点击Maven插件,进行run就好了
若是ssm项目,进行测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
@Service
public class EmployeeServiceImpl {
@Autowired
EmployeeMapper empMapper;
public void t1(){
System.out.println("ssssss");
empMapper.selectByPrimaryKey(3);
}
}
//测试类进行测试
ApplicationContext context=new ClassPathXmlApplicationContext("applicationContext.xml");
bean = context.getBean(EmployeeServiceImpl.class);
bean.t1();
|
3方法Example
EmployeeExample生成的Example方法


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
//升序还是降序
//参数格式:字段+空格+asc(desc)
protected String orderByClause;
//去除重复
//true是选择不重复记录
protected boolean distinct;
//自定义查询条件
//Criteria的集合,集合中对象是由or连接
protected List<Criteria> oredCriteria;
//内部类Criteria包含一个Cretiron的集合,
//每一个Criteria对象内包含的Cretiron之间
//是由AND连接的
public static class Criteria extends GeneratedCriteria {
protected Criteria() {
super();
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
EmployeeExample example=new EmployeeExample();
//按照oid降序排列
example.setOrderByClause("oid desc");
//给一个限制条件 oid 小于等于6
EmployeeExample.Criteria criteria = example.createCriteria();
criteria.andOidLessThanOrEqualTo(6);//oid 小于等于6
//第二个限制条件 性别为男
criteria.andSexEqualTo("男");
//限制条件 模糊查询
criteria.andEmpnameLike("萨达所%");
//若查询条件为or 就创建多个criteria就好了
EmployeeExample.Criteria criteria1 = example.createCriteria();
criteria1.andSexEqualTo("女");
//条件多个 加个 example.or(criteria2);
EmployeeExample.Criteria criteria2 = example.createCriteria();
criteria2.andSexEqualTo("女");
example.or(criteria2);
empMapper.selectByExample(example);
|