MyBatis-Plus基础

本文档介绍了MyBatis-Plus(MP)的基础知识,包括MP的介绍、特性、架构,以及如何整合Mybatis-Plus。详细讲解了Mybatis与MP的整合方式,如Mybatis+MP、Spring+Mybatis+MP、SpringBoot+Mybatis+MP,并展示了通用的CRUD操作,如插入、更新、删除和查询。此外,还涵盖了SQL注入原理和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:\Users\maybe3032\AppData\Roaming\Typora\typora-user-images\image-20220305165151166.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XQ6Gh2Cp-1646572487357)(C:\Users\maybe3032\AppData\Roaming\Typora\typora-user-images\image-20220305165216116.png)]

架构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RXVmiJXR-1646572487358)(C:\Users\maybe3032\AppData\Roaming\Typora\typora-user-images\image-20220305165413766.png)]

整合Mybatis-Plus

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MnAdDnr6-1646572487359)(C:\Users\maybe3032\AppData\Roaming\Typora\typora-user-images\image-20220305170000264.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MihzkB9T-1646572487360)(C:\Users\maybe3032\AppData\Roaming\Typora\typora-user-images\image-20220305170011376.png)]

导入依赖

<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0                                                                              http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>cn.itcast.mp</groupId> 
    <artifactId>itcast-mybatis-plus</artifactId> 
    <version>1.0-SNAPSHOT</version>
    <modules> 
        <module>itcast-mybatis-plus-simple</module> 
    </modules>
    <packaging>pom</packaging>
    <dependencies> 
        <!-- mybatis-plus插件依赖 --> 
        <dependency> 
            <groupId>com.baomidou</groupId> 
            <artifactId>mybatis-plus</artifactId> 
            <version>3.1.1</version> 
        </dependency>
        <!-- MySql -->
        <dependency> 
            <groupId>mysql</groupId> 
            <artifactId>mysql-connector-java</artifactId> 
            <version>5.1.47</version>
        </dependency>
        <!-- 连接池 --> 
        <dependency> 
            <groupId>com.alibaba</groupId> 
            <artifactId>druid</artifactId>
            <version>1.0.11</version>
        </dependency>
        <!--简化bean代码的工具包--> <dependency> 
            <groupId>org.projectlombok</groupId> 
            <artifactId>lombok</artifactId> 
            <optional>true</optional> 
            <version>1.18.4</version> 
        </dependency>
        <dependency> 
            <groupId>junit</groupId> 
            <artifactId>junit</artifactId> 
            <version>4.12</version> 
        </dependency>
        <dependency> 
            <groupId>org.slf4j</groupId> 
            <artifactId>slf4j-log4j12</artifactId> 
            <version>1.6.4</version> 
        </dependency> 
    </dependencies>
    <build> 
        <plugins> 
            <plugin> 
                <groupId>org.apache.maven.plugins</groupId> 
                <artifactId>maven-compiler-plugin</artifactId> 
                <configuration> 
                    <source>1.8</source> 
                    <target>1.8</target> 
                </configuration> 
            </plugin> 
        </plugins> 
    </build>

</project>

Mybatis + MP

· 纯Mybatis与Mybatis-Plus整合

创建Modile
<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0                                                                                    http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent> 
        <artifactId>itcast-mybatis-plus</artifactId> 
        <groupId>cn.itcast.mp</groupId> 
        <version>1.0-SNAPSHOT</version> 
    </parent>
    <modelVersion>4.0.0</modelVersion> 
    <packaging>jar</packaging>
    
    <artifactId>itcast-mybatis-plus-simple</artifactId>
</project>    

· 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文件

<?xml version="1.0" encoding="UTF-8" ?> 
<!DOCTYPE configuration 
	PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 
	"http://mybatis.org/dtd/mybatis-3-config.dtd"> 
<configuration> 
    <environments default="development"> 
        <environment id="development"> 
            <transactionManager type="JDBC"/> 
            <dataSource type="POOLED"> 
                <property name="driver" value="com.mysql.jdbc.Driver"/> 
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/mp? useUnicode=true&amp;characterEncoding=utf8&amp;autoReconnect=true&amp;allowMultiQuerie s=true&amp;useSSL=false"/> 
                <property name="username" value="root"/> 
                <property name="password" value="root"/> 
            </dataSource> 
        </environment> 
    </environments> 
    <mappers> 
        <mapper resource="UserMapper.xml"/> 
    </mappers> 
