mybatis-plus - 初识
一. 集成
pom.xml
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.12</version>
</dependency> <dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
</dependency> <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
application.yml
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/deco?characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&allowMultiQueries=true&useSSL=false
username: root
password: 123456 mybatis-plus:
mapper-locations: /mapper/*.xml,/mapper/**/*.xml
configuration:
map-underscore-to-camel-case: false
UserMapper.xml
<?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.study.demo.mybatisplus.mapper.UserMapper"> </mapper>
UserMapper.java
@Repository
public interface UserMapper extends BaseMapper<User> { }
User.java
@TableName("user")
public class User extends Model<User> {
@TableId(value = "id", type = IdType.AUTO)
private Long id;
private String name;
private Integer age;
private String email;
private SexEnum sex;
......
}
SexEnum.java
public enum SexEnum {
Male("Male", "男"),
Female("Female", "女");
private String code;
private String desc;
......
}
MybatisplusApplication.java
@SpringBootApplication
@MapperScan("com.study.demo.mybatisplus")
public class MybatisplusApplication {
public static void main(String[] args){
SpringApplication.run(MybatisplusApplication.class, args);
}
}
Service 我这里省略掉了.
到这里位置, 已经可以使用了. 在测试方法里面点一下:

可以看到, 这里自带了很多方法. 这样在单表操作的时候, 就不需要我们自己写方法了, 用 mybatis-plus 提供的方法, 还是比较省时间的.
二. pageSearch
mybatis-plus在我使用的这个版本里面, 是带有分页功能的, 但是需要进行一个配置:
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor page = new PaginationInterceptor();
page.setDialectType("mysql");
return page;
}
有了这个配置之后, 就可以使用自带的 selectPage() 方法了. 测试方法:
@Test
public void testSelect(){
System.out.println("page query");
Page page = new Page(1, 5);
IPage pageList = userMapper.selectPage(page, new QueryWrapper<User>().eq("age", 11));
System.out.println(pageList);
}
打印日志:
page query
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@65bb9029] was not registered for synchronization because synchronization is not active
JDBC Connection [com.mysql.jdbc.JDBC4Connection@566d0c69] will not be managed by Spring
JsqlParserCountOptimize sql=SELECT id,name,age,email,sex FROM user WHERE age = ?
==> Preparing: SELECT COUNT(1) FROM user WHERE age = ?
==> Parameters: 11(Integer)
<== Columns: COUNT(1)
<== Row: 11
==> Preparing: SELECT id,name,age,email,sex FROM user WHERE age = ? LIMIT 0,5
==> Parameters: 11(Integer)
<== Columns: id, name, age, email, sex
<== Row: 2, uxnwx, 11, uxnwx@qq.com, Female
<== Row: 10, qksyk, 11, qksyk@qq.com, Female
<== Row: 11, 5gffb, 11, 5gffb@qq.com, Female
<== Row: 12, lum96, 11, lum96@qq.com, Male
<== Row: 13, 4odsz, 11, 4odsz@qq.com, Female
<== Total: 5
三. UpdateAllColumnById()
mybatis-plus 2.x的时候还有这个方法, 但是3.x的时候, 把这个方法干掉了. 那要么在使用这个方法的时候, 自己写一个, 要么就是写一个通用的.
//MyBaseMapper.java
public interface MyBaseMapper<T> extends BaseMapper<T> {
void updateAllColumnById(@Param(Constants.ENTITY) T entity);
} //UpdateAllColumnById.java
public class UpdateAllColumnById extends AbstractMethod {
private static Logger log = LoggerFactory.getLogger(UpdateAllColumnById.class); @Override
public MappedStatement injectMappedStatement(final Class<?> mapperClass, final Class<?> modelClass, final TableInfo tableInfo) {
MySqlMethod sqlMethod = MySqlMethod.UPDATE_ALL_COLUMN_BY_ID; // 反射修改fieldFill值为update
final List<TableFieldInfo> fieldList = tableInfo.getFieldList();
for (final TableFieldInfo tableFieldInfo : fieldList) {
final Class<? extends TableFieldInfo> aClass = tableFieldInfo.getClass();
try {
final Field fieldFill = aClass.getDeclaredField("fieldFill");
fieldFill.setAccessible(true);
fieldFill.set(tableFieldInfo, FieldFill.UPDATE);
}
catch (final NoSuchFieldException e) {
log.error("获取fieldFill失败", e);
}
catch (final IllegalAccessException e) {
log.error("设置fieldFill失败", e);
}
} final String sql = String.format(sqlMethod.getSql(),
tableInfo.getTableName(),
this.sqlSet(false, false, tableInfo, Constants.ENTITY_SPOT),
tableInfo.getKeyColumn(),
Constants.ENTITY_SPOT + tableInfo.getKeyProperty(),
//sqlWhereEntityWrapper(tableInfo)
new StringBuilder("<if test=\"et instanceof java.util.Map\">")
.append("<if test=\"et.MP_OPTLOCK_VERSION_ORIGINAL!=null\">")
.append(" AND ${et.MP_OPTLOCK_VERSION_COLUMN}=#{et.MP_OPTLOCK_VERSION_ORIGINAL}")
.append("</if></if>")
);
final SqlSource sqlSource = this.languageDriver.createSqlSource(this.configuration, sql, modelClass);
return this.addUpdateMappedStatement(mapperClass, modelClass, sqlMethod.getMethod(), sqlSource);
}
} //LogicUpdateAllColumnById.java
public class LogicUpdateAllColumnById extends AbstractLogicMethod { private static Logger log = LoggerFactory.getLogger(LogicUpdateAllColumnById.class); @Override
public MappedStatement injectMappedStatement(final Class<?> mapperClass, final Class<?> modelClass, final TableInfo tableInfo) {
final String sql;
final boolean logicDelete = tableInfo.isLogicDelete();
final SqlMethod sqlMethod = SqlMethod.LOGIC_UPDATE_ALL_COLUMN_BY_ID;
final StringBuilder append = new StringBuilder("<if test=\"et instanceof java.util.Map\">")
.append("<if test=\"et.").append(OptimisticLockerInterceptor.MP_OPTLOCK_VERSION_ORIGINAL).append("!=null\">")
.append(" AND ${et.").append(OptimisticLockerInterceptor.MP_OPTLOCK_VERSION_COLUMN)
.append("}=#{et.").append(OptimisticLockerInterceptor.MP_OPTLOCK_VERSION_ORIGINAL).append(StringPool.RIGHT_BRACE)
.append("</if></if>");
if (logicDelete) {
append.append(tableInfo.getLogicDeleteSql(true, false));
} // 反射修改fieldFill值为update
final List<TableFieldInfo> fieldList = tableInfo.getFieldList();
for (final TableFieldInfo tableFieldInfo : fieldList) {
final Class<? extends TableFieldInfo> aClass = tableFieldInfo.getClass();
try {
final Field fieldFill = aClass.getDeclaredField("fieldFill");
fieldFill.setAccessible(true);
fieldFill.set(tableFieldInfo, FieldFill.UPDATE);
} catch (final NoSuchFieldException e) {
log.error("获取fieldFill失败", e);
} catch (final IllegalAccessException e) {
log.error("设置fieldFill失败", e);
} }
sql = String.format(sqlMethod.getSql(), tableInfo.getTableName(),
this.sqlSet(logicDelete, false, tableInfo, Constants.ENTITY_SPOT),
tableInfo.getKeyColumn(), Constants.ENTITY_SPOT + tableInfo.getKeyProperty(),
append);
final SqlSource sqlSource = this.languageDriver.createSqlSource(this.configuration, sql, modelClass);
return this.addUpdateMappedStatement(mapperClass, modelClass, sqlMethod.getMethod(), sqlSource);
}
} //MySqlMethod.java
public enum MySqlMethod {
UPDATE_ALL_COLUMN_BY_ID("updateAllColumnById", "根据ID 选择修改数据", "<script>\nUPDATE %s %s WHERE %s=#{%s} %s\n</script>"); private final String method;
private final String desc;
private final String sql; MySqlMethod(String method, String desc, String sql) {
this.method = method;
this.desc = desc;
this.sql = sql;
} public String getMethod() {
return method;
} public String getDesc() {
return desc;
} public String getSql() {
return sql;
}
} //CustomSqlInjector.java
public class CustomSqlInjector extends AbstractSqlInjector {
@Override
public List<AbstractMethod> getMethodList() {
return Stream.of(
new Delete(),
new DeleteBatchByIds(),
new DeleteById(),
new DeleteByMap(),
new Insert(),
new SelectBatchByIds(),
new SelectById(),
new SelectByMap(),
new SelectCount(),
new SelectList(),
new SelectMaps(),
new SelectMapsPage(),
new SelectObjs(),
new SelectOne(),
new SelectPage(),
new Update(),
new UpdateById(),
new UpdateAllColumnById()
).collect(Collectors.toList());
}
} //CustomLogicSqlInjector.java
public class CustomLogicSqlInjector extends AbstractSqlInjector {
@Override
public List<AbstractMethod> getMethodList() {
return Stream.of(
new Insert(),
new LogicDelete(),
new LogicDeleteByMap(),
new LogicDeleteById(),
new LogicDeleteBatchByIds(),
new LogicUpdate(),
new LogicUpdateById(),
new LogicUpdateAllColumnById(),
new LogicSelectById(),
new LogicSelectBatchByIds(),
new LogicSelectByMap(),
new LogicSelectOne(),
new LogicSelectCount(),
new LogicSelectMaps(),
new LogicSelectMapsPage(),
new LogicSelectObjs(),
new LogicSelectList(),
new LogicSelectPage()
).collect(Collectors.toList());
}
}
接下来就是进行配置:
@Bean
public ISqlInjector sqlInjector() {
return new CustomSqlInjector();
}
UserMapper.java也需要跟着修改一下:
@Repository
public interface UserMapper extends MyBaseMapper<User> { }
这样, 就可以使用 UpdateAllColumnById() 这个方法了. 同样的, 如果有别的通用方法想加, 也可以通过以上方法进行修改新增即可.
mybatis-plus - 初识的更多相关文章
- mybatis入门--初识mybatis
初识mybatis 今天,一起来说说mybits这个框架吧.这是一个持久层的框架.之前叫做ibatis.所以,在它的代码中出现ibatis这个词的时候,不要感到惊讶.不是写错了,它确实就是这个样子的. ...
- 【MyBatis】-----初识【MyBatis】
一.核心配置文件 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration ...
- 初识mybatis(二)
上篇博客我们介绍通过Java代码来创建mybatis的配置文件,港真,这种方式看起来有意思实际在开发中用的并不多,mybatis的配置还是以xml配置为主,本文我们就来看看如何通过xml文件来配置my ...
- MyBatis 框架系列之基础初识
MyBatis 框架系列之基础初识 1.什么是 MyBatis MyBatis 本是 apache 的一个开源项目 iBatis,后改名为 MyBatis,它 是一个优秀的持久层框架,对 jdbc 的 ...
- MyBatis For .NET学习- 初识MyBatis
MyBatis的框架. Introduction MyBatis本是apache的一个开源项目iBatis,2010年这个项目由 apache software foundation迁移到了googl ...
- 初识Mybatis之工程搭建
简介:MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以使用简单的 ...
- MyBatis学习01(初识MyBatis和CRUD操作实现)
1.初识MyBatis 环境说明: jdk 8 + MySQL 5.7.19 maven-3.6.1 IDEA 学习前需要掌握: JDBC MySQL Java 基础 Maven Junit 什么是M ...
- 初识Mybatis框架,实现增删改查等操作(动态拼接和动态修改)
此第一次接触Mybatis框架确实是有点不适应,特别是刚从Hibernate框架转转型过来,那么为什么要使用Mybatis框架,Mybatis框架和Hibernate框架又有什么异同呢? 这个问题在我 ...
- 初识MyBatis
ORM:对象关系映射,它只是一种规则. 像MyBatis,Hibernate对jdbc进行了封装. 第一章 回顾JDBC开发 1.优点:简单易学,上手快,非常灵活构建SQL(自己写的),效率高.2.缺 ...
- 初识Mybatis框架,实现增删改查等操作
此第一次接触Mybatis框架确实是有点不适应,特别是刚从Hibernate框架转转型过来,那么为什么要使用Mybatis框架,Mybatis框架和Hibernate框架又有什么异同呢? 这个问题在我 ...
随机推荐
- python 3.6 安装 opencv 3.4
一种说法是,到opencv官网下载相应的版本opencv,解压,把cv2.pyd放到 python安装文件夹下的\Lib\site-packages里即可, 此时import cv2即可成功 我的没有 ...
- 移动Web开发-WebApp(flex布局+移动端导航案例)
实际开发中的像素:css像素设备像素比dpr=设备像素/css像素标清屏dpr=1 高清屏dpr=2缩放改变的是css像素大小PPI(每英寸的物理像素点)=根号(屏幕横向分辨率²+屏幕纵向分辨率²)/ ...
- 洛谷【P1595 信封问题】 题解
题目链接 https://www.luogu.org/problem/P1595 题目描述 某人写了n封信和n个信封,如果所有的信都装错了信封.求所有信都装错信封共有多少种不同情况. 输入格式 一个信 ...
- SAP 登录Fiori的user和登录WEB UI的business role之间的关系。
SAP 登录FIORI的user 会被assign 一些控制前端app显示的business role(是一些PFCG role的集合),该business role和登录web ui选择的S4C_S ...
- 在W10系统中配置Java环境变量后,cmd命令提示符找不到java
java环境变量配置在W10系统上和以前有所区别,可能是W10版本导致也可能是W10一开始就出问题. 问题的表现就是你在环境变量里已经配置完JAVA_HOME,CLASSPATH,path之后在控制台 ...
- java - synchronized与lock的区别
synchronized与lock的区别 原始构成 synchronized是关键字属于JVM层面 monitorenter(底层是通过monitor对象来完成,其实wait/notify等对象也依赖 ...
- itchat 爬了爬自己的微信通讯录
参考 一件有趣的事: 爬了爬自己的微信朋友 忘记从谁那里看到的了,俺也来试试 首先在annconda prompt里面安装了itchat包 pip install itchat 目前对python这里 ...
- Java_Day4(上)
Java learning_Day3(上) 本人学习视频用的是马士兵的,也在这里献上 <链接:https://pan.baidu.com/s/1qKNGJNh0GgvlJnitTJGqgA> ...
- Codeforce 141A - Amusing Joke (sort)
So, the New Year holidays are over. Santa Claus and his colleagues can take a rest and have guests a ...
- 转载:openmax基本概念
https://yellowmax.blog.csdn.net/article/details/78080168 https://yellowmax.blog.csdn.net/article/det ...