官方地址:https://mp.baomidou.com/guide/#%E7%89%B9%E6%80%A7
(1)MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
(2)支持任何能使用 mybatis 进行 crud, 并且支持标准 sql 的数据库
(3)框架结构
2.1 MP安装
通过Maven安装(官网给的安装都是集成springboot里面的了),但是尚硅谷教程里面这节的mybatisPlus还是单独和spring来一起的,反正最后也是用springboot,就不记录过时的上来了。
https://mp.baomidou.com/guide/install.html#release
2.2 创建测试表
创建库
CREATE DATABASE mp;
-- 使用库
USE mp;
-- 创建表
CREATE TABLE tbl_employee(
id INT(11) PRIMARY KEY AUTO_INCREMENT,
last_name VARCHAR(50),
email VARCHAR(50),
gender CHAR(1),
age int
);
INSERT INTO tbl_employee(last_name,email,gender,age) VALUES('Tom','[email protected]',1,22);
INSERT INTO tbl_employee(last_name,email,gender,age) VALUES('Jerry','[email protected]',0,25);
INSERT INTO tbl_employee(last_name,email,gender,age) VALUES('Black','[email protected]',1,30);
INSERT INTO tbl_employee(last_name,email,gender,age) VALUES('White','[email protected]',0,35);
特别说明:定义javabean中的实体类最好使用包装类,虽然现在已经可以有自动包装,和自动拆箱。但是如果使用基本数据类型,基本数据类型都有默认值,int的默认值为0,boolean默认值为false,主要是由于mysql有非空判定,默认值会让mysql判断不准确。所以最好用包装类
@TableName
官网:https://mp.baomidou.com/guide/annotation.html#tablename
javabean代码
package com.atguigu.mp.beans;
/*
* MybatisPlus会默认使用实体类的类名到数据中找对应的表.
*/
//@TableName(value="tbl_employee")
public class Employee {
/*
* @TableId:
* value: 指定表中的主键列的列名, 如果实体属性名与列名一致,可以省略不指定.
* type: 指定主键策略.
*/
//@TableId(value="id" , type =IdType.AUTO)
private Integer id ; // int
@TableField(value = "last_name")
private String lastName;
private String email ;
private Integer gender;
private Integer age ;
@TableField(exist=false)
private Double salary ;
//get、set、toString等等
2.4 在项目中加入项目所需的各类配置文件
2.4.1 加入mybatis的全局配置文件mybatis-config.xml
项目/src/main/resources/mybatis-config.xml(有这个文件就行了,啥都不用写,配置交给spring做)
<configuration>
configuration>
2.4.2 加入log4j.xml配置文件(日志框架多了,也不是一定要用这个写日志)
项目/src/main/resources/log4j.xml
具体配置方法见https://blog.csdn.net/chengqingshihuishui/article/details/112733634
或者看官网https://my.oschina.net/xianggao/blog/523401
2.4.3加入db.propertis连接配置信息
项目/src/main/resources/db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mp
jdbc.username=root
jdbc.password=1234
2.4.5 加入spring的配置文件 applicationContext.xml
项目/src/main/applicationContext.xml
以下是mp01项目的完整版配置文件
(1)集成MybatisPlus
Mybatis-Plus 的集成非常简单,对于Spring,我们仅需要把 Mybatis 自带的MybatisSqlSessionFactoryBean替换为替换为MP自带的即可。见代码(id=“sqlSessionFactoryBean”)
<context:property-placeholder location="classpath:db.properties"/>
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}">property>
<property name="jdbcUrl" value="${jdbc.url}">property>
<property name="user" value="${jdbc.username}">property>
<property name="password" value="${jdbc.password}">property>
bean>
<bean id="dataSourceTransactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource">property>
bean>
<tx:annotation-driven transaction-manager="dataSourceTransactionManager"/>
<bean id="sqlSessionFactoryBean" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean">
<property name="dataSource" ref="dataSource">property>
<property name="configLocation" value="classpath:mybatis-config.xml">property>
<property name="typeAliasesPackage" value="com.atguigu.mp.beans">property>
<property name="globalConfig" ref="globalConfiguration">property>
bean>
<property name="dbColumnUnderline" value="true">property>
<property name="idType" value="0">property>
<property name="tablePrefix" value="tbl_">property>
bean>
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.atguigu.mp.mapper">property>
bean>
beans>
2.5 测试Spring-Mybatis的环境,保证ok
package com.atguigu.mp.test;
public class TestMP {
private ApplicationContext ioc =
new ClassPathXmlApplicationContext("applicationContext.xml");
@Test
public void testDataSource() throws Exception {
DataSource ds = ioc.getBean("dataSource",DataSource.class);
System.out.println(ds);
Connection conn = ds.getConnection();
System.out.println(conn);
}
}
3.1 通用CRUD
(1)提出问题:
假设我们已存在一张tbl_employee表,且已有对应的实体类表,Employee,实现tbl_employee表的CRUD操作我们需要做什么呢?
(2)实现方式:
基于Mybatis:
需要编写EmployeeMapper接口,并手动编写CRUD方法提供 EmployeeMapper.xml映射文件,并手动编写每个方法对应的SQL语句。
基于MP:
只需要创建EmployeeMapper接口 , 并继承BaseMapper接口,这就是使用MP需要完成的所有操作,甚至不创建SQL映射文件。
**说明:**继承好该接口就ok,如果只用提供的sql语句,啥都不用写。
package com.atguigu.mp.mapper;
/**
* Mapper接口
* 基于Mybatis:在Mapper接口中编写CRUD相关的方法,提供Mapper接口所对应的SQL映射文件 以及 方法对应的SQL语句.
*
* 基于MP: 让XxxMapper接口继承 BaseMapper接口即可.
* BaseMapper : 泛型指定的就是当前Mapper接口所操作的实体类类型
*
*/
public interface EmployeeMapper extends BaseMapper<Employee> {
// Integer insertEmployee(Employee employee );
// SQL...
}
3.2 插入操作(结合前面的实体类代码)
package com.atguigu.mp.test;
public class TestMP {
private ApplicationContext ioc =
new ClassPathXmlApplicationContext("applicationContext.xml");
private EmployeeMapper employeeMapper =
ioc.getBean("employeeMapper",EmployeeMapper.class);
/**
* 通用 插入操作
*/
@Test
public void testCommonInsert() {
//初始化Employee对象
Employee employee = new Employee();
employee.setLastName("MP");
employee.setEmail("[email protected]");
//employee.setGender(1);
//employee.setAge(22);
employee.setSalary(20000.0);
//插入到数据库
// insert方法在插入时,会根据实体类的每个属性进行非空判断,只有非空的属性对应的字段才会出现到SQL语句中
//Integer result = employeeMapper.insert(employee);
//insertAllColumn方法在插入时,不管属性是否非空,属性所对应的字段都会出现到SQL语句中.
Integer result = employeeMapper.insertAllColumn(employee);
System.out.println("result: " + result );
//获取当前数据在数据库中的主键值
Integer key = employee.getId();
System.out.println("key:" + key );
}
}
说明:
insert方法在插入时,会根据实体类的每个属性进行非空判断,只有非空的属性对应的字段才会出现到SQL语句中:
Integer result = employeeMapper.insert(employee);
Integer result = employeeMapper.insertAllColumn(employee);方法在插入时,不管属性是否非空,属性所对应的字段都会出现到SQL语句中.
3.3 关于更新操作
package com.atguigu.mp.test;
public class TestMP {
private ApplicationContext ioc =
new ClassPathXmlApplicationContext("applicationContext.xml");
private EmployeeMapper employeeMapper =
ioc.getBean("employeeMapper",EmployeeMapper.class);
/**
* 通用 更新操作
*/
@Test
public void testCommonUpdate() {
//初始化修改对象
Employee employee = new Employee();
employee.setId(7);
employee.setLastName("小泽老师");
employee.setEmail("[email protected]");
employee.setGender(0);
//employee.setAge(33);
//Integer result = employeeMapper.updateById(employee);
Integer result = employeeMapper.updateAllColumnById(employee);
System.out.println("result: " + result );
}
}
3.4 查询操作
package com.atguigu.mp.test;
public class TestMP {
private ApplicationContext ioc =
new ClassPathXmlApplicationContext("applicationContext.xml");
private EmployeeMapper employeeMapper =
ioc.getBean("employeeMapper",EmployeeMapper.class);
/**
* 通用 查询操作
*/
@Test
public