栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

MyBatis-Plus基础

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

MyBatis-Plus基础

Mybatis-Plus

了解Mybatis-Plus Mybatis-Plus介绍

· Mybatis-Plus简称(MP)是一个Mybatis的增强工具,在Mybatis的基础上只做增强不做改变,为简化开发提高效率而生

· 官网:https://mybatis.plus/ 或 https://mp.baomidou.com/

代码以及文档

文档地址:https://mybatis.plus/guide/

源码地址:https://github.com/baomidou/mybatis-plus

特性

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jqGs7DXb-1646572487356)(C:Usersmaybe3032AppDataRoamingTyporatypora-user-imagesimage-20220305165151166.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XQ6Gh2Cp-1646572487357)(C:Usersmaybe3032AppDataRoamingTyporatypora-user-imagesimage-20220305165216116.png)]

架构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RXVmiJXR-1646572487358)(C:Usersmaybe3032AppDataRoamingTyporatypora-user-imagesimage-20220305165413766.png)]

整合Mybatis-Plus

· 对于Mybatis整合MP有三种常用用法,分别是Mybatis+MP、Spring+Mybatis+MP、SpringBoot+Mybatis+MP

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MnAdDnr6-1646572487359)(C:Usersmaybe3032AppDataRoamingTyporatypora-user-imagesimage-20220305170000264.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MihzkB9T-1646572487360)(C:Usersmaybe3032AppDataRoamingTyporatypora-user-imagesimage-20220305170011376.png)]

导入依赖
 

    4.0.0
    cn.itcast.mp 
    itcast-mybatis-plus 
    1.0-SNAPSHOT
     
        itcast-mybatis-plus-simple 
    
    pom
     
         
         
            com.baomidou 
            mybatis-plus 
            3.1.1 
        
        
         
            mysql 
            mysql-connector-java 
            5.1.47
        
         
         
            com.alibaba 
            druid
            1.0.11
        
          
            org.projectlombok 
            lombok 
            true 
            1.18.4 
        
         
            junit 
            junit 
            4.12 
        
         
            org.slf4j 
            slf4j-log4j12 
            1.6.4 
         
    
     
         
             
                org.apache.maven.plugins 
                maven-compiler-plugin 
                 
                    1.8 
                    1.8 
                 
             
         
    


Mybatis + MP

· 纯Mybatis与Mybatis-Plus整合

创建Modile
 

     
        itcast-mybatis-plus 
        cn.itcast.mp 
        1.0-SNAPSHOT 
    
    4.0.0 
    jar
    
    itcast-mybatis-plus-simple
    

· log4j.properties:

log4j.rootLogger=DEBUG,A1 

log4j.appender.A1=org.apache.log4j.ConsoleAppender 
log4j.appender.A1.layout=org.apache.log4j.PatternLayout 
log4j.appender.A1.layout.ConversionPattern=[%t] [%c]-[%p] %m%n
Mybatis实现查询User

· 编写mybatis-config.xml文件

 
 
 
     
         
             
             
                 
                 
                 
                 
             
         
     
     
         
     

· 编写User实体对象:(这里使用Lombok进行优化bean操作)

package cn.itcast.mp.simple.pojo; 
import lombok.AllArgsConstructor; 
import lombok.Data; 
import lombok.NoArgsConstructor; 

@Data @NoArgsConstructor 
@AllArgsConstructor 
public class User {
    
    private Long id; 
    private String userName; 
    private String password; 
    private String name; 
    private Integer age; 
    private String email;
}

· 编写UserMapper接口:

package cn.itcast.mp.simple.mapper; 
import cn.itcast.mp.simple.pojo.User; 
import java.util.List; 
public interface UserMapper { 
    List findAll(); 
}

· 编写UserMapper.xml文件

 
 
 
    
     
        select * from tb_user 
     


· 编写TestMyBatis测试用例

public class TestMybatis {
    @Test
    public void testUserList() throws Exception{
        String resource = "mybatis-config.xml"; 
        InputStream inputStream = Resources.getResourceAsStream(resource); 
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); 
        SqlSession sqlSession = sqlSessionFactory.openSession(); 
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class); 
        List list = userMapper.findAll(); 
        for (User user : list) { 
            System.out.println(user); 
        } 
    } 
}
Mybatis+MP实现查询User

· 将UserMapper继承baseMapper,将拥有baseMapper中的所有方法

public interface UserMapper extends baseMapper {
    List findAll();
}

· 使用MP中的MybatisSqlSessionFactoryBuilder进程构建

