关于MyBatis与Hibernate及其JDBC的比较,大家可以参考我的这篇文章:MyBatis+Hibernate+JDBC对比分析
如果觉得这个还不够系统全面,可以自行Google或者百度。
用了MyBatis有两年了,后来觉得不好用有一定的局限性换成了MyBatis-Plus,关于MyBatis-Plus实战系列,可以参考这个链接:https://www.cnblogs.com/youcong/category/1213059.html
另外话说回来了,为什么我又要回到MyBatis?
原因有这么几个方面?
第一、MyBatis-Plus是MyBatis的升级版,MyBatis有的,MyBatis-Plus都有,MyBatis没有的,MyBatis-Plus也有,从这个角度来看,MyBatis-Plus是从MyBatis中衍生出来的,那么它们的源码可以说有一大半是一致的,只是有少部分不同,所以如果以后MyBatis-Plus不能满足我的需求,我可以自行改造,虽说码云或者Github上有不少现成的轮子可以用,但是我个人觉得,如果进入一家比较大的公司,不仅仅要知道如何投机取巧(善用现有的轮子,同时也要具备制造轮子的能力,你可以理解为深入了解源码,并熟悉其中的设计模式);
第二、如第一条所说的那样,我看过很多开源项目,有的理解透彻MyBatis,知道MyBatis生成的代码有很多局限性,就例如它的逆向工程可以避免重复编写CRUD之类的代码,但是生成的XML太繁琐,于是就有了MyBatis-Plus,但是MyBatis-Plus也并不是没有缺点的,比如它只能针对单表,而不能多表连接,也正是因为这个局限性,Jeesite的创造者才决定自行改造MyBatis,让其符合自身的需要,关于Jeesite简化MyBatis的博文,大家可以参考这个链接:https://my.oschina.net/thinkgem/blog/1503611;
第三、目前主流还是MyBatis,互联网项目大多都是MyBatis,有的公司也有自己封装的ORM框架,但是本质上基本要么是对Hibernate进行改造,要么就是对MyBatis改造,下面我贴一下关于MyBatis的图给大家看看:
从这张图,大家可以知道MyBatis和MyBatis-Plus在开源项目都彼此占用;
 
