一、创建具体的Mapper
接口
让需要编写的mapper
接口继承于BaseMapper
接口
public interface EmployeeMapper extends BaseMapper<Employee>{
}
继承BaseMapper<T>
接口以后,无需编写mapper.xml映射文件就可以CRUD功能
public interface BaseMapper<T> extends Mapper<T> {
int insert(T var1);
int deleteById(Serializable var1);
int deleteByMap(@Param("cm") Map<String, Object> var1);
int delete(@Param("ew") Wrapper<T> var1);
int deleteBatchIds(@Param("coll") Collection<? extends Serializable> var1);
int updateById(@Param("et") T var1);
int update(@Param("et") T var1, @Param("ew") Wrapper<T> var2);
T selectById(Serializable var1);
List<T> selectBatchIds(@Param("coll") Collection<? extends Serializable> var1);
List<T> selectByMap(@Param("cm") Map<String, Object> var1);
T selectOne(@Param("ew") Wrapper<T> var1);
Integer selectCount(@Param("ew") Wrapper<T> var1);
List<T> selectList(@Param("ew") Wrapper<T> var1);
List<Map<String, Object>> selectMaps(@Param("ew") Wrapper<T> var1);
List<Object> selectObjs(@Param("ew") Wrapper<T> var1);
<E extends IPage<T>> E selectPage(E var1, @Param("ew") Wrapper<T> var2);
<E extends IPage<Map<String, Object>>> E selectMapsPage(E var1, @Param("ew") Wrapper<T> var2);
}
二、insert
方法
/*
MyBatisPlus会使用实体类的类名到数据库中找对应的表
使用@TableName注解实现类名与数据库表名的映射关系
*/
@TableName(value = "tbl_employee")
public class Employee {
/*需要使用@TableId注解指定主键策略
value:指定表中主键列的列名
type:指定主键策略
*/
@TableId(value = "id", type = IdType.AUTO)
private Integer id;
private String lastName;
private String email;
private Integer gender;
private Integer age;
}
@Test
public void testInsert(){
Employee employee = new Employee();
employee.setLastName("mpTestInsert");
employee.setAge(23);
employee.setEmail("111@qq.com");
employee.setGender(1);
int result = employeeMapper.insert(employee);
System.out.println("result:" + result);
}
数据库中成功插入一条记录
三、MyBatisPlus全局策略配置
配置全局策略
<!--定义MyBatisPlus全局策略配置-->
<bean id="globalConfig" class="com.baomidou.mybatisplus.core.config.GlobalConfig">
<property name="dbConfig">
<bean class="com.baomidou.mybatisplus.core.config.GlobalConfig$DbConfig">
<!--实现属性名与数据库表的列名的映射-->
<property name="tableUnderline" value="true"></property>
<!--全局的主键策略-->
<property name="idType" value="AUTO"></property>
<!--全局的表前缀策略配置-->
<property name="tablePrefix" value="tbl_"></property>
</bean>
</property>
</bean>
还需要将MyBatisPlus全局策略配置注入到sqlSessionFactoryBean
中
<bean id="sqlSessionFactoryBean" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean">
<!-- 数据源 -->
<property name="dataSource" ref="dataSource"></property>
<property name="configLocation" value="classpath:mybatis-config.xml"></property>
<!-- 别名处理 -->
<property name="typeAliasesPackage" value="testMP.bean"></property>
<!--注入MyBatisPlus全局策略配置-->
<property name="globalConfig" ref="globalConfig"></property>
</bean>
四、@TableFiled
注解
//value对应数据库表列名,exist为true代表数据库表该字段存在
@TableField(value = "last_name", exist = true)
五、插入数据获取主键值
MyBatis需要通过userGeneratedKeys
以及keyProperty
来设置获取插入数据的主键值,而MyBatisPlus会自动将主键值写回到实体类中。
@Test
public void testInsert(){
Employee employee = new Employee();
employee.setLastName("mpTestInsert");
employee.setAge(23);
employee.setEmail("111@qq.com");
employee.setGender(1);
Integer result = employeeMapper.insert(employee);
System.out.println("result:" + result);
//获取当前数据在数据库中的主键值
Integer key = employee.getId();
System.out.println(key);
}
输出结果:
六、更新方法updateById
updateById
方法
@Test
public void testUpdateById(){
Employee employee = new Employee();
employee.setId(5);
employee.setLastName("bbaaaaaaa");
employee.setEmail("bbaaa@qq.com");
employee.setAge(53);
employee.setGender(1);
int result = employeeMapper.updateById(employee);
}
打印日志
当不是全字段修改时,未修改的字段保留之前的值
@Test
public void testUpdateById(){
Employee employee = new Employee();
employee.setId(5);
employee.setLastName("ssss");
//employee.setEmail("bbaaa@qq.com");
//employee.setAge(53);
employee.setGender(0);
int result = employeeMapper.updateById(employee);
}
打印日志
七、查询操作
selectById()
方法
@Test
public void testSelect(){
Employee employee = employeeMapper.selectById(1);
System.out.println(employee);
}
打印结果:
selectOne()
方法
多个条件组合查询
@Test
public void testSelectOne(){
Employee employee = new Employee();
employee.setId(3);
employee.setLastName("Black");
//封装需要查询的对象
QueryWrapper<Employee> employeeQueryWrapper = new QueryWrapper<Employee>(employee);
//按照多个列进行查询,
Employee selectOne = employeeMapper.selectOne(employeeQueryWrapper);
System.out.println(selectOne);
}
打印日志
selectBatchIds()
方法
通过多个id
值,查询多条记录
@Test
public void testSelectBatchIds(){
List<Integer> idList = new ArrayList<Integer>();
idList.add(1);
idList.add(3);
idList.add(4);
idList.add(7);
List<Employee> employees = employeeMapper.selectBatchIds(idList);
for (Employee employee : employees){
System.out.println(employee);
}
}
打印日志:
selectByMap()
方法
@Test
public void testSelectByMap(){
//通过Map封装查询条件
Map<String,Object> map = new HashMap<String, Object>();
map.put("last_name","White");
map.put("age",35);
List<Employee> employees = employeeMapper.selectByMap(map);
for (Employee employee : employees){
System.out.println(employee);
}
}
打印日志:
selectPage()
方法
分页查询
@Test
public void testSelectPage(){
Page<Employee> employeePage = employeeMapper.selectPage(new Page<Employee>(2, 3), null);
Object[] records = employeePage.getRecords().toArray();
int start = (int) ((employeePage.getCurrent() - 1) * employeePage.getSize());
int end = (int) (start + employeePage.getSize());
for (int i = start; i < end; i++){
System.out.println(records[i]);
}
}
打印日志:
八、删除操作
deleteById()
方法
@Test
public void testDeleteById(){
int result = employeeMapper.deleteById(17);
System.out.println("result:" + result);
}
deleteByMap()
方法
根据条件删除
@Test
public void testDeleteByMap(){
Map<String,Object> map = new HashMap<String, Object>();
map.put("last_name","ssss");
map.put("email","bbaaa@qq.com");
int result = employeeMapper.deleteByMap(map);
System.out.println("result:" + result);
}
deleteBatchIds()
方法
根据id
值删除多条记录
@Test
public void testDeleteIds(){
List<Integer> idList = new ArrayList<Integer>();
idList.add(7);
idList.add(9);
idList.add(11);
int result = employeeMapper.deleteBatchIds(idList);
System.out.println("result:" + result);
}
九、MP启动注入SQL原理分析
employeeMapper
本质上是MybatisMapperProxy
在MybatisMapperProxy
中一个sqlSession
属性
通过sqlSession
属性可以获取configuration
配置对象,配置对象包含全局配置信息
configuration
配置对象里面有一个mappedStatements
属性,里面的每一个MappedStatement
都表示Mapper
接口中的一个方法与Mapper
映射文件中的SQL语句,即接口中的哪个方法要执行哪个SQL语句。
sqlSource
里面封装了底层真正要执行的SQL语句
所以,MyBatisPlus在启动的时候就会挨个分析Mapper接口中的方法,并且将对应的SQL语句保存到configuration
中的mapperStatement
中。在调用每个方法时,就会从configuration
中找到对应的mapperStatement
,根据调用方法的名字找到对应的SQL语句执行。