MyBatis通用Mapper入門

今天在學習Hibernate的時候感受到JPA對於單表操作的方便,經過搜索資料發現Mybatis現在其實也已經支持了類似的操作,這個就是通用Mapper,記錄一下免得後面又忘記(學東西總是學了就忘。。。。唉)

首先原生Mybatis雖然好用,但是有一些地方很難受,比如:

1.mapper.xml文件中有大量的SQL語句,即使是使用註解SQL語句全部堆在dao層,數據庫有個字段改了,就得跑去修改

2.數據庫可移植性差,Oracle中的PLSQL和mysql的函數是不同的,一旦切換就得去重寫SQL

3.生成的代碼量過大

4.批量操作,批量插入,批量更新都需要手動寫

快速入門

引入依賴

<!-- 通用Mapper  -->
        <dependency>
            <groupId>com.github.abel533</groupId>
            <artifactId>mapper</artifactId>
            <version>2.3.4</version>
        </dependency>

配置插件(Mapper在Mybatis的攔截器)

 <plugins>
        <plugin interceptor="com.github.abel533.mapperhelper.MapperInterceptor">
            <!--主鍵自增回寫方法,默認值MYSQL -->
            <property name="IDENTITY" value="MYSQL" />
            <!--通用Mapper默認接口,我們定義的Mapper需要實現該接口 -->
            <property name="mappers" value="com.github.abel533.mapper.Mapper" />
        </plugin>
    </plugins>

編寫UserMapper接口繼承Mapper(Dao層)

配置實體類與表的關係:

package cn.mybatis.pojo;

import java.io.Serializable;
import java.util.Date;

import javax.persistence.Column;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;


@Table(name="tb_user")
public class User implements Serializable{

    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    private Long id;

    // 用戶名
    private String userName;

    // 密碼
    private String password;

    // 姓名
    private String name;

    // 年齡
    private Integer age;

    // 性別,1男性,2女性
    private Integer sex;

    // 出生日期
    private Date birthday;

    // 創建時間
    private Date created;

    // 更新時間
    private Date updated;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    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 String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    public Integer getSex() {
        return sex;
    }

    public void setSex(Integer sex) {
        this.sex = sex;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public Date getCreated() {
        return created;
    }

    public void setCreated(Date created) {
        this.created = created;
    }

    public Date getUpdated() {
        return updated;
    }

    public void setUpdated(Date updated) {
        this.updated = updated;
    }

    @Override
    public String toString() {
        return "User [id=" + id + ", userName=" + userName + ", password=" + password + ", name=" + name
                + ", age=" + age + ", sex=" + sex + ", birthday=" + birthday + ", created=" + created
                + ", updated=" + updated + "]";
    }

}

編寫測試類

package cn.mapper.test;

import java.io.InputStream;
import java.util.List;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import cn.mybatis.dao.UserMapper;
import cn.mybatis.pojo.User;

import com.github.abel533.entity.Example;

public class TestMappers {

    
    UserMapper usermapper;

    String resource = "mybatis-config.xml";
    InputStream inputStream;
    SqlSessionFactory sqlsessionFactory;
    SqlSession sqlSession;
    
    @Before
    public void setUp() throws Exception {
        inputStream = Resources.getResourceAsStream(resource);
        sqlsessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        sqlSession = sqlsessionFactory.openSession();
        
//        動態代理實現
        usermapper = this.sqlSession.getMapper(UserMapper.class);
        
    }

    /**
     * 查詢1個用戶
     */
    @Test
    public void test() {
        User user = new User();
        user.setuserName("zhangsan");
        
        User one = this.usermapper.selectOne(user);
        
        System.out.println(one);
    }
    
    /**
     * 查找用戶,接收一個User對象。
     */
    @Test
    public void testselect(){
        
        User user = new User();
        user.setSex(2);

        List<User> list = this.usermapper.select(null);
        
        for (User user2 : list) {
            System.out.println(user2);
        }
        
        System.out.println("-------------");
        
        
        List<User> list2 = this.usermapper.select(user);
        
        for (User user2 : list2) {
            System.out.println(user2);
        }
        
    }
    
    /**
     * 查詢總條數
     */
    @Test
    public void testSlecteCount(){
        int count = this.usermapper.selectCount(null);
        System.out.println(count);
        System.out.println("--------");
        
        User user = new User();
        user.setSex(1);
        int count2 = this.usermapper.selectCount(user);
        System.out.println(count2);
    }
    
    
    /**
     * 根據主鍵查詢
     */
    @Test
    public void testSelectByPrimaryKey(){
        User user = this.usermapper.selectByPrimaryKey(1L);
        
        System.out.println(user);
    }
    
    @Test
    public void testInsert(){
        User user = new User();
        user.setAge(22);
        user.setPassword("11111");
//        this.usermapper.insert(user);
        this.usermapper.insertSelective(user);
        
//        提交
        this.sqlSession.commit();
    }
    
    @Test
    public void testDelete(){
        User user = new User();
        user.setAge(22);
        int i = this.usermapper.delete(user);
        this.sqlSession.commit();
        System.out.println(i);
    }
    
    @Test
    public void testUpdate(){
        User user = new User();
        user.setId(18L);
        user.setuserName("kk0");;
        int i = this.usermapper.updateByPrimaryKeySelective(user);
        this.sqlSession.commit();
        System.out.println(i);
    }
    
    @Test
    public void testSelectByExample(){
        
        Example example = new Example(User.class);
        example.createCriteria().andEqualTo("sex", 1).andBetween("age", 10, 22);
        example.or(example.createCriteria().andLike("name", "李"));
        example.setOrderByClause("age desc");
        
        List<User> list = this.usermapper.selectByExample(example);
        
        for (User user : list) {
            System.out.println(user);
        }
    }
    
    
    
}

總結:通用mapper 的要求:

1.默認表名爲類名(@Table())

2.默認字段名就是類屬性名(在駝峯規則內),如果不一致,使用@Column註解

3.主鍵字段必須聲明@Id

4.實現ID的回寫@GeneratedValue(strategy=GenerationType.IDENTITY)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章