mybatis-plus简单入门使用

Mybatis-Plus是Mybatis的扩展,旨在简化开发,提供无侵入、依赖少、损耗小的特性。它支持通用CRUD、主键策略、防止Sql注入、分页插件等功能,集成Spring后,通过BaseMapper和GlobalConfiguration配置,可快速实现数据库操作。测试案例展示了如何进行插入、更新、查询等操作。
摘要由CSDN通过智能技术生成

一、为什么要mybatis-plus

   目前来说mybatis 是持久层框架中使用最火的。大多数项目都基于ssm,mybatis一个特点是什么呢,
   直接在xml中通过SQL语句操作数据库,很是灵活。不需要具体的实现类也可以去完成CURD。
   但是也是一件很烦的事。需要疯狂的编写很多XML文件,一件sql、反正我是写吐了,
   而刚好mybatis-Plus就解决这一问题、

二、mybatis-plus简介:

 Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。,这是官方给的定义,
 [官方文档](https://baomidou.gitee.io/mybatis-plus-doc/#/)

三、mybatis-plus特性

	**无侵入**:Mybatis-Plus 在 Mybatis 的基础上进行扩展,只做增强不做改变,引入 Mybatis-Plus 不会对您现有的 Mybatis 构架产生任何影响,
						而且 MP 支持所有 Mybatis 原生的特性 		
	**依赖少**:仅仅依赖    Mybatis 以及 Mybatis-Spring 	
	**损耗小**:启动即会自动注入基本 CURD,性能基本无损耗,直接面向对象操作
	**预防Sql注入**:内置 Sql 注入剥离器,有效预防Sql注入攻击 		
	**通用CRUD操作**:内置通用 Mapper、通用    Service,仅仅通过少量配置即可实现单表大部分 CRUD 操作,
									更有强大的条件构造器,满足各类使用需求
	**多种主键策略**:支持多达4种主键策略(内含分布式唯一ID生成器),可自由配置,完美解决主键问题
	**支持热加载**:Mapper 对应的 XML 支持热加载,对于简单的 CRUD 操作,甚至可以无 XML 启动
	**支持ActiveRecord**:支持 ActiveRecord 形式调用,实体类只需继承 Model 类即可实现基本 CRUD    操作 		
	**支持代码生成**:采用代码或者 Maven 插件可快速生成 Mapper 、 Model 、 Service 、    Controller 层代码,
								支持模板引擎,更有超多自定义配置等您来使用(P.S. 比 Mybatis 官方的 Generator    更加强大!) 		
	**支持自定义全局通用操作**:支持全局通用方法注入( Write once, use anywhere )
	**支持关键词自动转义**:支持数据库关键词(order、key......)自动转义,还可自定义关键词
	**内置分页插件**:基于 Mybatis 物理分页,开发者无需关心具体操作,配置好插件之后,写分页等同于普通List查询
	**内置性能分析插件**:可输出 Sql 语句以及其执行时间,建议开发测试时启用该功能,能有效解决慢查询
	**内置全局拦截插件**:提供全表 delete 、 update 操作智能分析阻断,预防误操作

四、Spring整合mybatis-plus

1.pom.xml

<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>**.**.**</groupId>
	<artifactId>Spring_MybatisPlus</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>SpringBoot_MybatisPlus</name>
	<url>http://maven.apache.org</url>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<srping.version>4.0.2.RELEASE</srping.version>
		<slf4j.version>1.7.12</slf4j.version>
		<log4j.version>1.2.17</log4j.version>
	</properties>

	<dependencies>
		<!-- spring -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-test</artifactId>
			<version>${srping.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-core</artifactId>
			<version>${srping.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-oxm</artifactId>
			<version>${srping.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-tx</artifactId>
			<version>${srping.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-jdbc</artifactId>
			<version>${srping.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-aop</artifactId>
			<version>${srping.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${srping.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context-support</artifactId>
			<version>${srping.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-expression</artifactId>
			<version>${srping.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-orm</artifactId>
			<version>${srping.version}</version>
		</dependency>
		<!-- 不是web不需要导入 -->
		<!-- <dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-web</artifactId>
			<version>${srping.version}</version>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${srping.version}</version>
		</dependency> -->
		<!-- spring -->

		<!-- mybatis-plus 依赖-->
		<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus</artifactId>
			<version>2.3</version>
		</dependency>
		<!-- mybatis-plus 依赖 -->
		
		<!-- c3p0-->
		<dependency>
			<groupId>com.mchange</groupId>
			<artifactId>c3p0</artifactId>
			<version>0.9.5.2</version>
		</dependency>

		<!-- mysql -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>5.1.35</version>
		</dependency>
		<!-- mysql -->

		<!-- log4j -->
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>${log4j.version}</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>${slf4j.version}</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>${slf4j.version}</version>
		</dependency>
		<!-- log4j -->

		<!-- lombok -->
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<version>1.16.10</version>
		</dependency>
		<!-- lombok -->


		 <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13-beta-2</version>
        </dependency>
	</dependencies>
</project>

集成mybatis-plus要把mybatis、mybatis-spring去掉,避免冲突;lombok是一个工具,添加了这个依赖,开发工具再安装Lombok插件,就可以使用它了,最常用的用法就是在实体类中使用它的@Data注解,这样实体类就不用写set、get、toString等方法了。关于Lombok的更多用法,请自行百度。

2.log4j.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration
	xmlns:log4j="http://jakarta.apache.org/log4j/">
	<appender name="STDOUT"
		class="org.apache.log4j.ConsoleAppender">
		<param name="Encoding" value="UTF-8" />
		<layout class="org.apache.log4j.PatternLayout">
			<param name="ConversionPattern"
				value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n" />
		</layout>
	</appender>
	<logger name="java.sql">
		<level value="debug" />
	</logger>
	<logger name="org.apache.ibatis">
		<level value="info" />
	</logger>
	<root>
		<level value="debug" />
		<appender-ref ref="STDOUT" />
	</root>
</log4j:configuration>

3.jdbc.properties:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/testmp?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=root

4.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>
	
</configuration>

5.spring-mp.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:p="http://www.springframework.org/schema/p"  
    xmlns:aop="http://www.springframework.org/schema/aop"   
    xmlns:context="http://www.springframework.org/schema/context"  
    xmlns:jee="http://www.springframework.org/schema/jee"  
    xmlns:tx="http://www.springframework.org/schema/tx"  
    xsi:schemaLocation="    
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd  
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd  
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd  
        http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.0.xsd  
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">    
        
    <!-- 配置整合mybatis-plus过程 -->
    <!-- 1、配置数据库相关参数properties的属性:${url} -->
    <context:property-placeholder location="classpath:jdbc.properties" />

	
    
    <!-- 2、配置数据库连接池 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driver}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>
	
    <!-- mybatis的sqlsessionFactorybean:org.mybatis.spring.SqlSessionFactoryBean-->
    <!-- 3、配置mybatis-plus的sqlSessionFactory -->
    <bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <property name="typeAliasesPackage" value="com.zhs.code.mp.entity"/>
        <!-- 注入全局配置 不注入不生效 -->
        <!-- <property name="globalConfig" ref="globalConfiguration"/> -->
    </bean>
    <!-- 4、DAO接口所在包名,Spring会自动查找其下的类 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.zhs.code.mp.dao" />
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    </bean> 
    <!--
		实体类需要加@TableName注解指定数据库表名,通过@TableId注解指定id的增长策略。
		实体类少倒也无所谓,实体类一多的话也麻烦。所以可以在spring-dao.xml的文件中进行全局策略配置。
		
		然后在MybatisSqlSessionFactoryBean中注入 globalConfiguration
		- <property name="globalConfig" ref="globalConfiguration"/> 
		- 
		如此一来,实体类中的@TableName注解和@TableId注解就可以去掉了。
 	-->
    <!-- 5、mybatisplus的全局策略配置 -->
	<bean id="globalConfiguration" class="com.baomidou.mybatisplus.entity.GlobalConfiguration">
	        <!-- 2.3版本后,驼峰命名默认值就是true,所以可不配置 -->
	        <!--<property name="dbColumnUnderline" value="true"/>-->
	        <!-- 全局主键自增策略,0表示auto -->
	        <property name="idType" value="0"/>
	        <!-- 全局表前缀配置 -->
	        <property name="tablePrefix" value="tb_"/>
	</bean>
</beans>

6.entity:
Employee .java

import com.baomidou.mybatisplus.annotations.TableField;
import com.baomidou.mybatisplus.annotations.TableId;
import com.baomidou.mybatisplus.annotations.TableName;
import com.baomidou.mybatisplus.enums.IdType;

import lombok.Data;

@Data
@TableName(value="employee")//指定表名
public class Employee {
	@TableId(value="id",type=IdType.AUTO)
	private Integer id;
	
	 //若没有开启驼峰命名,或者表中列名不符合驼峰规则,可通过该注解指定数据库表中的列名,exist标明数据表中有没有对应列
	@TableField(value="last_name",exist=true)
	private String lastName;
	private String email;
	private Integer gender;
	private Integer age;
}

7.mapper
EmplopyeeDao .java

import com.baomidou.mybatisplus.mapper.BaseMapper;
import com.zhs.code.mp.entity.Employee;

public interface EmplopyeeDao extends BaseMapper<Employee>{
	
}

这样就完成了mybatis-plus与spring的整合。首先是把mybatis和mybatis-spring依赖换成mybatis-plus的依赖,然后把sqlsessionfactory换成mybatis-plus的,然后实体类中添加@TableName、@TableId等注解,最后mapper继承BaseMapper即可。

五、测试or编写编写Service
1.table code

CREATE TABLE employee(
	id INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
	last_name VARCHAR(5) NOT NULL,
	email VARCHAR(30) NOT NULL,
	gender INT DEFAULT 0,
	age INT NOT NULL
);

2.insert操作:

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring-mp.xml"})
public class test {
    @Autowired
    private EmplopyeeDao emplopyeeDao;
    @Test
    public void testInsert(){
        Employee employee = new Employee();
        employee.setLastName("王");
        employee.setEmail("wang@qq.com");
        employee.setGender(0);
        employee.setAge(25);
        emplopyeeDao.insert(employee);
        //mybatisplus会自动把当前插入对象在数据库中的id写回到该实体中
        System.out.println(employee.getId());
    }
}

3、update操作:

@Test
public void testUpdate(){
        Employee employee = new Employee();
        employee.setId(1);
        employee.setLastName("二小");
        emplopyeeDao.updateAllColumnById(employee);//根据id进行更新,没传值的属性就更新为null
		//emplopyeeDao.updateById(employee);//根据id进行更新,没有传值的属性就不会更新
}

注:注意这两个update操作的区别,updateById方法,没有传值的字段不会进行更新,比如只传入了lastName,那么age、gender等属性就会保留原来的值;updateAllColumnById方法,顾名思义,会更新所有的列,没有传值的列会更新为null。

3、select操作:

1>
Employee employee = emplopyeeDao.selectById(1);
2>
Employee employeeCondition = new Employee();
employeeCondition.setId(1);
employeeCondition.setLastName("二小");
//若是数据库中符合传入的条件的记录有多条,那就不能用这个方法,会报错
Employee employee = emplopyeeDao.selectOne(employeeCondition);

注:这个方法的sql语句就是where id = 1 and last_name = 更新测试,若是符合这个条件的记录不止一条,那么就会报错。

3>
/*
	根据查询条件返回多条数据:
		当符合指定条件的记录数有多条时,上面那个方法就会报错,就应该用这个方法。
		
	注:查询条件用map集合封装,columnMap,写的是数据表中的列名,而非实体类的属性名。
	比如属性名为lastName,数据表中字段为last_name,
	这里应该写的是last_name。selectByMap方法返回值用list集合接收
*/
Map<String,Object> columnMap = new HashMap<>();
columnMap.put("last_name","东方不败");//写表中的列名
columnMap.put("gender","1");
List<Employee> employees = emplopyeeDao.selectByMap(columnMap);
System.out.println(employees.size());

通过id批量查询:

4>
/*
	注:把需要查询的id都add到list集合中,然后调用selectBatchIds方法,传入该list集合即可,
	该方法返回的是对应id的所有记录,所有返回值也是用list接收。
*/
List<Integer> idList = new ArrayList<>();
idList.add(1);
idList.add(2);
idList.add(3);
List<Employee> employees = emplopyeeDao.selectBatchIds(idList);
System.out.println(employees);

分页查询:

5>
/*
	注:selectPage方法就是分页查询,在page中传入分页信息,后者为null的分页条件,这里先让其为null,
	讲了条件构造器再说其用法。这个分页其实并不是物理分页,而是内存分页。
	也就是说,查询的时候并没有limit语句。等配置了分页插件后才可以实现真正的分页。

*/
List<Employee> employees = emplopyeeDao.selectPage(new Page<>(0,3),null);
System.out.println(employees);

六、条件构造器(EntityWrapper):

1、分页查询年龄在18 - 50且gender为0、姓名为二小的用户:

List<Employee> employees = emplopyeeDao.selectPage(new Page<Employee>(1,3),
     new EntityWrapper<Employee>()
        .between("age",18,50)
        .eq("gender",0)
        .eq("last_name","二小")
);

注:由此案例可知,分页查询和之前一样,new 一个page对象传入分页信息即可。至于分页条件,new 一个EntityWrapper对象,调用该对象的相关方法即可。between方法三个参数,分别是column、value1、value2,该方法表示column的值要在value1和value2之间;eq是equals的简写,该方法两个参数,column和value,表示column的值和value要相等。注意column是数据表对应的字段,而非实体类属性字段。

2、查询gender为0且名字中带有王、或者邮箱中带有qq的用户:

List<Employee> employees = emplopyeeDao.selectList(
                new EntityWrapper<Employee>()
               .eq("gender",0)
               .like("last_name","王")
                //.or()//和or new 区别不大
               .orNew()
               .like("email","qq")
);

注:未说分页查询,所以用selectList即可,用EntityWrapper的like方法进行模糊查询,like方法就是指column的值包含value值,此处like方法就是查询last_name中包含“老师”字样的记录;“或者”用or或者orNew方法表示,这两个方法区别不大,用哪个都可以,可以通过控制台的sql语句自行感受其区别。

3、查询gender为0,根据age排序,简单分页:

List<Employee> employees = emplopyeeDao.selectList(
                new EntityWrapper<Employee>()
                .eq("gender",0)
                .orderBy("age")//直接orderby 是升序,asc
                .last("desc limit 0,3")//在sql语句后面追加last里面的内容(改为降序,同时分页)
);

注:简单分页是指不用page对象进行分页。orderBy方法就是根据传入的column进行升序排序,若要降序,可以使用orderByDesc方法,也可以如案例中所示用last方法;last方法就是将last方法里面的value值追加到sql语句的后面,在该案例中,最后的sql语句就变为select ······ order by desc limit 1, 3,追加了desc limit 1,3所以可以进行降序排序和分页。

4、分页查询年龄在20-30且gender为0、姓名为王的用户:
条件构造器除了EntityWrapper,还有Condition。用Condition来处理一下这个需求:

 List<Employee> employees = emplopyeeDao.selectPage(
                new Page<Employee>(1,2),
                Condition.create()
                        .between("age",20,30)
                        .eq("gender","0")
                        .eq("last_name","王")
 );

注:Condition和EntityWrapper的区别就是,创建条件构造器时,EntityWrapper是new出来的,而Condition是调create方法创建出来。

5、根据条件更新:

@Test
public void testEntityWrapperUpdate(){
        Employee employee = new Employee();
        employee.setLastName("王");
        employee.setEmail("wang@163.com");
        employee.setGender(0);
        emplopyeeDao.update(employee,
                new EntityWrapper<Employee>()
                .eq("last_name","wang")
                .eq("age",15)
        );
}

6、根据条件删除:


emplopyeeDao.delete(
        new EntityWrapper<Employee>()
        .eq("last_name","tom")
        .eq("age",16)
);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值