有人说,现在博客上有很多关于MyBatis的,你写这个是不是有点多余的,我对此的回答是,不多余。就好比读书,每个人读一本书一遍或者两遍及其以上,感触肯定是不一样的。很多东西当初的时候不知道是什么意思,回过头来,你会发现,你可以发现一些不一样的东西,这个东西,你可以理解为举一反三或是融会贯通。
下面进入正题,关于MyBatis的学习,我当初是参考孤傲苍狼的博客。今天在写这篇文章时,我查了官网,也搜索相关的中文教程,在w3cschool发现了关于MyBatis,但是我觉得写的不好,对于初学者和进阶者而言,简直就是乱七八糟,我知道也许这样评价会引起一些人讽刺,但是这是事实,大家可以自己看,我觉得初学者或者进阶者,特别是进阶者可以回过头再看看官网。
准备环境:Window10/8/7+JDK8/7/6或以上+MySQL
项目结构如下:
SQL脚本:
复制代码
REATE TABLE `user` (
  `user_id` int(8) NOT NULL AUTO_INCREMENT COMMENT '用户主键',
  `login_code` varchar(20) NOT NULL COMMENT '用户编码(登录账户) 手机号 邮箱号',
  `user_name` varchar(20) NOT NULL COMMENT '用户名',
  `password` varchar(40) NOT NULL COMMENT '密码',
  `sex` int(2) NOT NULL COMMENT '性别',
  `identity_card` varchar(20) DEFAULT NULL COMMENT '身份证',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `create_by` varchar(10) NOT NULL COMMENT '创建人',
  `update_time` datetime NOT NULL COMMENT '更新时间',
  `update_by` varchar(10) NOT NULL COMMENT '更新人',
  `status` int(2) NOT NULL DEFAULT '0' COMMENT '状态:0注册新用户 1邮件认证用户 2管理员 3黑名单',
  PRIMARY KEY (`user_id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
复制代码
 
一、导入依赖
复制代码
  4.0.0
  cn.youcong.mybatis
  mybatis
  0.0.1-SNAPSHOT
  
  
    org.mybatis
    mybatis
    3.4.6
    mysql
    mysql-connector-java
    5.1.38
    junit
    junit
    4.12
    test
  
复制代码
 
二、编写实体类
复制代码
package com.blog.entity;
import java.io.Serializable;
import java.util.Date;
import java.io.Serializable;
public class User{
    private static final long serialVersionUID = 1L;
    /**
     * 用户主键
     */
    private Integer userId;
    /**
     * 用户编码(登录账户) 手机号 邮箱号
     */
    private String loginCode;
    /**
     * 用户名
     */
    private String userName;
    /**
     * 密码
     */
    private String password;
    /**
     * 性别
     */
    private Integer sex;
    /**
     * 身份证
     */
    private String identityCard;
    /**
     * 创建时间
     */
    private Date createTime;
    /**
     * 创建人
     */
    private String createBy;
    /**
     * 更新时间
 */
    private Date updateTime;
    /**
     * 更新人
     */
    private String updateBy;
    /**
     * 状态:0注册新用户 1邮件认证用户 2管理员 3黑名单
     */
    private Integer status;
    public Date getUpdateTime() {
        return updateTime;
    }
    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }
    public static long getSerialversionuid() {
        return serialVersionUID;
    }
    public Integer getUserId() {
        return userId;
    }
    public void setUserId(Integer userId) {
        this.userId = userId;
    }
    public String getLoginCode() {
        return loginCode;
    }
    public void setLoginCode(String loginCode) {
        this.loginCode = loginCode;
    }
    public String getUserName() {
        return userName;
    }
    public void setUserName(String userName) {
        this.userName = userName;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public Integer getSex() {
        return sex;
    }
    public void setSex(Integer sex) {
        this.sex = sex;
    }
    public String getIdentityCard() {
        return identityCard;
    }
    public void setIdentityCard(String identityCard) {
        this.identityCard = identityCard;
    }
    public Date getCreateTime() {
        return createTime;
    }
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
    public String getCreateBy() {
        return createBy;
    }
    public void setCreateBy(String createBy) {
        this.createBy = createBy;
    }
    public String getUpdateBy() {
        return updateBy;
    }
    public void setUpdateBy(String updateBy) {
        this.updateBy = updateBy;
    }
    public Integer getStatus() {
        return status;
    }
    public void setStatus(Integer status) {
        this.status = status;
    }
  
  
}
复制代码
 
三、编写数据访问层及其对应的XML文件
复制代码
package com.blog.dao;
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
import com.blog.entity.User;
public interface UserDao {
    @Select("select * from `user` where user_id=#{userId}")
    @Results(@Result(property="userName",column="user_name"))
    User selectOne(int userId);
}
复制代码
@Select是MyBatis的注解写法,当字段名和属性名一致时,可以直接@Select不需要@Results,@Results的作用就是因为实体属性与字段不一致,为了获取查询结果,必须要这样。
当然了你也可以不写注解,直接在对应的UserDao.xml写,如果是UserDao.xml里面写的话,就会变成这样
1
2
3
4
5
6
7
8
9
10
11
12
13
package com.blog.dao;
 
import org.apache.ibatis.annotations.Result;
import org.apache.ibatis.annotations.Results;
import org.apache.ibatis.annotations.Select;
 
import com.blog.entity.User;
 
public interface UserDao {
 
    User selectOne(int userId);
 
}
 
需要在UserDao.xml中编写
复制代码
    
    
        
        
        
        
        
        
        
        
        
        
        
    
    
    
        user_id, login_code, user_name, password, sex, identity_card, create_time, create_by, update_time, update_by, status
    
  
复制代码
 
除了