⭐⭐⭐ Spring Boot 项目实战 ⭐⭐⭐ Spring Cloud 项目实战
《Dubbo 实现原理与源码解析 —— 精品合集》 《Netty 实现原理与源码解析 —— 精品合集》
《Spring 实现原理与源码解析 —— 精品合集》 《MyBatis 实现原理与源码解析 —— 精品合集》
《Spring MVC 实现原理与源码解析 —— 精品合集》 《数据库实体设计合集》
《Spring Boot 实现原理与源码解析 —— 精品合集》 《Java 面试题 + Java 学习指南》

摘要: 原创出处 IT小村 「blog.csdn.net/larger5/article/details/81273287」欢迎转载,保留摘要,谢谢!


🙂🙂🙂关注**微信公众号:【芋道源码】**有福利:

  1. RocketMQ / MyCAT / Sharding-JDBC 所有源码分析文章列表
  2. RocketMQ / MyCAT / Sharding-JDBC 中文注释源码 GitHub 地址
  3. 您对于源码的疑问每条留言将得到认真回复。甚至不知道如何读源码也可以请教噢
  4. 新的源码解析文章实时收到通知。每周更新一篇左右
  5. 认真的源码交流微信群。

一 前言:

mybatis在持久层框架中还是比较火的,一般项目都是基于ssm。虽然mybatis可以直接在xml中通过SQL语句操作数据库,很是灵活。但正其操作都要通过SQL语句进行,就必须写大量的xml文件,很是麻烦。mybatis-plus就很好的解决了这个问题。

mybatis-plus简介。

Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。这是官方给的定义,关于mybatis-plus的更多介绍及特性,可以参考mybatis-plus官网。那么它是怎么增强的呢?其实就是它已经封装好了一些crud方法,我们不需要再写xml了,直接调用这些方法就行,就类似于JPA。

今天给大家分享在 DAO 层使用 MyBatisPlus的教程讲解。

官方API地址:https://mp.baomidou.com/#/?id=%E7%AE%80%E4%BB%8B

Mybatis-PLus 是 Mybatis 的增强工具包,只做增强不做改变,为简化开发工作、提高生产率而生。

图片图片

二、通用 CRUD

  • 通过本项目(表少,数据量大,非常适合)
  • 发现 MyBatisPlus 在单表 CRUD方面
  • 比原来的的 MyBatis 的有着绝对优势:

图片图片

下面列出本文相关代码,其他代码如 Druid数据源配置、MyBatisPlus分页配置、sql输出配置,可以到 github 上查看:

https://github.com/larger5/SpringBoot_MybatisPlus.git

图片图片

@RunWith(SpringRunner.class)
@SpringBootTest
public class PlusApplicationTests {

@Autowired
private UserMapper userMapper;

/**
* 1、增加 insert
*/
@Test
public void insertTest() {
User user = new User();
user.setUsername("绿茶");
user.setPassword("lvcha");
// 返回对数据库影响操作数:1
Integer insert1 = userMapper.insert(user); // 非空属性才会出现在 sql 中
// 可以立刻获取插入新记录的 id
System.out.println(user.getId());
// 同上
Integer insert2 = userMapper.insertAllColumn(user); // 所有属性都会出现在 sql 中
// 同上
System.out.println(user.getId());
}

/**
* 2、修改 update
*/
@Test
public void updateTest() {
User user = new User();
user.setId(45);
user.setUsername("cun");
//user.setPassword("666");
// 返回对数据库影响操作数:1
Integer integer1 = userMapper.updateById(user); // 属性空则不修改
System.out.println(integer1);
// 同上
Integer integer2 = userMapper.updateAllColumnById(user); // 属性空则字段空
System.out.println(integer2);
}

/**
* 3、查询 select
*/
@Test
public void selectTest() {
// 根据id 查询一条记录
User user = userMapper.selectById(46);
System.out.println(user.getUsername());

ArrayList<Integer> idList = new ArrayList<>();
idList.add(61);
idList.add(63);
// 根据多个id 批量查询
List<User> users = userMapper.selectBatchIds(idList);
System.out.println(users.get(0).getUsername() + users.get(1).getUsername());

User user1 = new User();
user1.setId(61);
user1.setUsername("cun");
// 根据多个条件返回一个对象,若有多个符合条件的记录则将报错
User user2 = userMapper.selectOne(user1);
System.out.println(user2.getPassword());

// 根据多个条件返回对象组,注意Map 中的key 必须和数据库表字段一直
HashMap<String, Object> columnMap = new HashMap<>();
columnMap.put("username", "cun");
List<User> users1 = userMapper.selectByMap(columnMap);
System.out.println(users1.size());


}

/**
* 4、删除 delete
*/
@Test
public void deleteTest() {
// 根据一个id 删除,返回对数据库影响操作数:1
Integer integer1 = userMapper.deleteById(65);// 根据id删除一条记录
System.out.println(integer1);

ArrayList<Integer> idList = new ArrayList<>(); // 根据id集合批量删除
idList.add(64);
idList.add(66);
// 根据多个id 批量删除,返回对数据库影响操作数:2
Integer integer2 = userMapper.deleteBatchIds(idList);
System.out.println(integer2);

HashMap<String, Object> columnMap = new HashMap<>();
columnMap.put("username", "cun");
// 根据多个条件删除,返回对数据库影响操作数
Integer integer3 = userMapper.deleteByMap(columnMap);
System.out.println(integer3);
}

/**
* 5、伪分页(获取全部数据再分页)
*/
@Test
public void pageTest() {
// 分页查询,注意如果设置了 PaginationInterceptor 分页插件则会报错,
List<User> users2 = userMapper.selectPage(new Page<User>(1, 2), null); //当前页、每页大小
System.out.println(users2.get(0).getUsername() + users2.get(1).getUsername());
System.out.println(users2.size());
}


/**
* 6、条件构造器
*/
@Test
public void wrapperTest(){
List<User> users = userMapper.selectList(new EntityWrapper<User>()
.eq("username", "linhongcun")
);
System.out.println(users.size());
}

}

