欢迎访问昆山宝鼎软件有限公司网站! 设为首页 | 网站地图 | XML | RSS订阅 | 宝鼎邮箱 | 后台管理


新闻资讯

MENU

软件开发知识

【MyBatis源码阐明】情况筹备

点击: 次  来源:宝鼎软件 时间:2017-07-30

原文出处: 五月的仓颉

前言

之前一段时间写了【Spring源码分析】系列的文章,感觉对Spring的原理及使用各方面都掌握了不少,趁热打铁,开始下一个系列的文章【MyBatis源码分析】,在【MyBatis源码分析】文章的基础之上,可以继续分析数据库连接池、Spring整合MyBatis源码、Spring事物管理tx等等。

【MyBatis源码分析】整个文章结构相较【Spring源码分析】稍微改一改,后者会在每一部分源码分析的开头列出要分析的源码的实例,比如:

  • 分析Bean流程加载,就会先写Bean的代码示例及xml中配置Bean的示例
  • 分析AOP流程,就会先写AOP的代码及xml中配置AOP的示例
  • 【MyBatis源码分析】系列文章,在本文中会一次性地将所有的代码示例写完,之后就针对这些代码一部分一部分进行分析,探究MyBatis原理。

    其实MyBatis代码示例,我在之前的文章里面记得至少写了两遍,完全可以拿之前的文章作为例子,但是这里要再写一遍,就希望分享给网友朋友们一点态度:作为一个程序员,还是应当多去写代码,多去实践,不要认为之前写过的东西就没必要再写一遍,之前懂的内容就没必要再学习一遍,温故知新,写得越多用得越熟练,思考得越多成长越快。

    SQL准备

    首先还是建表,这里准备一段SQL:

    drop table if exists mail;
    
    create table mail 
    (
      id          int         auto_increment not null comment '主键id',
      create_time datetime    not null  comment '创建时间',
      modify_time timestamp   not null  comment '修改时间',
      web_id      int         not null  comment '站点id,1表示新浪,2表示QQ,3表示搜狐,4表示火狐',
      mail        varchar(50) not null  comment '邮箱名',
      use_for     varchar(30)           comment '邮箱用途',
      primary key(id),
      index use_for(use_for),
      unique index web_id_mail(web_id, mail)
    )charset=utf8 engine=innodb comment='邮箱表';

    很多人可能有不止一个邮箱,新浪的、腾讯的、搜狐的,每个邮箱可能又有不一样的用途,这里就拿邮箱做一个例子。

    建立每张表的时候应当注意唯一约束,图纸加密,像这里,一个网站下的邮箱一定是唯一的,不可能在新浪下同时存在两个名为”123@sina.com”的邮箱名,因此对web_id+mail做唯一索引。

    建立实体类

    建立完毕SQL之后,第二步一定是为表建立在Java层面的实体类,在SQL层面不同的词语使用”_”分割,在Java层面不同的词语则使用驼峰命名法:

  • 对于类名/接口名/枚举类,使用首字母大写的驼峰命名法
  • 对于字段,使用首字母小写的驼峰命名法
  • 现在为mail表建立实体类:

    public class Mail {
    
        /**
         * 主键id
         */
        private long id;
        
        /**
         * 创建时间
         */
        private Date createTime;
        
        /**
         * 修改时间
         */
        private Date modifyTime;
        
        /**
         * 网站id,1表示新浪,2表示QQ,3表示搜狐,4表示火狐
         */
        private int webId;
        
        /**
         * 邮箱
         */
        private String mail;
        
        /**
         * 用途
         */
        private String useFor;
        
        public Mail() {
            
        }
        
        public Mail(int webId, String mail, String useFor) {
            this.webId = webId;
            this.mail = mail;
            this.useFor = useFor;
        }
    
        public long getId() {
            return id;
        }
    
        public void setId(long id) {
            this.id = id;
        }
    
        public Date getCreateTime() {
            return createTime;
        }
    
        public void setCreateTime(Date createTime) {
            this.createTime = createTime;
        }
    
        public Date getModifyTime() {
            return modifyTime;
        }
    
        public void setModifyTime(Date modifyTime) {
            this.modifyTime = modifyTime;
        }
    
        public int getWebId() {
            return webId;
        }
    
        public void setWebId(int webId) {
            this.webId = webId;
        }
    
        public String getMail() {
            return mail;
        }
    
        public void setMail(String mail) {
            this.mail = mail;
        }
    
        public String getUseFor() {
            return useFor;
        }
    
        public void setUseFor(String useFor) {
            this.useFor = useFor;
        }
    
        @Override
        public String toString() {
            return "MailDO [id=" + id + ", createTime=" + createTime + ", modifyTime=" + modifyTime + ", webId=" + webId + ", mail=" + mail + ", useFor=" 
                    + useFor + "]";
        }
        
    }

    注意实体类一定要重写toStirng()方法,便于定位问题。

    建立数据访问层

    下一步,个人喜好是建立数据访问层,对于数据访问层通常有如下约定:

  • 数据访问层使用Dao命名,它定义了对表的基本增删改查操作
  • 数据访问层之上使用Service命名,它的作用是对于数据库的多操作进行组合,比如先查再删、先删再增、先改再查再删等等,这些操作不会放在Dao层面去操作,而会放在Service层面去进行组合