zoukankan      html  css  js  c++  java
  • mybatis-通用mapper

    自定义通用mapper

    由于mapper做了分层结构,我们的mapper接口可不继承Mapper,而是有选择性的使用需要用到的封装好的相关方法。即自定义通用mapper
    封装好的方法

    配置数据库

    spring:
        datasource:
            username: root
            password: root
            url: jdbc:mysql://localhost:3306/mydb?characterEncoding=UTF-8&&serverTimezone=GMT&&allowMultiQueries=true
            driver-class-name: com.mysql.jdbc.Driver
    

    allowMultiQueries=true 允许一次执行多行sql语句

    1-编写自定义通用mapper接口并选择性的继承封装好的方法。

    public interface MyMapper<T> extends
            SelectAllMapper<T>,
            SelectByExampleMapper<T>{
    
    }
    

    2-个人mapper接口继承自定义通用mapper

    public interface EmployeeMapper extends MyMapper<Employee>{
    }
    

    3-测试

    @Autowired
    EmployeeMapper employeeMapper;
    
    @RequestMapping(value = "/selectByExample",method = RequestMethod.GET)
    public  List<Employee> selectByExample(Employee employee) {
        // 创建example对象
        Example example = new Example(Employee.class);
        //通过example设置查询条件
        Example.Criteria criteria1 = example.createCriteria();
        Example.Criteria criteria2 = example.createCriteria();
    
        criteria1.andGreaterThan("empSalary",3000)
                .andLessThan("empAge",25);
        criteria2.andLessThan("empSalary",5000)
                .andGreaterThan("empAge",30);
        example.or(criteria2);// 组装查询条件
        example.orderBy("empSalary").asc().orderBy("empAge").desc();// 排序
        example.setDistinct(true);//去重
        // 执行查询
        List<Employee> employees = employeeMapper.selectByExample(example);
        return employees;
    }
    

    扩展通用mapper接口

    个人mapper接口:普通dao层接口
    通用mapper接口或自定义通用mapper接口:已封装好相关sql操作的接口,拿来即用那种
    扩展通用mapper接口:个人自定义的sql操作接口

    1-定义【扩展接口】,使用相关注解注释并指定type和method(值为dynamicSQL),如: @UpdateProvider 加上@RegisterMapper

    @RegisterMapper
    public interface MyBatchUpdateMapper<T> {
        @UpdateProvider(type = MyBatchUpdateProvider.class ,method = "dynamicSQL")
        void batchUpdate(List<T> list);
    }
    

    2-定义【接口方法实现类】,返回相关拼接好的sql语句

    public class MyBatchUpdateProvider extends MapperTemplate{
        public MyBatchUpdateProvider(Class<?> mapperClass, MapperHelper mapperHelper) {
            super(mapperClass, mapperHelper);
        }
        /**
         * <foreach collection="list" item="record" separator=";" >
                UPDATE tabple_emp
                SET emp_name=#f{record.empName},
                emp_age=#{record.empAge},
                emp_salary=#{record.empSalary}
                where emp_id=#{record.empId}
            </foreach>
         * @param statement
         */
        public String batchUpdate(MappedStatement statement){  //方法名和接口需要保持一致
            StringBuilder builder = new StringBuilder();
            builder.append("<foreach collection="list" item="record" separator=";" >");
            Class<?> entityClass = super.getEntityClass(statement);
            String tableName = super.tableName(entityClass);
            String updateClause = SqlHelper.updateTable(entityClass, tableName);
            builder.append(updateClause);
            builder.append("<set>");
            Set<EntityColumn> columns = EntityHelper.getColumns(entityClass);
    
            String idColumn = null;
            String idHodler = null;
            for (EntityColumn entityColumn : columns){
                boolean isPrimaryKey = entityColumn.isId();
                if (isPrimaryKey){
                    idColumn = entityColumn.getColumn();
                    idHodler = entityColumn.getColumnHolder("record");
                }else {
                    String column = entityColumn.getColumn();
                    String columnHolder = entityColumn.getColumnHolder("record");
    
                    builder.append(column).append("=").append(columnHolder).append(",");
                }
            }
            builder.append("</set>");
    
            builder.append("WHERE ").append(idColumn).append("=").append(idHodler);
            builder.append("</foreach>");
    
            return builder.toString();
        }
    }
    

    3-【自定义通用mapper接口继承扩展接口】以及个人mapper接口继承自定义通用mapper接口

    public interface MyMapper<T> extends
            SelectAllMapper<T>,
            SelectByExampleMapper<T> ,
            MyBatchUpdateMapper<T> {
    
    }
    
    public interface EmployeeMapper extends MyMapper<Employee>{}
    

    或者【个人mapper接口直接继承扩展接口】

    public interface EmployeeMapper extends MyMapper<Employee> ,
            MyBatchUpdateMapper<Employee> {
    
    }
    

    4-测试

    @Autowired
    EmployeeMapper employeeMapper;
    
    @RequestMapping(value = "/batchUpdate",method = RequestMethod.GET)
    public void batchUpdate() {
        List<Employee> employees = new ArrayList<>();
        employees.add(new Employee(4,"newName01",111.11,11));
        employees.add(new Employee(5,"newName02",222.22,22));
        employees.add(new Employee(6,"newName03",222.22,33));
        employeeMapper.batchUpdate(employees);
    }
    
  • 相关阅读:
    U盘为什么还有剩余空间,但却提示说空间不够
    U盘安装系统
    win8 64位+Oracle 11g 64位下使用PL/SQL Developer 的解决办法
    Oracle 去掉重复字符串
    ORACLE获取字符串中数字部分
    MyBatis中的大于、小于、like等符号写法
    Oracle计算时间差函数
    HDU 3569 Imaginary Date 简单期望
    C语言之——文件操作模式
    LeetCode OJ 之 Ugly Number II (丑数-二)
  • 原文地址:https://www.cnblogs.com/xiaoaiying/p/14244232.html
Copyright © 2011-2022 走看看