</configuration>

· 编写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<User> findAll(); 
}

· 编写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="cn.itcast.mp.simple.mapper.UserMapper"> 
    
    <select id="findAll" resultType="cn.itcast.mp.simple.pojo.User"> 
        select * from tb_user 
    </select> 

</mapper>

· 编写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<User> list = userMapper.findAll(); 
        for (User user : list) { 
            System.out.println(user); 
        } 
    } 
}
Mybatis+MP实现查询User

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

public interface UserMapper extends BaseMapper<User> {
    List<User> 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<User> list = userMapper.selectList(null); 
        for (User user : list) {
            System.out.println(user); 
        } 
    }

· 运行报错

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bAgkLLHA-1646572487361)(C:\Users\maybe3032\AppData\Roaming\Typora\typora-user-images\image-20220305174214117.png)]

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RjfzRoeR-1646572487361)(C:\Users\maybe3032\AppData\Roaming\Typora\typora-user-images\image-20220305174255283.png)]

简单说明

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0aqFct9N-1646572487362)(C:\Users\maybe3032\AppData\Roaming\Typora\typora-user-images\image-20220305174343528.png)]

Spring+Mybatis+MP

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

创建子Module
<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 				    			xsi:schemaLocation="http://maven.apache.org/POM/4.0.0                                                                                        http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <parent> 
        <artifactId>itcast-mybatis-plus</artifactId> 
        <groupId>cn.itcast.mp</groupId> 
        <version>1.0-SNAPSHOT</version> 
    </parent>
    <modelVersion>4.0.0</modelVersion>
    
    <artifactId>itcast-mybatis-plus-spring</artifactId> 
    
    <properties> 
        <spring.version>5.1.6.RELEASE</spring.version> 
    </properties>
    <dependencies> 
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>${spring.version}</version> 
        </dependency> 
        <dependency> 
            <groupId>org.springframework</groupId> 
            <artifactId>spring-jdbc</artifactId> 
            <version>${spring.version}</version> 
        </dependency> 
        <dependency> 
            <groupId>org.springframework</groupId> 
            <artifactId>spring-test</artifactId> 
            <version>${spring.version}</version>
        </dependency>
    </dependencies> 
</project>
实现查询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

<?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans" 		xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 	xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> 
        <context:property-placeholder location="classpath:*.properties"/>
            <!-- 定义数据源 --> 
            <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" 
                destroy-method="close"> 
                <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/>
                <property name="password" value="${jdbc.password}"/> 
                <property name="driverClassName" value="${jdbc.driver}"/>
                <property name="maxActive" value="10"/> <property name="minIdle" value="5"/> </bean>
                <!--这里使用MP提供的sqlSessionFactory,完成了Spring与MP的整合-->
                <bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> </bean> 
                    <!--扫描mapper接口,使用的依然是Mybatis原生的扫描器--> 
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="cn.itcast.mp.simple.mapper"/>
    </bean> 
    </beans>

SpringBoot+Mybatis+MP

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

导入依赖
<?xml version="1.0" encoding="UTF-8"?> 
<project xmlns="http://maven.apache.org/POM/4.0.0" 
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0                                                                              http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    
	<parent> 
        <groupId>org.springframework.boot</groupId> 
        <artifactId>spring-boot-starter-parent</artifactId> 
        <version>2.1.4.RELEASE</version> 
    </parent>
    
    <groupId>cn.itcast.mp</groupId> 
    <artifactId>itcast-mp-springboot</artifactId> 
    <version>1.0-SNAPSHOT</version>
    
    <dependencies> 
        <dependency> 
            <groupId>org.springframework.boot</groupId> 
            <artifactId>spring-boot-starter</artifactId> 
            <exclusions> 
                <exclusion>
                    <groupId>org.springframework.boot</groupId> 
                    <artifactId>spring-boot-starter-logging</artifactId> 
                </exclusion> 
            </exclusions> 
        </dependency> 
        <dependency> 
            <groupId>org.springframework.boot</groupId> 
            <artifactId>spring-boot-starter-test</artifactId> 
            <scope>test</scope> 
        </dependency>
        
        <!--简化代码的工具包--> 
        <dependency> 
            <groupId>org.projectlombok</groupId> 
            <artifactId>lombok</artifactId> 
            <optional>true</optional> 
        </dependency>
        <!--mybatis-plus的springboot支持--> 
        <dependency> 
            <groupId>com.baomidou</groupId> 
            <artifactId>mybatis-plus-boot-starter</artifactId> 
            <version>3.1.1</version> 
        </dependency>
        <!--mysql驱动--> 
        <dependency> 
            <groupId>mysql</groupId> 
            <artifactId>mysql-connector-java</artifactId> 
            <version>5.1.47</version> 
        </dependency> 
        <dependency> 
            <groupId>org.slf4j</groupId> 
            <artifactId>slf4j-log4j12</artifactId> 
        </dependency>
        
        </dependencies>
    <build> 
        <plugins> 
            <plugin> 
                <groupId>org.springframework.boot</groupId> 
                <artifactId>spring-boot-maven-plugin</artifactId> 
            </plugin> 
        </plugins> 
    </build>
    
