mybatis 之 DB的频繁修改应对策略

  mybatis 当前最流行的ORM框架,使用中最烦的事情是什么,无疑是需求的更改或者业务闭环思维不研究导致的数据库字段的增加或者删除,增加或删除一个字段需要在xml多个地方做相应的新增或删除字段操作,稍不谨慎,等待的将是一大波Exceptions,俗话说解决办法来源于问题的产生。接下来设计通用service 来解决DB频繁改动,带来的大量工作量。

  核心思路:

  0. mybatis 3.x 中通用mapper的集成使用

  1. 向上通用Service的设计(泛型思维 && 注入通用mapper)

  2. mapper 强制规范 (减少错误参数 && 加速开发)

  mapper 强制规范:

  0. 无级联查询(不是关联查询)的mapper 不写resultMap,如下这些代码坚决不要

 <resultMap id="BaseResultMap" type="com.javazx.batch.po.UserTo">
        <id column="id" property="id" jdbcType="BIGINT"/>
        <result column="user_name" property="userName" jdbcType="VARCHAR"/>
        <result column="sex" property="sex" jdbcType="INTEGER"/>
        <result column="age" property="age" jdbcType="INTEGER"/>
        <result column="address" property="address" jdbcType="VARCHAR"/>
        <result column="create_time" property="createTime" jdbcType="DATE"/>
        <result column="update_time" property="updateTime" jdbcType="DATE"/>
        <result column="status" property="status" jdbcType="INTEGER"/>
        <result column="remark" property="remark" jdbcType="VARCHAR"/>
    </resultMap>

  1. xml 中单表操作相关代码坚决不要,比如最烦人的update ,insert 包含大量代码的代码块。

  2. xml 中仅剩下了下边这些字段集

<sql id="Base_Column_List">
        id, user_name, sex,
        age, address,
        create_time, update_time, status, remark
    </sql>

  3. xml中sql操作都是关联表操作

  接下来系统说说通用Service的设计思路,以及设计步骤:

  0.控制层层代码变化不大,以前怎么样现在还怎么样:

@RequestMapping("/test")
    @ResponseBody
    public Object test(Country country){
        List<Country> all = myService.selectCountryByExalple(country);
        logger.info("------------selectAll-----------" + all + "---------------------------");
        return all;
    }

  1.业务层继承通用Service便于调用能够适用任何实体任何表的单表操作功能的方法

  

public interface MyService extends BaseTestService<Country>

  2. 通用Service -- 泛型的应用

public interface BaseTestService<T>

  3. 通用Service实现,几乎实现了所有单表操作

  

public class BaseTestServiceImpl<T>{
    @Autowired
    protected Mapper<T> mapper;

    public Mapper<T> getMapper() {
        return mapper;
    }

    public int delete(T entity) {
        return mapper.delete(entity);
    }
    public int delectByExample(Object example){
        return mapper.deleteByExample(example);
    }
    public int deleteByPrimaryKey(Object key){
        return mapper.deleteByPrimaryKey(key);
    }

    public int insert(T record){
        return mapper.insert(record);
    }
    public int insertSelective(T record){
        return mapper.insertSelective(record);
    }

    public List<T> select(T record){
        return mapper.select(record);
    }
    public List<T> selectAll(){
        return mapper.selectAll();
    }
    public List<T> selectByExalple(Object example){
        return mapper.selectByExample(example);
    }
    public List<T> selectByExampleAndRowBounds(Object example,RowBounds rowBounds){
        return mapper.selectByExampleAndRowBounds(example, rowBounds);
    }
    public T selectByPrimaryKey(Object key){
        return mapper.selectByPrimaryKey(key);
    }
    public List<T> selectByRowBounds(T record,RowBounds rowBounds){
        return mapper.selectByRowBounds(record, rowBounds);
    }
    public int selectCount(T record){
        return mapper.selectCount(record);
    }
    public int selectCountByExample(Object example){
        return mapper.selectCountByExample(example);
    }
    public T selectOne(T record){
        return mapper.selectOne(record);
    }

    public int updateByExample(T record,Object example){
        return mapper.updateByExample(record, example);
    }
    public int updateByExampleSelective(T record,Object example){
        return mapper.updateByExampleSelective(record, example);
    }
    public int updateByPrimaryKey(T record){
        return mapper.updateByPrimaryKey(record);
    }
    public int updateByprimaryKeySelective(T record){
        return mapper.updateByPrimaryKeySelective(record);
    }

}

  4. 业务Service实现,总体上是通过java代码构建操作数据库条件,然后调用通用Service方法

  

@Override
    public List<Country> selectCountryByExalple(Country country) {
        Example example = new Example(Country.class);
        Example.Criteria cirteria = example.createCriteria();
        if(StringUtils.isNotBlank(country.getCountryname())){
            cirteria.andLike("countryname", "%" + country.getCountryname() + "%");
        }
        return super.selectByExalple(example);
    }

其中cirteria中包含了我们几乎能够试用到的所有方法

  第三方参加引用:

<!--分页插件-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>${pagehelper.version}</version>
        </dependency>
        <!--通用Mapper-->
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper</artifactId>
            <version>${mapper.version}</version>
        </dependency>

  宗上,通用Service设计完成,简单且方便,实用且低复杂度,假设一个项目30个表,每个表字段适中,每个初始mapper中大约150行代码,使用上述xml规范,每个mapper大约7行代码左右,总代码由4500行减少到210行,这只是一个优点,关键点还是代码最后易维护,易迭代,不惧修改。

