zoukankan      html  css  js  c++  java
  • 浅谈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}));
        }
        
        
    }
  • 相关阅读:
    遍历切片slice,结构体struct,映射map,interface{}的属性和值
    [转]Go语言string,int,int64 ,float之间类型转换方法
    [转] golang中struct、json、map互相转化
    [转]Jupyter默认目录和默认浏览器修改
    sublime text3输出窗口中文显示乱码问题解决方案
    Oracle 在SQL语句中如何获取系统当前时间并进行操作
    eclipse调试的时候怎么后退?
    外部无法访问虚拟机8088和50070端口
    hadoop启动后jps查不到namenode的解决办法
    Java给整数部分的字符串加上千分位分隔符
  • 原文地址:https://www.cnblogs.com/jayhou/p/9807758.html
Copyright © 2011-2022 走看看