三、代码生成器

上述的代码通过 MyBatisPlsus 自动写好的通用 Mapper 层,在 Service 层里边写相关的业务逻辑,其实,使用了 MyBatisPlus 代码生成器,自动生成 Entity、Dao、Service、Controller 层!

我们通常是在 Controller 层里边写相关的业务逻辑,使用的方法和 Mapper 的类似。

public class MpG {
public static void main(String[] args) {
//1. 全局配置
GlobalConfig config = new GlobalConfig();
config.setActiveRecord(false) // 是否支持AR模式
.setAuthor("linhongcun") // 作者
.setOutputDir("C:\\data\\mp") // 生成路径
.setFileOverride(true) // 文件覆盖
.setIdType(IdType.AUTO) // 主键策略
.setServiceName("%sService") // 设置生成的service接口的名字的首字母是否为I
// IUserService
.setBaseResultMap(true)
.setBaseColumnList(true);

//2. 数据源配置
DataSourceConfig dsConfig = new DataSourceConfig();
dsConfig.setDbType(DbType.MYSQL) // 设置数据库类型
.setDriverName("com.mysql.jdbc.Driver")
.setUrl("jdbc:mysql://120.79.197.130:3307/testspring?useSSL=true&verifyServerCertificate=false&allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8")
.setUsername("root")
.setPassword("123");

//3. 策略配置
StrategyConfig stConfig = new StrategyConfig();
stConfig.setCapitalMode(true) //全局大写命名
.setDbColumnUnderline(true) // 指定表名 字段名是否使用下划线
.setNaming(NamingStrategy.underline_to_camel) // 数据库表映射到实体的命名策略
.setTablePrefix("tb_")
.setInclude("tb_user"); // 生成的表

//4. 包名策略配置
PackageConfig pkConfig = new PackageConfig();
pkConfig.setParent("com.cun.plus")
.setMapper("mapper")
.setService("service")
.setController("controller")
.setEntity("entity")
.setXml("mapper");

//5. 整合配置
AutoGenerator ag = new AutoGenerator();
ag.setGlobalConfig(config)
.setDataSource(dsConfig)
.setStrategy(stConfig)
.setPackageInfo(pkConfig);

//6. 执行
ag.execute();
}
}

四、相关依赖

// 选择 freemarker 引擎,默认 Veloctiy
// mpg.setTemplateEngine(new FreemarkerTemplateEngine());
<!-- mybatis-plus-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>2.3</version>
</dependency>
<!-- 代码生成器默认使用如下模版引擎 -->
<dependency>
<groupId>org.apache.velocity</groupId>
<artifactId>velocity-engine-core</artifactId>
<version>2.0</version>
</dependency>

最后大家注意下:

使用 MyBatis 的一个弊端,就是得依靠使用代码生成器,使得逻辑基本写在 controller 层,而不是 service 层,不合时宜。

文章目录
  1. 1. 一 前言:
  2. 2. 二、通用 CRUD
  3. 3. 三、代码生成器
  4. 4. 四、相关依赖