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)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值