浅谈MyBatis-Plus学习之通用CRUD
一、实现通用CRUD的方式
下面内容基于前篇文章在DB中已创建tbl_employee表格,并且在project中已有相应实体Employee类
对于Mybatis来说:
需要编写相应的接口EmployeeMapper,然后编写CRUD方法;编写对应的EmployeeMapper.xml映射文件,并针对每个方法编写SQL语句
对于MP来说:
只需要编写接口EmployeeMapper,然后继承BaseMapper<T>接口,就可以
因为BaseMapper接口内置很多CRUD方法,然后通过泛型将实体的属性映射到DB中的表字段
然后产生接口代理对象
public interface EmployeeMapper extends BaseMapper<Employee>{ //继承BaseMapper接口,内置通用的CRUD方法 }
MP默认规定实体类的设定:
主键叫id;名称(实体名和属性名)映射到DB表为驼峰命名,这样无须注解设置,因为这样MP通过这样的约定俗成方便实体跟数据库映射
但,通常开发中都很少这样的,因此MP提供一系列注解方便映射
表名注解 @TableName
主键注解 @TableId
字段注解 @TableField
@TableName(value="tbl_employee") public class Employee { @TableId(type=IdType.AUTO) //指定主键策略, 这里指定为数据库自增, 默认主键类型是IdType.ID_WORKER;全局唯一ID private Integer id; @TableField(value="last_Name") private String lastName; //默认驼峰命名到数据库字段下划线的转换 private String email; private Integer gender; private Integer age; @TableField(exist=false) //不会将该字段映射到数据库表 private Integer status;
关注解更多的介绍,可以翻阅官方文档,有更详尽介绍
在开发过程中数据库表跟实体是很多的,为了减轻在每个实体中重复性设置注解。
MP提供全局配置策略
<bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.spring.MybatisSqlSessionFactoryBean"> <property name="dataSource" ref="dataSource"></property> <property name="configLocation" value="classpath:mybatis-config.xml" /> <property name="typeAliasesPackage" value="cn.hjj.mp.entity"></property> <property name="globalConfig" ref="globalConfiguration"></property> </bean> <!-- mybatis-plus全局配置策略 ,这样避免重复在每一个实体中使用注解进行配置--> <bean id="globalConfiguration" class="com.baomidou.mybatisplus.entity.GlobalConfiguration"> <property name="dbColumnUnderline" value="true"></property> <!-- 2.3版本后默认配置数据库下划线--> <!-- 指定数据库ID生成策略 0:数据库自增--> <property name="idType" value="0"></property> <!-- 指定数据库表前缀 --> <property name="tablePrefix" value="tbl_"></property> </bean>
二、通用CRUD操作演示
以上可以看到EmployeeMapper接口中内置很多的通用CRUD操作
下面以代码形式展示
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(locations= {"classpath:applicationContext.xml"}) public class TestCommonCRUD { @Autowired private EmployeeMapper employeeMapper; /** * 基本插入测试 */ @Test public void testCommonInsert() { Employee employee = new Employee(); employee.setLastName("jack"); employee.setEmail("jack@qq.com"); employee.setAge(20); //employee.setGender(0); Integer res = employeeMapper.insert(employee); System.out.println("res: " + res); //自动回写到操作的Entity中 System.out.println("the pk of employee: " + employee.getId()); } /** * 基本插入所有字段测试 */ @Test public void testCommonInsertAll() { Employee employee = new Employee(); employee.setLastName("jack"); employee.setEmail("jack@qq.com"); employee.setAge(20); //employee.setGender(0); Integer res = employeeMapper.insertAllColumn(employee); System.out.println("res: " + res); } /** * 基本更新测试,根据Id */ @Test public void testCommonUpdate() { Employee employee = new Employee(); employee.setId(6); employee.setLastName("Andy"); //employee.setEmail("andy@qq.com"); employee.setAge(20); employee.setGender(1); Integer res = employeeMapper.updateById(employee); System.out.println("res: " + res); } /** * 基本更新全部测试,根据Id * 如果字段对应的实体属性没有设置,则提供默认值。 */ @Test public void testCommonUpdateAll() { Employee employee = new Employee(); employee.setId(7); employee.setLastName("Andy"); employee.setEmail("andy@qq.com"); //employee.setAge(20); employee.setGender(1); Integer res = employeeMapper.updateAllColumnById(employee); System.out.println("res: " + res); } /** * 基本查询测试,根据Id */ @Test public void testCommonSelect() { Employee employee = employeeMapper.selectById(1); System.out.println(employee); } /** * 根据实体封装查询条件,来查询一个记录, * 如果查询结果有多个,会报对应的异常信息 */ @Test public void testCommonSelectOne() { Employee employee = new Employee(); employee.setLastName("Jerry"); employee.setAge(20); System.out.println(employeeMapper.selectOne(employee)); } /** * 根据id集合,查询数据库中多个记录 */ @Test public void testCommonSelectBatchIds() { List<Integer> ids = new ArrayList<>(); ids.add(1); ids.add(2); ids.add(3); ids.add(4); List<Employee> emps = employeeMapper.selectBatchIds(ids); System.out.println(emps); } /** * 根据map封装查询条件 */ @Test public void testCommonSelectByMap() { Map<String, Object> map = new HashMap<String, Object>(); map.put("last_name", "jack"); map.put("age", 20); List<Employee> emps = employeeMapper.selectByMap(map); System.out.println(emps); } /** * 根据条件查询分页数据 * RowBounds对象是ibatis提供的用于封装分页条件的实体 * Page是实现分页的辅助类 * 没有通过limit来进行分页操作, * 其实本质上是通过ibatis的RowBounds进行分页,也就是在内存中进行分页 * 不推荐使用 */ @Test public void testCommonSelectPage() { List<Employee> page = employeeMapper.selectPage(new Page<>(2, 2), null); System.out.println(page); } /** * 删除数据,根据id */ @Test public void testCommonDeleteById() { Integer res = employeeMapper.deleteById(11); System.out.println("res: " + res); } /** * 删除数据,根据Map集合封装数据 */ @Test public void testCommonDeleteByMap() { Map<String, Object> map = new HashMap<>(); map.put("last_name", "Andy"); map.put("email", "andy@qq.com"); Integer res = employeeMapper.deleteByMap(map); System.out.println("res: " + res); } /** * 删除数据,根据id集合 */ @Test public void testCommonDeleteBatchIds() { employeeMapper.deleteBatchIds(Arrays.asList(new Integer[] {1, 2, 3, 4})); } }