public class TestMybatisPlus { 
    @Test 
    public void testUserList() throws Exception{ 
        String resource = "mybatis-config.xml"; 
        InputStream inputStream = Resources.getResourceAsStream(resource); 
        //这里使用的是MP中的MybatisSqlSessionFactoryBuilder 
        SqlSessionFactory sqlSessionFactory = new MybatisSqlSessionFactoryBuilder().build(inputStream); 	         SqlSession sqlSession = sqlSessionFactory.openSession(); 
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class); 
        // 可以调用baseMapper中定义的方法 
        List list = userMapper.selectList(null); 
        for (User user : list) {
            System.out.println(user); 
        } 
    }

· 运行报错

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bAgkLLHA-1646572487361)(C:Usersmaybe3032AppDataRoamingTyporatypora-user-imagesimage-20220305174214117.png)]

· 解决:在User对象中添加@TableName,指定数据库表名

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RjfzRoeR-1646572487361)(C:Usersmaybe3032AppDataRoamingTyporatypora-user-imagesimage-20220305174255283.png)]

简单说明

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0aqFct9N-1646572487362)(C:Usersmaybe3032AppDataRoamingTyporatypora-user-imagesimage-20220305174343528.png)]

Spring+Mybatis+MP

· 引入了Spring框架,数据源、构建等工作就交给了Spring管理

创建子Module
 

     
        itcast-mybatis-plus 
        cn.itcast.mp 
        1.0-SNAPSHOT 
    
    4.0.0
    
    itcast-mybatis-plus-spring 
    
     
        5.1.6.RELEASE 
    
     
        
            org.springframework
            spring-webmvc
            ${spring.version} 
         
         
            org.springframework 
            spring-jdbc 
            ${spring.version} 
         
         
            org.springframework 
            spring-test 
            ${spring.version}
        
     

实现查询User

· 编写jdbc.properties

jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1:3306/mp? useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&useSSL =false jdbc.username=root jdbc.password=root

· 编写applicationContext.xml


     
        
             
             
                 
                 
                
                  
                
                   
                     
 
     
    
SpringBoot+Mybatis+MP

· 使用SpringBoot将进一步的简化MP的整合,需要注意的是,由于使用SpringBoot需要继承parent,所以需要重新创建工程,并不是创建子Module

导入依赖
 

    4.0.0
    
	 
        org.springframework.boot 
        spring-boot-starter-parent 
        2.1.4.RELEASE 
    
    
    cn.itcast.mp 
    itcast-mp-springboot 
    1.0-SNAPSHOT
    
     
         
            org.springframework.boot 
            spring-boot-starter 
             
                
                    org.springframework.boot 
                    spring-boot-starter-logging 
                 
             
         
         
            org.springframework.boot 
            spring-boot-starter-test 
            test 
        
        
         
         
            org.projectlombok 
            lombok 
            true 
        
         
         
            com.baomidou 
            mybatis-plus-boot-starter 
            3.1.1 
        
         
         
            mysql 
            mysql-connector-java 
            5.1.47 
         
         
            org.slf4j 
            slf4j-log4j12 
        
        
        
     
         
             
                org.springframework.boot 
                spring-boot-maven-plugin 
             
         
    
    

· log4j.properties:

log4j.rootLogger=DEBUG,A1

log4j.appender.A1=org.apache.log4j.ConsoleAppender 
log4j.appender.A1.layout=org.apache.log4j.PatternLayout 
log4j.appender.A1.layout.ConversionPattern=[%t] [%c]-[%p] %m%n

· 编写application.properties

spring.application.name = itcast-mp-springboot 

spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.datasource.url=jdbc:mysql://127.0.0.1:3306/mp?

useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true&useSSL =false spring.datasource.username=root 
spring.datasource.password=root

· 编写pojo

@Data 
@NoArgsConstructor 
@AllArgsConstructor 
@TableName("tb_user") 
public class User { 
    private Long id; 
    private String userName; 
    private String password; 
    private String name; 
    private Integer age; 
    private String email; 
}

· 编写mapper

public interface UserMapper extends baseMapper { 
}

· 编写启动类

@MapperScan("cn.itcast.mp.mapper") //设置mapper接口的扫描包 
@SpringBootApplication 
public class MyApplication { 
    
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args); 
    } 
}

编写测试

@RunWith(SpringRunner.class) 
@SpringBootTest 
public class UserMapperTest { 
    @Autowired private UserMapper userMapper; 
    
    @Test public void testSelect() {
        List userList = userMapper.selectList(null);
        for (User user : userList) { 
            System.out.println(user); 
        } 
    } 
}
通用CRUD

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k0zbd5bV-1646572487362)(C:Usersmaybe3032AppDataRoamingTyporatypora-user-imagesimage-20220305205131123.png)]