</project>

· 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<User> { 
}

· 编写启动类

@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<User> userList = userMapper.selectList(null);
        for (User user : userList) { 
            System.out.println(user); 
        } 
    } 
}

通用CRUD

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-k0zbd5bV-1646572487362)(C:\Users\maybe3032\AppData\Roaming\Typora\typora-user-images\image-20220305205131123.png)]

插入操作

方法定义
/**
* 插入一条记录 *
* @param entity 实体对象 
*/ 
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注解可以指定字段的一些属性

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

更新操作

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

根据id更新

方法定义

/**
* 根据 ID 修改 *
* @param entity 实体对象 
*/ 
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);
    } 
}
根据条件更新
/**
* 根据 whereEntity 条件,更新记录 
*
* @param entity 实体对象 (set 条件值,可以为 null) 
* @param updateWrapper 实体对象封装操作类(可以为 null,里面的 entity 用于生成 where 语句) 
*/ 
	int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);
@RunWith(SpringRunner.class) 
@SpringBootTest 
public class UserMapperTest { 
   
    @Autowired 
    private UserMapper userMapper;
    
    @Test
    public void testUpdate() {
      User user = new User(); 
        user.setAge(22); //更新的字段 
        
        //更新的条件 
        QueryWrapper<User> wrapper = new QueryWrapper<>(); 
        wrapper.eq("id", 6); 
        
        //执行更新操作 
        int result = this.userMapper.update(user, wrapper); 
        System.out.println("result = " + result); 
    } 
}  

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

删除操作

deleteById

方法定义

/**
* 根据 ID 删除 *
* 
@param id 主键ID 
*/ 
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
/**
* 根据 columnMap 条件,删除记录 
*
* @param columnMap 表字段 map 对象 
*/ 
int deleteByMap(@Param(Constants.COLUMN_MAP) Map<String, Object> columnMap);
@RunWith(SpringRunner.class) 
@SpringBootTest 
public class UserMapperTest { 
    
    @Autowired
    private UserMapper userMapper; 
    
    @Test public void testDeleteByMap() {
        Map<String, Object> columnMap = new HashMap<>(); 
        columnMap.put("age",20); 
        columnMap.put("name","张三"); 
        
        //将columnMap中的元素设置为删除的条件,多个之间为and关系 
        int result = this.userMapper.deleteByMap(columnMap); 
        System.out.println("result = " + result); 
    } 
}
delete
/**
* 根据 entity 条件,删除记录 
*
* @param wrapper 实体对象封装操作类(可以为 null) 
*/
int delete(@Param(Constants.WRAPPER) Wrapper<T> 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<User> wrapper = new QueryWrapper<>(user); 
        
        int result = this.userMapper.delete(wrapper); 
        System.out.println("result = " + result); 
    } 
}
deleteBatchlds
/**
* 删除(根据ID 批量删除) 
*
* @param idList 主键ID列表(不能为 null 以及 empty)
*/ 
int deleteBatchIds(@Param(Constants.COLLECTION) Collection<? extends Serializable> 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
/**
* 根据 ID 查询 
*
* @param id 主键ID 
*/ 
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<User> users = this.userMapper.selectBatchIds(Arrays.asList(2L, 3L, 10L)); 
for (User user : users) { 
System.out.println(user); 
} 
}
selectOne
public void testSelectOne() { 
    QueryWrapper<User> wrapper = new QueryWrapper<User>(); 
    wrapper.eq("name", "李四"); 
    //根据条件查询一条数据,如果结果超过一条会报错 
    User user = this.userMapper.selectOne(wrapper);
    System.out.println(user); 
} 
}
selectCount
public void testSelectCount() { 
    QueryWrapper<User> wrapper = new QueryWrapper<User>(); 
    wrapper.gt("age", 23); 
    //年龄大于23岁 
    
    //根据条件查询数据条数
    Integer count = this.userMapper.selectCount(wrapper); 
    System.out.println("count = " + count); 
	} 
}
selectList
public void testSelectList() { 
    QueryWrapper<User> wrapper = new QueryWrapper<User>(); 
    wrapper.gt("age", 23); 
    //年龄大于23岁
    
    //根据条件查询数据 
    List<User> users = this.userMapper.selectList(wrapper); 
    for (User user : users) { 
        System.out.println("user = " + user); 
    } 
}
selectPage
public void testSelectPage() { 
    QueryWrapper<User> wrapper = new QueryWrapper<User>(); 
    wrapper.gt("age", 20); 
    //年龄大于20岁 
    
    Page<User> page = new Page<>(1,1); 
    //根据条件查询数据 
    IPage<User> iPage = this.userMapper.selectPage(page, wrapper); 
    System.out.println("数据总条数:" + iPage.getTotal()); 
    System.out.println("总页数:" + iPage.getPages()); 
    List<User> users = iPage.getRecords(); 
    for (User user : users) { 
        System.out.println("user = " + user); 
    } 
} 
}

