• mybatis的enum重构


    有那么一种特殊情况, 我估计是数据库早已存在并运行, 现在要换用mybatis去做访问, 那么有些值, 比如男女, 比如种族, 甚至户籍, 都可以用enum枚举形式来当作字段.

    这里拿账户的enable属性/字段做例子, 简单一点的情况是, disabled是0, enabled是1, 但是如果现有的数据库是反过来的, 或者其他的一些特殊情况, 需要自定义value顺序, 就需要建enum的同时, 也重写一个叫TypeHandler的类, 使用它, 让mybatis知道model数据的值与数据库值之间的一一对应(当然, 我们也可以把这活儿直接扔给前端的人, 让他们去折腾, 对吧, 但是作为一个全栈, 啥都要会点儿, 对吧).

    首先是建一个enum叫Enalbed, 或者enable什么,都可以.

    public enum Enabled {
        disabled(1), enabled(0);
        private final int value;
    
        private Enabled(int value) {
            this.value = value;
        }
        
        public int getValue() {
            return value;
        }
    }

    注意有个构造函数, 指明要将对应的整数值写到对应的字面值上去., 另外说一句, C里面的enum规则就很原始或说简单, 直接就是从0开始往上加的.

    然后建handler类, 要实现一个接口:

    public class EnabledNewTypeHandler implements TypeHandler<Enabled> {
    
        private final Map<Integer, Enabled> EnabledMap = new HashMap<Integer, Enabled>();
    
        public EnabledNewTypeHandler() {
            for (Enabled Enabled : Enabled.values()) {
                EnabledMap.put(Enabled.getValue(), Enabled);
            }
        }
    
        @Override
        public void setParameter(java.sql.PreparedStatement ps, int i, Enabled parameter, JdbcType jdbcType)
                throws SQLException {
            ps.setInt(i, parameter.getValue());
    
        }
    
        @Override
        public Enabled getResult(ResultSet rs, String columnName) throws SQLException {
            Integer value = rs.getInt(columnName);
            return EnabledMap.get(value);
        }
    
        @Override
        public Enabled getResult(ResultSet rs, int columnIndex) throws SQLException {
            Integer value = rs.getInt(columnIndex);
            return EnabledMap.get(value);
        }
    
        @Override
        public Enabled getResult(CallableStatement cs, int columnIndex) throws SQLException {
            Integer value = cs.getInt(columnIndex);
            return EnabledMap.get(value);
        }
    
    }

    基本上就是把column值转成enum值

    接着要改配置文件mybatis-config.xml

        <typeHandlers>
            <!-- 由于这里使用了新的Eabled的枚举,所以handler也要随之改改  -->
            <typeHandler javaType="marc.mybatis.lesson1.type.Enabled" handler="marc.mybatis.lesson1.type.EnabledNewTypeHandler" />
                
                <!-- <typeHandler 
                javaType="marc.mybatis.lesson1.type.Enabled" handler="org.apache.ibatis.type.EnumOrdinalTypeHandler" 
                /> -->
    
        </typeHandlers>

    下面注释掉的如果直接使用默认的顺序, 从0开始加的, 就直接用ibatis自带的handler就可以, 但是我们比较变态, 重写过, 在这个加上.

    另外值得注意的是, 这个mybatis的配置文件, 各种配置的先后顺序是有讲究的,不能前后颠倒, 不然会编译不通过.

    测试方法一并放这儿:

        @Test
        //这个测试用来测试将enable字段由int改成新的enum枚举类型EnabledNew
        //测试通过,数据已经插入
        public void testEnumNew() {
            SqlSession sqlSession = getSqlSession();
            try {
                SysRoleMapper sysRoleMapper = sqlSession.getMapper(SysRoleMapper.class);
                SysRole resultRole = sysRoleMapper.selectById(1L);
                System.out.println(resultRole);
                //接着再插入一条使用枚举类型创建的enable字段的数据
                SysRole sysRole = new SysRole();
                sysRole.setRoleName("测试用角色2");
                sysRole.setCreateBy(1L);
                sysRole.setCreateTime(new Date());
                sysRole.setEnabled(Enabled.disabled);
                int result = sysRoleMapper.insertRoleWithKeyReturn(sysRole);
                sqlSession.commit();
                System.out.println(result);
            } finally {
                sqlSession.close();
            }
    
        }

    结果插入的记录, enable是1, 也就是Enable这个enum里面的disabled(1).

  • 相关阅读:
    微信接口开发之高级篇系列【微信权限封装类WechatAuth】
    微信接口开发之高级篇系列【用户分组接口和生成带参数的二维码】
    微信接口开发之高级篇系列【网页授权获取用户基本信息】
    微信接口开发之高级篇系列【微信JS-SDK】
    微信接口开发之高级篇系列【网页授权详细说明【提供测试账号使用】】
    微信接口开发之高级篇系列【网页授权接口】
    历史SQL语句之一
    盘点2019 | 金融科技发展大事件~
    FinTech终于被正名!央行印发金融科技发展规划
    安装配置开源的laravel项目到本地环境
  • 原文地址:https://www.cnblogs.com/Montauk/p/9797159.html
Copyright © 2020-2023  润新知