插入操作 方法定义
 
int insert(T entity);

·测试

@RunWith(SpringRunner.class) 
@SpringBootTest 
public class UserMapperTest { 
    @Autowired 
    private UserMapper userMapper; 
    @Test public void testInsert(){ 
        User user = new User(); 
        user.setAge(20); 
        user.setEmail("test@itcast.cn"); 
        user.setName("曹操"); 
        user.setUserName("caocao"); 
        user.setPassword("123456"); 
        int result = this.userMapper.insert(user); //返回的result是受影响的行数,并不是自增 后的id 
        System.out.println("result = " + result);
        
        System.out.println(user.getId()); //自增后的id会回填到对象中 } }

修改User对象:

@Data 
@NoArgsConstructor 
@AllArgsConstructor 
@TableName("tb_user") 
public class User { 
    @TableId(type = IdType.AUTO) //指定id类型为自增长 
    private Long id; 
    private String userName; 
    private String password; 
    private String name; 
    private Integer age; 
    private String email; 
}
@TableField

在MP中通过@TableField注解可以指定字段的一些属性

    对象中的属性名和字段名不一致的问题(非驼峰)
@TableField(value="email")//解决字段名不一致
private String mail;
    对象中的属性字段在表中不存在的问题
@TableField(exist=false)
private String address;//该字段在数据库中不存在
    字段不加入查询字段
@TableField(select = false)
private String password;//测试时password会显示null
更新操作

在MP中,更新操作有两种,一种时根据id更新,另一种是根据条件更新

根据id更新

方法定义

 
int updateById(@Param(Constants.ENTITY) T entity);

测试

@RunWith(SpringRunner.class) 
@SpringBootTest 
public class UserMapperTest { 
    
    @Autowired 
    private UserMapper userMapper; 
    
    @Test public void testUpdateById() {
        User user = new User(); 
        user.setId(6L); //主键 
        user.setAge(21); //更新的字段 
        
        //根据id更新,更新不为null的字段 
        this.userMapper.updateById(user);
    } 
}
根据条件更新
 
	int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper updateWrapper);
@RunWith(SpringRunner.class) 
@SpringBootTest 
public class UserMapperTest { 
   
    @Autowired 
    private UserMapper userMapper;
    
    @Test
    public void testUpdate() {
      User user = new User(); 
        user.setAge(22); //更新的字段 
        
        //更新的条件 
        QueryWrapper wrapper = new QueryWrapper<>(); 
        wrapper.eq("id", 6); 
        
        //执行更新操作 
        int result = this.userMapper.update(user, wrapper); 
        System.out.println("result = " + result); 
    } 
}  

@Test
public void testUpdate() {
    //更新的条件以及字段 
    UpdateWrapper wrapper = new UpdateWrapper<>(); 
    wrapper.eq("id", 6).set("age", 23); 
    
    //执行更新操作 
    int result = this.userMapper.update(null, wrapper); 
    System.out.println("result = " + result); 
}
删除操作 deleteById

方法定义

 
int deleteById(Serializable id);
@RunWith(SpringRunner.class) 
@SpringBootTest 
public class UserMapperTest { 
   
    @Autowired 
    private UserMapper userMapper; 
   
    @Test public void testDeleteById() { 
        //执行删除操作 
        int result = this.userMapper.deleteById(6L); 
        System.out.println("result = " + result); 
    } 
}
deleteByMap
 
int deleteByMap(@Param(Constants.COLUMN_MAP) Map columnMap);
@RunWith(SpringRunner.class) 
@SpringBootTest 
public class UserMapperTest { 
    
    @Autowired
    private UserMapper userMapper; 
    
    @Test public void testDeleteByMap() {
        Map columnMap = new HashMap<>(); 
        columnMap.put("age",20); 
        columnMap.put("name","张三"); 
        
        //将columnMap中的元素设置为删除的条件,多个之间为and关系 
        int result = this.userMapper.deleteByMap(columnMap); 
        System.out.println("result = " + result); 
    } 
}
delete
int delete(@Param(Constants.WRAPPER) Wrapper wrapper);
@RunWith(SpringRunner.class) 
@SpringBootTest 
public class UserMapperTest { 
    @Autowired
    private UserMapper userMapper;
    
