mybatis在持久层框架中还是比较火的,一般项目都是基于ssm。虽然mybatis可以直接在xml中通过SQL语句操作数据库,很是灵活。但正其操作都要通过SQL语句进行,就必须写大量的xml文件,很是麻烦。mybatis-plus就很好的解决了这个问题。
Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。这是官方给的定义,关于mybatis-plus的更多介绍及特性,可以参考mybatis-plus官网。那么它是怎么增强的呢?其实就是它已经封装好了一些crud方法,我们不需要再写xml了,直接调用这些方法就行,就类似于JPA。
在SpringBoot的特性下,整合Mybatis-plus也尤为简单。接下来看具体操作:
1、pom.xml:
核心依赖如下:
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-boot-starterartifactId>
<version>3.3.0version>
dependency>
<dependency>
<groupId>com.baomidougroupId>
<artifactId>mybatis-plus-generatorartifactId>
<version>3.3.0version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
dependency>
注意 这里使用的数据库为mysql ,还运用到了日志slf4j、lombok等,可以自行了解
2、application.yml: springboot 启动配置 - 数据源配置
# [] 内需要自己修改
spring:
datasource:
username: [数据库账户]
password: [数据库密码]
url: jdbc:mysql://[url]/[dbbase]?useUnicode=true&characterEncoding=utf8
driver-class-name: com.mysql.cj.jdbc.Driver
3、 数据表 User表
id | name | age | |
---|---|---|---|
1 | Jone | 18 | [email protected] |
2 | Jack | 20 | [email protected] |
3 | Tom | 28 | [email protected] |
4 | Sandy | 21 | [email protected] |
5 | Billie | 24 | [email protected] |
对应 schema-user.sql
DROP TABLE IF EXISTS user;
CREATE TABLE user
(
id BIGINT(20) NOT NULL COMMENT '主键ID',
name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
age INT(11) NULL DEFAULT NULL COMMENT '年龄',
email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
PRIMARY KEY (id)
);
对应 data-user.sql
DELETE FROM user;
INSERT INTO user (id, name, age, email) VALUES
(1, 'Jone', 18, '[email protected]'),
(2, 'Jack', 20, '[email protected]'),
(3, 'Tom', 28, '[email protected]'),
(4, 'Sandy', 21, '[email protected]'),
(5, 'Billie', 24, '[email protected]');
建立好数据,接下来就是java类的配置,可以通过mybatis-plus的代码生成器generator生成,generator生成自行了解;
4 、 entity 对应数据表结构实体类,
@Data
@TebleName(value = "user")
public class user implements Serializable {
private static final long serialVersionUID = 1L;
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
@TableField(value = "name",exist = true)
private String userName;
private String age;
private String email;
}
@Data : lombok(需要安装lombok插件) 自动设置 getter setter toString 保证代码整洁
@TebleName:对应表名,可以不写,默认以驼峰命名法进行表名匹配,还有其他前缀、后缀等匹配方式可以去自行了解,一般直接使用标准驼峰就行
@TableId :id 列,type = IdType.AUTO 当主键为自增时,insert(user) 时,user.id会自动赋值
@TableField:表字段,若没有开启驼峰命名,或者表中列名不符合驼峰规则,可通过该注解指定数据库表中的列名,exist标明数据表中有没有对应列
5、分页插件、mapper扫描配置
@Configuration
@MapperScan({
"com.exmple.*.dao"})//扫描dao层接口
public class MybatisPlusConfig {
//分页插件
@Bean
public PaginationInterceptor paginationInterceptor() {
// 设置sql的limit为无限制,默认是500
return new PaginationInterceptor().setLimit(-1);
}
}
分页组件
Page<User> page = new Page<>(current,size);//当前页与页面数量
6、dao 持久层
public interface UserDao extends BaseMapper<User> {
@Select("select u.id as `id` .... from user u left join .. where..")
@ResultType(UserVo.class)
public UserVo getOne();
public UserInfo selectUserInfo(@Param("query")User user);
}
在dao层可以进行多种方式定义sql操作,
- 直接使用@Select、@Insert、@Update等标签直接写入使用拼接,用 包裹可以使用如xml里写法的
等标签 - 原始的写法用映射Mapper.xml的方式进行使用
- 定义sql拼接的方法类进行处理,这里不做演示
BaseMapper里 定义了大量CRUD的方法,可直接使用,不用再去定义基础CRUD的sql
public interface BaseMapper<T> extends Mapper<T> {
int insert(T entity);
int deleteById(Serializable id);
int deleteByMap(@Param("cm") Map<String, Object> columnMap);
int delete(@Param("ew") Wrapper<T> wrapper);
int deleteBatchIds(@Param("coll") Collection<? extends Serializable> idList);
int updateById(@Param("et") T entity);
int update(@Param("et") T entity, @Param("ew") Wrapper<T> updateWrapper);
T selectById(Serializable id);
List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> idList);
List<T> selectByMap(@Param("cm") Map<String, Object> columnMap);
T selectOne(@Param("ew") Wrapper<T> queryWrapper);
Integer selectCount(@Param("ew") Wrapper<T> queryWrapper);
List<T> selectList(@Param("ew") Wrapper<T> queryWrapper);
List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> queryWrapper);
List<Object> selectObjs(@Param("ew") Wrapper<T> queryWrapper);
<E extends IPage<T>> E selectPage(E page, @Param("ew") Wrapper<T> queryWrapper);
<E extends IPage<Map<String, Object>>> E selectMapsPage(E page, @Param("ew") Wrapper<T> queryWrapper);
}
6、Mapper.xml 映射文件
<mapper namespace="com.exmple.admin.dao.UserDao">
<resultMap id="userInfoMap" type=".....UserInfo">
<id column="id" property="userId" />
.....
resultMap>
在Mapper.xml 里可以写复杂sql,利用自定义返回map进行数据封装返回
7、Service 逻辑层
//定义逻辑层接口,继承IService
public interface UserService extends IService<User> {
@Transactional(rollbackFor = {
Exception.class})
boolean deleteUsers(List<Integer> uids);
}
//定义逻辑层实现类,继承ServiceImpl
@Service("userService")
public class UserServiceImpl extends ServiceImpl<UserDao, User> implements UserService {
//UserDao为baseMapper,导入其他数据库服务资源
@Resource
private RoleDao roleDao;
@Override
public boolean deleteUsers(List<Integer> uids){
uids.forEach(id ->{
baseMapper.deleteById(id);
//TODO 删除其他关联属性
roleDao.......;
})
}
}
@Transactional 开启事务控制,rollbackFor指定异常回滚类型
这里的baseMapper 就是 UserDao;
IService 也内置了大量CRUD操作方法,ServiceImpl 根据内置 BaseMapper( 这里是UserDao)实现了 IService 方法,
ServiceImpl 默认装在了baseMapper
public class ServiceImpl<M extends BaseMapper<T>, T> implements IService<T> {
protected Log log = LogFactory.getLog(this.getClass());
@Autowired
protected M baseMapper;
public ServiceImpl() {
}
public M getBaseMapper() {
return this.baseMapper;
}
.....
}
//QueryWrapper 查询条件wrapper 可用于 单表查询、删除查询
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.lambda() //一般统一使用lambda表达式
.like(username != null,User::getName,username)//username != null 条件成立才进行拼接,名字模糊查询
.lt(User::getAge, 18)//年纪小于18
.eq(..)//相等查询
.....;
Page<User> users = userService.page(page,queryWrapper)
//UpdateWrapper 修改wrapper 可用于 修改
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
queryWrapper.lambda() //一般统一使用lambda表达式
.set(!StringUtils.isEmpty(emailStr),User::getEmail, emailStr)//邮箱不为空时,修改有效
.eq(User::getId,id);//根据Id修改
userService.update(updateWrapper);
if test
1.当参数为数字型时,如果为0 ,会与 ‘’ 空字符串相等
if>
当status 为数字型 应该写成
if>
if>
应该写成
if>
jdbcType使用
t.id = #{
query.id,jdbcType = VARCHAR}
若希望使用null,不要加jdbcType
t.id = #{
query.id}
以上便是个人对mybatis-plus的使用的总结,主要基于SpringBoot配置、;介绍了通用crud的使用、全局策略的配置以及条件构造器的使用,但是这并不是MP的所有内容,其强大不限于此。需要进阶了解,可以去mybatis-plus官网了解