3.1 通用 CRUD
1) 提出问题: 假设我们已存在一张 tbl_employee 表,且已有对应的实体类 Employee,实现 tbl_employee 表的 CRUD 操作我们需要做什么呢?
2) 实现方式:
基于 Mybatis
需要编写 EmployeeMapper 接口,并手动编写 CRUD 方法 提供 EmployeeMapper.xml 映射文件,并手动编写每个方法对应的 SQL 语句.
基于 MP
只需要创建 EmployeeMapper 接口, 并继承 BaseMapper 接口.这就是使用 MP 需要完成的所有操作,甚至不需要创建 SQL 映射文件。
3.2 插入操作
@Test public void testInsert(){ //初始化Employee对象 Employee employee = new Employee(); employee.setLastName("shuchegnxi"); employee.setEmail("shuchegnxi@atguigu.com"); //insert 方法在插入时,会根据实体类的每个属性进行非空判断,只有非空属性对应的字段才会出现到sql语句中 employeeMapper.insert(employee); //insertAllColumn方法在插入时,无论属性是否为空,属性所对应的字段都会出现到sql语句中 //employeeMapper.insertAllColumn(employee); //获取当前数据在数据库中的主键值 System.out.println("主键值:"+employee.getId()); }
和插入相关的属性和配置
@TableId
/* @TableId: value : 指定表中主键列的列名,如果实体的属性和列名一直,则可以省略不指定 type: 指定主键的策略 */ @TableId(value = "id",type = IdType.AUTO)
@TableName
// 指定该实体对应的数据库的表名 @TableName(value = "tbl_employee")
mybatisplus的全局配置+注入到 sqlSessionFactoryBean
<bean id="sqlSessionFactoryBean" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean"> <!-- 数据源 --> <property name="dataSource" ref="dataSource"></property> <property name="configLocation" value="classpath:mybatis.xml"></property> <!-- 别名处理 --> <property name="typeAliasesPackage" value="com.atguigu.mp.beans"></property> <!-- 注入全局MP策略配置 --> <property name="globalConfig" ref="globalConfiguration"></property> </bean> <!-- 定义MybatisPlus的全局策略配置--> <bean id ="globalConfiguration" class="com.baomidou.mybatisplus.entity.GlobalConfiguration"> <!-- 在2.3版本以后,dbColumnUnderline 默认值就是true --> <property name="dbColumnUnderline" value="true"></property> <!-- 全局的主键策略 --> <property name="idType" value="0"></property> <!-- 全局的表前缀策略配置 --> <property name="tablePrefix" value="tbl_"></property> </bean>
@TableField
当没有配置转驼峰的全局配置时,则需要使用该注解,映射实体类的属性和数据库的字段
@TableField(value = "last_name") private String lastName;
当实体中有某个属性,但是数据库中没有相应字段时,则需要设置
@TableField(exist = false)
插入数据获取主键值
mabatis会自动将主键 值,插入到实体类中
insertAllColumn方法
//insert 方法在插入时,会根据实体类的每个属性进行非空判断,只有非空属性对应的字段才会出现到sql语句中 employeeMapper.insert(employee); //insertAllColumn方法在插入时,无论属性是否为空,属性所对应的字段都会出现到sql语句中 employeeMapper.insertAllColumn(employee);
3.3 更新操作
@Test public void testUpdate(){ Employee employee = new Employee(); employee.setId(9); employee.setLastName("houchen"); employee.setEmail("houchen@qq.com"); employee.setGender(2); //返回结果是 对当前数据库影响的行数 // Integer result = employeeMapper.updateById(employee); System.out.println(result); }
3.4 查询操作
//通过id查询 Employee employee = employeeMapper.selectById(9); System.out.println(employee); //通过多个列进行查询 Employee emp = new Employee(); emp.setLastName("houchen"); emp.setEmail("houchen@qq.com"); Employee employee1 = employeeMapper.selectOne(emp); System.out.println(employee1); // 通过多个id进行查询 List<Employee> employees = employeeMapper.selectBatchIds(Arrays.asList(1, 2, 3)); for(Employee e:employees){ System.out.println(e); } //selectByMap HashMap<String, Object> columnMap = new HashMap<>(); //key 是表中的列名 columnMap.put("last_name", "houchen"); List<Employee> employees = employeeMapper.selectByMap(columnMap); for(Employee e:employees){ System.out.println(e); } //分页查询 selectPage List<Employee> employees = employeeMapper.selectPage(new Page<>(2, 2), null); for(Employee e:employees){ System.out.println(e); }
3.5 删除操作
@Test public void testDelete(){ //根据ID删除数据 //employeeMapper.deleteById(9); //根据条件删除数据 HashMap<String, Object> columnMap = new HashMap<>(); //key 是表中的列名 columnMap.put("last_name", "MP"); employeeMapper.deleteByMap(columnMap); // 批量删除deleteBatchIds employeeMapper.deleteBatchIds(Arrays.asList(1,2)); }
3.6 MP启动注入sql原理分析
SqlSessionFacotry 中 → Configuration→ MappedStatements 每一个 mappedStatement 都表示 Mapper 接口中的一个方法与 Mapper 映射文件 中的一个 SQL。
MP 在启动就会挨个分析 xxxMapper 中的方法,并且将对应的 SQL 语句处理好,保 存到 configuration 对象中的 mappedStatements 中
3.7 通用crud总结
以上是基本的 CRUD 操作,如您所见,我们仅仅需要继承一个 BaseMapper 即可实现 大部分单表 CRUD 操作。BaseMapper 提供了多达 17 个方法给大家使用, 可以极其方 便的实现单一、批量、分页等操作。极大的减少开发负担