介绍

通用Mapper都可以极大的方便开发人员。可以随意的按照自己的需要选择通用方法,还可以很方便的开发自己的通用方法。

极其方便的使用MyBatis单表的增删改查

支持单表操作,不支持通用的多表联合查询。

1.导入依赖

<dependency>
    <groupId>tk.mybatis</groupId>
    <artifactId>mapper</artifactId>
    <!-- 建议使用最新版本,最新版本请从项目首页查找 -->
    <version>x.x.x</version>
</dependency>

2.接口继承mapper接口

public interface StudentMapper extends Mapper<Student> {



}

mybatis在mapperxml中调用java方法_Mybatis 通用mapper

注意事项:
实体类按照如下规则和数据库表进行转换,注解全部是JPA中的注解:

  1. 表名默认使用类名,驼峰转下划线(只对大写字母进行处理),如UserInfo默认对应的表名为user_info。
  2. 表名可以使用@Table(name = “tableName”)进行指定,对不符合第一条默认规则的可以通过这种方式指定表名.
  3. 字段默认和@Column一样,都会作为表字段,表字段默认为Java对象的Field名字驼峰转下划线形式.
  4. 可以使用@Column(name = “fieldName”)指定不符合第3条规则的字段名
  5. 使用@Transient注解可以忽略字段,添加该注解的字段不会作为表字段使用.
  6. 建议一定是有一个@Id注解作为主键的字段,可以有多个@Id注解的字段作为联合主键.默认情况下,实体类中如果不存在包含@Id注解的字段,所有的字段都会作为主键字段进行使用(这种效率极低).
  7. 实体类可以继承使用,可以参考测试代码中tk.mybatis.mapper.model.UserLogin2类.由于基本类型,如int作为实体类字段时会有默认值0,而且无法消除,所以实体类中建议不要使用基本类型.
  8. @NameStyle注解,用来配置对象名/字段和表名/字段之间的转换方式,该注解优先于全局配置style,可选值:
    8.1. normal:使用实体类名/属性名作为表名/字段名
    8.2 camelhump:这是默认值,驼峰转换为下划线形式
    8.3 uppercase:转换为大写
    8.4 lowercase:转换为小写

重点强调 @Transient 注解
许多人由于不仔细看文档,频繁在这个问题上出错。

如果你的实体类中包含了不是数据库表中的字段,你需要给这个字段加上@Transient注解,这样通用Mapper在处理单表操作时就不会将标注的属性当成表字段处理!

3.CRUD

1.查询方法

mybatis在mapperxml中调用java方法_实体类_02

1.1.查询所有学生

List<Student> students = studentMapper.selectAll();

1.2、 根据属性查询一个学生

Student student = new Student();
student.setName("王五"); 
Student student2 = studentMapper.selectOne(student);

1.3.根据主键ID查学生

Student student3 = new Student();
student3.setId(1);
Student student1 = studentMapper.selectByPrimaryKey(student3);

1.4.根据Example条件查学生

Example example = new Example(Student.class);
Example.Criteria criteria = example.createCriteria();
criteria.andEqualTo("name","王五");
List<Student> students1 =studentMapper.selectByExample(example);

1.5.根据属性查询数量

Student student = new Student();
student.setName("王五"); //如果不写条件,将查询所有学生的数量
int i = studentMapper.selectCount(student);

2.插入方法:

mybatis在mapperxml中调用java方法_表名_03

/**
         *
         *  2.1. 插入:
         * 
         *  insert 和  insertSelective的区别
         *  insert:不排除null值,为null的属性会插入表中
         *  insertSelective:排除null值,为null的属性,优先为数据库字段设置的默认值,无默认值,则为null
         *  当然只要有Selective时就会排除null值,updateByExampleSelective()等等
         */
        Student student4 = new Student();
        student4.setName("杨戬");
        int insert = studentMapper.insert(student4);
        int i1 = studentMapper.insertSelective(student4);

3.修改方法如下:

mybatis在mapperxml中调用java方法_表名_04


3.1updateByExample 和 updateByExampleSelective类似

/** 3.1. 修改
         * updateByExample 和 updateByExampleSelective类似
         * updateByExample()更新所有的字段,包括字段为null的也更新,建议使用 updateByExampleSelective()更新想更新的字段
         */
        Example example1 = new Example(Student.class);
        Example.Criteria cr = example1.createCriteria();
        cr.andEqualTo("name","王五");
        Student student5 = new Student();
        student5.setAge(123);
       //相当于:update student set age='123' where name='王五'
        int i2 = studentMapper.updateByExampleSelective(student5, example1);

3.2 根据主键修改学生

Student student6 = new Student();
        student6.setId(1);
        student6.setName("奥特曼");
        student6.setAge(123);
        student6.setAddress("东京");
        int i3 = studentMapper.updateByPrimaryKey(student6);

4.删除方法如下:

mybatis在mapperxml中调用java方法_实体类_05

4.1.根据主键Id删除

studentMapper.deleteByPrimaryKey(1);  //相当于:delete from student where id=1

4.2 根据Example条件删除

Example example2 = new Example(Student.class);
Example.Criteria criteria1 = example2.createCriteria();
criteria1.andEqualTo("name","王五");
studentMapper.deleteByExample(example2);

4.常见错误:

mybatis在mapperxml中调用java方法_实体类_06


原因:我在Student类中加了a属性,但是表中是没有这个字段,因为报上面这个错。

解决办法:在a属性上加@Transient

使用@Transient注解可以忽略字段,添加该注解的字段不会作为表字段使用.

mybatis在mapperxml中调用java方法_实体类_07

5.官方文档

Mybatis 通用mapper使用