时间: 2024-10-27 11:01:37

mybatis 之 DB的频繁修改应对策略的相关文章

系列文章(一):探究电信诈骗的关键问题与应对策略

导读:伴随着互联网与移动网的融合,移动互联网变得更加开放.与此同时,伴随着新型的移动互联网服务模式的出现,移动互联网的安全问题也出现了新的形式及特点. 如今,移动互联网遭受到的攻击已严重影响了人们的隐私安全.信息安全,甚至危及国家安全,造成重大社会影响.本文重点以目前现有的移动互联网存在的电信诈骗问题为切入点,一步步详细分析其原因和应对策略.后续笔者将会针对电信诈骗中的关键问题另行它文进行分析. 电信诈骗案屡见不鲜 电信诈骗是指犯罪分子通过网络.电话和短信方式,编造虚假信息,设置骗局,对受害人实

项目风险应对策略总结

1. 负面风险应对策略 1)避免:修改项目计划以消除相应的威胁.项目早期中出现的一些风险可通过澄清.获得相关信息.改了沟通或获得专家指导而得到解决. 2)转移:把威胁的不利影响以及风险应对的责任转移到第三方的做法. 接受转移风险的人或团队需要得到相应的经济补偿.转移方法包括保险.性能约束.授权和保证.这过程中会用到契约.成本类契约可以转移成本风险给买主,固定价格的契约可以转移风险给卖方. 3)减轻:通过降低风险的概率和影响程度,使之达到一个可接受的范围.如在一个子系统中增加冗余设计,可减少由于原

大数据时代银行业应对策略

文|张建国(中国建设银行行长) 近十年来,中国银行业的改革发展取得了令世界瞩目的成就.在今年<银行家><福布斯>发布的大企业排行榜和市值排名上,五家大型商业银行均已跻身世界前列.随着以移动互联网.云计算.“大数据”和物联网为代表的信息革命的兴起,银行业又一次面临新的机遇和挑战.中国银行业能否用好大数据,实现经营.管理和服务创新,决定了其未来的可持续发展能力. 银行业已初步具备运用大数据的基础 大数据是信息技术与互联网产业发展到特定阶段的产物,从互联网到物联网,从云计算到大数据,信息

网络分流器-网络分流器-多核编程的几个难题及其应对策略

网络分流器-网络分流器-多核编程的几个难题及其应对策略! 戎腾网络: 随着多核CPU的出世,多核编程方面的问题将摆上了程序员的日程,有许多老的程序员以为早就有多CPU的机器,业界在多CPU机器上的编程已经积累了很多经验,多核CPU上的编程应该差不多,只要借鉴以前的多任务编程.并行编程和并行算法方面的经验就足够了. 我想说的是,像涉及到网络分流器采集器功能的多核处理板业内统称为业务处理板,而多核机器和以前的多CPU机器有很大的不同,以前的多CPU机器都是用在特定领域,比如服务器,或者一些可以进行大

Win7修改密码策略

第一步.Win+R打开cmd窗口输入gpedit.msc 第二步.修改密码策略(打开"计算机配置"-->"安全设置"-->"账户策略"-->"密码策略") 第三步.修改密码复杂度.密码使用期限 第四步.设置密码锁定次数 第五步.cmd下设置密码[net user administrator Hell0!jie]

触发JVM进行Full GC的情况及应对策略

Full GC又称作Major GC,属于老年代GC,指发生在老年代的GC,相对这种GC的有新生代GC即Minor GC.出现Full GC的时候经常伴随至少一次的Minor GC,但非绝对的,Major GC的速度一般会比Minor GC慢10倍以上.下边看看有那种情况触发JVM进行Full GC及应对策略. 1.System.gc()方法的调用 此方法的调用是建议JVM进行Full GC,虽然只是建议而非一定,但很多情况下它会触发 Full GC,从而增加Full GC的频率,也即增加了间歇

Windows 2008 修改密码策略

原创作品,出自 "深蓝的blog" 博客,欢迎转载,转载时请务必注明以下出处,否则追究版权法律责任. 深蓝的blog:http://blog.csdn.net/huangyanlong/article/details/44002455 对于有效期,如果设置为0,则代表永不失效. 至此,对于修改密码策略简要演示完毕. 小知识,简而记之. 原创作品,出自 "深蓝的blog" 博客,欢迎转载,转载时请务必注明以下出处,否则追究版权法律责任. 深蓝的blog:http://

软考论文的六大应对策略V0.1

软考论文的六大应对策略V0.1 短短2个小时,要写3000字的文章,对习惯了用电脑敲字.办公的IT从业人员而言,难度不下.尤其,大家会提笔忘字.笔者的应试策略,就是勤学苦练,考试前的一个星期,摸清套路,写3-4篇文章,靠前3-4天,多记忆点计算机专业知识点,考试前3个小时,再写一篇论文. 我上考场了,直接选一个我相较而言最为熟悉.最为贴近自己工作的题材,按照自己的已经准备的套路,准备的计算机专业知识点,洋洋洒洒写.如果自己还想怎么写,行文布局怎么组织,哪时间肯定不够. 策略一  最近1-2年论文

Hibernate修改命名策略

> 两步: 第一步:写一个替代Hibernate默认命名规则类(本类目标是把java[骆驼命名] 转换成 [下划线命名]) package paltform.init; import org.hibernate.cfg.ImprovedNamingStrategy; import org.hibernate.cfg.NamingStrategy; /**  * HIBERNATE 数据库字段命名规则  * */ public class HibernateNamingStrategy exten