    @Test public void testDeleteByMap() { 
        User user = new User(); 
        user.setAge(20); 
        user.setName("张三"); 
        
        //将实体对象进行包装,包装为操作条件 
        QueryWrapper wrapper = new QueryWrapper<>(user); 
        
        int result = this.userMapper.delete(wrapper); 
        System.out.println("result = " + result); 
    } 
}
deleteBatchlds
 
int deleteBatchIds(@Param(Constants.COLLECTION) Collection idList);
@RunWith(SpringRunner.class) 
@SpringBootTest
public class UserMapperTest {
    @Autowired 
    private UserMapper userMapper;
    @Test public void testDeleteByMap() { 
        //根据id集合批量删除 
        int result = this.userMapper.deleteBatchIds(Arrays.asList(1L,10L,20L)); 
        System.out.println("result = " + result); 
    } 
}
查询操作

· MP提供了多种查询操作,根据id查询、批量查询、查询单条数据、查询列表、分页查询

SelectById
 
T selectById(Serializable id);
public void testSelectById() {
    //根据id查询数据 
    User user = this.userMapper.selectById(2L); 
    System.out.println("result = " + user);
}
selectBatchIds
public void testSelectBatchIds() {
//根据id集合批量查询
List users = this.userMapper.selectBatchIds(Arrays.asList(2L, 3L, 10L)); 
for (User user : users) { 
System.out.println(user); 
} 
}
selectOne
public void testSelectOne() { 
    QueryWrapper wrapper = new QueryWrapper(); 
    wrapper.eq("name", "李四"); 
    //根据条件查询一条数据,如果结果超过一条会报错 
    User user = this.userMapper.selectOne(wrapper);
    System.out.println(user); 
} 
}
selectCount
public void testSelectCount() { 
    QueryWrapper wrapper = new QueryWrapper(); 
    wrapper.gt("age", 23); 
    //年龄大于23岁 
    
    //根据条件查询数据条数
    Integer count = this.userMapper.selectCount(wrapper); 
    System.out.println("count = " + count); 
	} 
}
selectList
public void testSelectList() { 
    QueryWrapper wrapper = new QueryWrapper(); 
    wrapper.gt("age", 23); 
    //年龄大于23岁
    
    //根据条件查询数据 
    List users = this.userMapper.selectList(wrapper); 
    for (User user : users) { 
        System.out.println("user = " + user); 
    } 
}
selectPage
public void testSelectPage() { 
    QueryWrapper wrapper = new QueryWrapper(); 
    wrapper.gt("age", 20); 
    //年龄大于20岁 
    
    Page page = new Page<>(1,1); 
    //根据条件查询数据 
    IPage iPage = this.userMapper.selectPage(page, wrapper); 
    System.out.println("数据总条数:" + iPage.getTotal()); 
    System.out.println("总页数:" + iPage.getPages()); 
    List users = iPage.getRecords(); 
    for (User user : users) { 
        System.out.println("user = " + user); 
    } 
} 
}
SQL注入原理
    在MP中,ISqlInjector负责SQL的注入工作,它是一个接口,AbstractSqlInjector是它的实现类
// 循环注入自定义方法 
methodList.forEach(m -> m.inject(builderAssistant, mapperClass, modelClass, tableInfo));

    在实现方法中, methodList.forEach(m -> m.inject(builderAssistant, mapperClass, modelClass,

    tableInfo)); 是关键,循环遍历方法,进行注入

    最终调用抽象方法injectMappedStatement进行真正的注入

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-97sUx784-1646572487363)(C:Usersmaybe3032AppDataRoamingTyporatypora-user-imagesimage-20220306201248438.png)]

Mybatis-Plus的配置 基本配置 configLocation

· MyBatis 配置文件位置,如果您有单独的 MyBatis 配置,请将其路径配置到 confifigLocation 中

Spring Boot

# 指定全局的配置文件
mybatis-plus.config-location = classpath:mybatis-config.xml

Spring MVC

 
     

mapperLocations

· MyBatis Mapper 所对应的 XML 文件位置,如果您在 Mapper 中有自定义方法(XML 中有自定义实现),需要进行该配置,告诉 Mapper 所对应的 XML 文件位置

Spring Boot