SQL注入原理

  1. 在MP中,ISqlInjector负责SQL的注入工作,它是一个接口,AbstractSqlInjector是它的实现类
// 循环注入自定义方法 
methodList.forEach(m -> m.inject(builderAssistant, mapperClass, modelClass, tableInfo));
  1. 在实现方法中, methodList.forEach(m -> m.inject(builderAssistant, mapperClass, modelClass,

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

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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-97sUx784-1646572487363)(C:\Users\maybe3032\AppData\Roaming\Typora\typora-user-images\image-20220306201248438.png)]

Mybatis-Plus的配置

基本配置

configLocation

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

Spring Boot

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

Spring MVC

<bean id="sqlSessionFactory" 
      class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean"> 
    <property name="configLocation" value="classpath:mybatis-config.xml"/> 
</bean>
mapperLocations

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

Spring Boot

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

Spring MVC

<bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean"> 
    <property name="mapperLocations" 				                   value="classpath*:mybatis/*.xml"/> 
</bean>
typeAliasesPackage

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

Spring Boot

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

Spring MVC

<bean id="sqlSessionFactory" 		 class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean"> <property name="typeAliasesPackage" value="com.baomidou.mybatisplus.samples.quickstart.entity"/> </bean>

进阶配置

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

<!--这里使用MP提供的sqlSessionFactory,完成了Spring与MP的整合--> 	<bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="globalConfig"> 
        <bean class="com.baomidou.mybatisplus.core.config.GlobalConfig"> <property name="dbConfig"> 
			<bean class="com.baomidou.mybatisplus.core.config.GlobalConfig$DbConfig"> 
                <property name="idType" value="AUTO"/> 		 				</bean> 
            </property> 
        </bean> 
    </property> 
</bean>

TablePrefix

· 类型: String

· 默认值: null

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

SpringBoot

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

SpringMVC

<bean id="sqlSessionFactory" 
      class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="globalConfig"> 
        <bean class="com.baomidou.mybatisplus.core.config.GlobalConfig"> 
            <property name="dbConfig"> 
                <bean class="com.baomidou.mybatisplus.core.config.GlobalConfig$DbConfig"> 
                    <property name="idType" value="AUTO"/> 
                    <property name="tablePrefix" value="tb_"/> 
                </bean> 
            </property> 
        </bean> 
    </property> 
</bean>

条件构造器

· AbstractWrapper和AbstractChainWrapper是重点实现

allEq

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

基础比较操作

  1. eq

​ 等于 =

  1. ne

​ 不等于 <>

  1. gt

​ 大于 >

  1. ge

​ 大于等于 >=

  1. lt

​ 小于 <

  1. le

​ 小于等于 <=

  1. between

​ BETWEEN 值1 AND 值2

  1. notBetween

​ NOT BETWEEN 值1 AND 值2

  1. in

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

  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<User> 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<User> users = this.userMapper.selectList(wrapper); for (User user : users) {
        System.out.println(user); 
    } 
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值