从JPAController到MyBatis-Plus CRUD(增删改查)
从Hibernate到MyBatis
对数据库的增删改查操作
sql语句:
1 | --增 |
这篇博客中的代码环境
准备MySql数据库,建立数据表user
1
2
3
4
5
6
7CREATE TABLE user
(
user_id BIGINT(20) NOT NULL COMMENT 'ID',
user_name VARCHAR(30) NULL DEFAULT NULL COMMENT 'name',
user_age INT(11) NULL DEFAULT NULL COMMENT 'age',
PRIMARY KEY (user_id)
) charset = utf8;
一、传统Java开发中
1、在没有框架封装这些sql语句的时候
在Service层中写CRUD的方法
1
2
3
4
5
6
7
8
9
10protected EntityManager em;
/**
* 查找所有用户
*/
public List<Module> findAllUser(){
TypedQuery<Module> q =
em.createQuery("SELECT u FROM User u", User.class);
return q.getResultList();
}在业务代码中调用
1
2
3
4
5
6
7EntityManagerFactory emf = Persistence.createEntityManagerFactory("UserPU");
EntityManager em = emf.createEntityManager();
UserService userService = new UserServiceImpl(em);
//调用CRUD方法
List<User> userList = userService.findAllUser();
userList..forEach(System.out::println);
2、在JPA通过数据库生成代码之后
对于简单的CRUD操作
只需要通过数据库来自动生成JPAController直接调用JPAController就可以完成简单的CRUD操作
如果需要自定义操作
我们需要在实体类中先来
@NamedQuery1
2
3({
(name = "User.findUserByName", query = "SELECT u FROM user u WHERE name like ?")
})然后在Service层中实现
1
2
3
4
5
6
7
8
9public Module findUserByName(String xxx){
EntityManager em = getEntityManager();
try{
return em.createNamedQuery("User.findUserByName",
User.class).setParameter("name",xxx).getSingleResult();
} finally {
em.close();
}
}最后在业务代码中
new一个UserJPAController的对象就可以调用方法了1
2
3
4EntityManagerFactory emf = Persistence.createEntityManagerFactory("UserPU");
UserJPAController userJPAController = new UserJPAController(emf);
userJPAController.findUserByName("Tony");
二、使用了Spring-Boot框架和MyBatis-Plus工具之后
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
MyBatis-Plus官方文档
特性
- 无侵入:只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑
- 损耗小:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
- 强大的 CRUD 操作:内置通用 Mapper、通用 Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,更有强大的条件构造器,满足各类使用需求
- 支持 Lambda 形式调用:通过 Lambda 表达式,方便的编写各类查询条件,无需再担心字段写错
- 支持主键自动生成:支持多达 4 种主键策略(内含分布式唯一 ID 生成器 - Sequence),可自由配置,完美解决主键问题
- 支持 ActiveRecord 模式:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可进行强大的 CRUD 操作
- 支持自定义全局通用操作:支持全局通用方法注入( Write once, use anywhere )
- 内置代码生成器:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、 Controller 层代码,支持模板引擎,更有超多自定义配置等您来使用
- 内置分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通 List 查询
- 分页插件支持多种数据库:支持 MySQL、MariaDB、Oracle、DB2、H2、HSQL、SQLite、Postgre、SQLServer 等多种数据库
- 内置性能分析插件:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能快速揪出慢查询
- 内置全局拦截插件:提供全表 delete 、 update 操作智能分析阻断,也可自定义拦截规则,预防误操作
支持数据库支持数据库
- mysql 、 mariadb 、 oracle 、 db2 、 h2 、 hsql 、 sqlite 、 postgresql 、 sqlserver
- 达梦数据库 、 虚谷数据库 、 人大金仓数据库
使用MyBatis-Plus的自动生成工具生成Entity,Mapper,Service和Controller。
创建MyBatis-Plus Generator工具类MyBatisGenerator
1 | public class MyBatisGenerator { |
如果Import的时候发现
GlobalConfig中的set方法找不到们可以去Import中删除1
import com.baomidou.mybatisplus.core.config.GlobalConfig;
运行
MyBatisGenerator- 在命令行输入需要自动生成的模块路径
- 第二行输入数据库的表名,多个字段用
逗号隔开。
编写MyBatis配置类 MyBatisConfig
1 |
|
编写测试类
1 | (SpringRunner.class) |
最后记录个小bug
Bug Description
在测试的代码中
@AutowiredMapper类时,经常会遇到Could not autowire. No beans of 'xxxx' type found的错误提示。但程序的编译和运行都是没有问题的,这个错误提示并不会产生影响。但红色的错误提示在有些有强迫症的程序员眼里,多多少少有些不太舒服。
Cause
原因可能有两个,第一个是IntellijIDEA本身工具的问题。第二个便是我们导入
@Service包的时候导入包错误造成的第一种原因,spring auto scan配置,在编辑情况下,无法找不到对应的bean,于是提示找不到对应bean的错误。常见于mybatis的mapper,如下:
1
2
3
4
5<!-- mapper scanner configurer -->
<bean id="mapperScannerConfig" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.adu.spring_test.mybatis.dao" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>Solution
针对第一种原因,解决办法是:降低
Autowired检测的级别,将Severity的级别由之前的error改成warning或其它可以忽略的级别。

针对第二种原因,解决方案当然是导入正确的包。首先我们来看下最容易导入的错误包,如下所示:
1 | import com.alibaba.dubbo.config.annotation.Service; |
切记切记啊!!!!
Reference
Allwayz