# 指定Mapper.xml文件的路径
mybatis-plus.mapper-locations = classpath*:mybatis/*.xml

Spring MVC

 
     

typeAliasesPackage

· MyBaits 别名包扫描路径,通过该属性可以给包中的类注册别名,注册后在 Mapper 对应的 XML 文件中可以直接使用类名,而不用使用全限定的类名(即 XML 中调用的时候不用包含包名

Spring Boot

//实体对象的扫描包
mybatis-plus.type-aliases-package = cn.itcast.mp.pojo

Spring MVC

  
进阶配置 mapUndersoreToCamelCase

· 类型: boolean

· 默认值: true

· 是否开启自动驼峰命名规则(camel case)映射,即从经典数据库列名 A_COLUMN(下划线命名) 到经典 Java 属性名 aColumn(驼峰命名)的类似映射

· 注意:此属性在 MyBatis 中原默认值为 false,在 MyBatis-Plus 中,此属性也将用于生成最终的 SQL 的 select body

如果您的数据库命名符合规则无需使用 @TableField 注解指定数据库字段名

#关闭自动驼峰映射,该参数不能和mybatis-plus.config-location同时存在 
mybatis-plus.configuration.map-underscore-to-camel-case=false
cacheEnabled

· 类型: boolean

· 默认值: true

· 全局地开启或关闭配置文件中的所有映射器已经配置的任何缓存,默认为 true

# 禁用缓存
mybatis-plus.configuration.cache-enabled=false
DB策略配置 idType

· 类型: com.baomidou.mybatisplus.annotation.IdType

· 默认值: ID_WORKER

· 全局默认主键类型,设置后,即可省略实体对象中的@TableId(type = IdType.AUTO)配置

Spring Boot SpringMVC

# 全局的id生成策略
mybatis-plus.global-config.db-config.id-type=auto

SpringMVC

 	 
     
     
          
			 
                 		 				 
             
         
     

TablePrefix

· 类型: String

· 默认值: null

· 表名前缀,全局配置后可省略@TableName()配置

SpringBoot

# 全局表名的前缀
mybatis-plus.global-config.db-config.table-prefix=tb_

SpringMVC

 
     
     
         
             
                 
                     
                     
                 
             
         
     

条件构造器

· AbstractWrapper和AbstractChainWrapper是重点实现

allEq
allEq(Map params) 
allEq(Map params, boolean null2IsNull) 
allEq(boolean condition, Map params, boolean null2IsNull)
//params : key 为数据库字段名, value 为字段值 null2IsNull : 为 true 则在 map 的 value 为 null 时调用 isNull 方法,为 false 时则忽略 value 为 null 的
allEq(BiPredicate filter, Map params) 
allEq(BiPredicate filter, Map params, boolean null2IsNull) 
allEq(boolean condition, BiPredicate filter, Map params, boolean null2IsNull)
//个别参数说明: filter : 过滤函数,是否允许字段传入比对条件中 params 与 null2IsNull
基础比较操作
    eq

​ 等于 =

    ne

​ 不等于 <>

    gt

​ 大于 >

    ge

​ 大于等于 >=

    lt

​ 小于 <

    le

​ 小于等于 <=

    between

​ BETWEEN 值1 AND 值2

    notBetween

​ NOT BETWEEN 值1 AND 值2

    in

​ 字段 IN (value.get(0), value.get(1), …)

    notIn

​ 字段 NOT IN (v0, v1, …)

模糊查询

· like

​ LIKE ‘%值%’

​ 例: like(“name”, “王”) —> name like ‘%王%’

· notLike

​ NOT LIKE ‘%值%’

​ 例: notLike(“name”, “王”) —> name not like ‘%王%’

·likeLeft

​ LIKE ‘%值’

​ 例: likeLeft(“name”, “王”) —> name like ‘%王’

·likeRight

​ LIKE ‘值%’

​ 例: likeRight(“name”, “王”) —> name like ‘王%’

排序

· orderBy

​ 排序:ORDER BY 字段, …

​ 例: orderBy(true, true, “id”, “name”) —> order by id ASC,name ASC

· orderByAsc

​ 排序:ORDER BY 字段, … ASC

​ 例: orderByAsc(“id”, “name”) —> order by id ASC,name ASC

· orderByDesc

​ 排序:ORDER BY 字段, … DESC

​ 例: orderByDesc(“id”, “name”) —> order by id DESC,name DESC

逻辑查询

· or

​ 拼接 OR

​ 主动调用 or 表示紧接着下一个方法不是用 and 连接!(不调用 or 则默认为使用 and 连接)

·and

​ AND 嵌套

​ 例: and(i -> i.eq(“name”, “李白”).ne(“status”, “活着”)) —> and (name = ‘李白’ and status <> ‘活着’)

select

· 在MP查询中,默认查询所有的字段,如果有需要也可以通过select方法进行指定字段

public void testWrapper() {
    QueryWrapper wrapper = new QueryWrapper<>(); //SELECT id,name,age FROM tb_user WHERe name = ? OR age = ? 
    wrapper.eq("name", "李四") 
        .or() 
        .eq("age", 24) 
        .select("id", "name", "age");//查询指定字段
    List users = this.userMapper.selectList(wrapper); for (User user : users) {
        System.out.println(user); 
    } 
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/755146.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号