通用CRUD
1.1 创建接口EmployeeMapper并继承BaseMapper<T>
public interface EmployeeMapper extends BaseMapper<Employee> {
/*
* Mapper接口
*
* 基于Mybatis: 在Mapper接口中编写CRUD相关的方法 提供Mapper接口所对应的SQL映射文件 以及 方法对应的SQL语句.
*
* 基于MP: 让XxxMapper接口继承 BaseMapper接口即可.
*
* BaseMapper<T>: 泛型指定的就是当前Mapper接口所操作的实体类类型
*
*/
// Integer insertEmployee(Employee employee );
// <insert useGeneratedKeys="true" keyProperty="id" > SQL...</insert>
}
2.1 创建测试类TestMPCRUD01进行测试
2.1.1 插入操作
public class TestMPCRUD01 {
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("mp@test.com");
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);
}
}
2.1.2 更新操作
@Test
public void testCommonUpdate() {
//初始化修改对象
Employee employee = new Employee();
employee.setId(4);
employee.setLastName("小泽老师");
employee.setEmail("xz@sina.com");
employee.setGender(0);
employee.setAge(33);
//Integer result = employeeMapper.updateById(employee);
Integer result = employeeMapper.updateAllColumnById(employee);
System.out.println("result: " + result);
}
2.1.3 查询操作
@Test
public void testCommonSelect() {
//1. 通过id查询
Employee employee = employeeMapper.selectById(1);
System.out.println(employee);
//2. 通过多个列进行查询 id + lastName
employee = new Employee();
employee.setId(4);
employee.setLastName("小泽老师");
employee.setGender(0);
Employee result = employeeMapper.selectOne(employee);
System.out.println("result: " + result);
//3. 通过多个id进行查询 <foreach>
List<Integer> idList = new ArrayList<>();
idList.add(4);
idList.add(5);
idList.add(6);
idList.add(7);
List<Employee> emps = employeeMapper.selectBatchIds(idList);
System.out.println(emps);
//4. 通过Map封装条件查询
Map<String, Object> columnMap = new HashMap<>();
columnMap.put("last_name", "Tom");
columnMap.put("gender", 1);
emps = employeeMapper.selectByMap(columnMap);
System.out.println(emps);
//5. 分页查询
emps = employeeMapper.selectPage(new Page<>(3, 2), null);
System.out.println(emps);
}
2.1.4 删除操作
@Test
public void testCommonDelete() {
//1 .根据id进行删除
Integer result = employeeMapper.deleteById(13);
System.out.println("result: " + result);
//2. 根据 条件进行删除
Map<String, Object> columnMap = new HashMap<>();
columnMap.put("last_name", "MP");
columnMap.put("email", "mp@test.com");
result = employeeMapper.deleteByMap(columnMap);
System.out.println("result: " + result);
//3. 批量删除
List<Integer> idList = new ArrayList<>();
idList.add(3);
idList.add(5);
result = employeeMapper.deleteBatchIds(idList);
System.out.println("result: " + result);
}
3.1 小结
3.1.1 通用
Integer insert(T entity);
Integer insertAllColumn(T entity);
Integer updateById(@Param("et") T entity);
Integer updateAllColumnById(@Param("et") T entity);
T selectById(Serializable id);
T selectOne(@Param("ew") T entity);
List<T> selectBatchIds(List<? extends Serializable> idList);
List<T> selectByMap(@Param("cm") Map<String, Object> columnMap);
List<T> selectPage(RowBounds rowBounds, @Param("ew") Wrapper<T> wrapper);
Integer deleteById(Serializable id);
Integer deleteByMap(@Param("cm") Map<String, Object> columnMap);
Integer deleteBatchIds(List<? extends Serializable> idList);
3.1.2 注解/全局配置
@TableName
全局的 MP 配置: <property name="tablePrefix" value="tbl_"></property>
@TableField
全局的 MP 配置: <property name="dbColumnUnderline" value="true"></property>
@TableId
全局的 MP 配置: <property name="idType" value="0"></property>
支持主键自增的数据库插入数据获取主键值
Mybatis: 需要通过 useGeneratedKeys 以及 keyProperty 来设置
MP: 自动将主键值回写到实体类中
4.1 SQL注入分析
- A. employeeMapper 的本质 org.apache.ibatis.binding.MapperProxy。
- B. MapperProxy 中 sqlSession –>SqlSessionFactory。
- C. SqlSessionFacotry 中 → Configuration→ MappedStatements。
- 每一个 mappedStatement 都表示 Mapper 接口中的一个方法与 Mapper 映射文件中的一个 SQL。
- MP 在启动就会挨个分析 xxxMapper 中的方法,并且将对应的 SQL 语句处理好,保存到 configuration 对象中的 mappedStatements 中。
- D. 实质:
- Configuration: MyBatis 或者 MP 全局配置对象。
- MappedStatement:一个 MappedStatement 对象对应 Mapper 配置文件中的一个select/update/insert/delete 节点,主要描述的是一条 SQL 语句。
- SqlMethod : 枚举对象 ,MP 支持的 SQL 方法。
- TableInfo:数据库表反射信息 ,可以获取到数据库表相关的信息。
- SqlSource: SQL 语句处理对象。
- MapperBuilderAssistant: 用于缓存、SQL 参数、查询方剂结果集处理等.通过 MapperBuilderAssistant 将每一个 mappedStatement添加到 configuration 中的 mappedstatements 中。