介绍
通用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> {
}
注意事项:
实体类按照如下规则和数据库表进行转换,注解全部是JPA中的注解:
- 表名默认使用类名,驼峰转下划线(只对大写字母进行处理),如UserInfo默认对应的表名为user_info。
- 表名可以使用@Table(name = “tableName”)进行指定,对不符合第一条默认规则的可以通过这种方式指定表名.
- 字段默认和@Column一样,都会作为表字段,表字段默认为Java对象的Field名字驼峰转下划线形式.
- 可以使用@Column(name = “fieldName”)指定不符合第3条规则的字段名
- 使用
@Transient
注解可以忽略字段,添加该注解的字段不会作为表字段使用. - 建议一定是有一个@Id注解作为主键的字段,可以有多个@Id注解的字段作为联合主键.默认情况下,实体类中如果不存在包含@Id注解的字段,所有的字段都会作为主键字段进行使用(这种效率极低).
- 实体类可以继承使用,可以参考测试代码中tk.mybatis.mapper.model.UserLogin2类.由于基本类型,如int作为实体类字段时会有默认值0,而且无法消除,所以实体类中建议不要使用基本类型.
- @NameStyle注解,用来配置对象名/字段和表名/字段之间的转换方式,该注解优先于全局配置style,可选值:
8.1. normal:使用实体类名/属性名作为表名/字段名
8.2 camelhump:这是默认值,驼峰转换为下划线形式
8.3 uppercase:转换为大写
8.4 lowercase:转换为小写
重点强调 @Transient 注解
许多人由于不仔细看文档,频繁在这个问题上出错。
如果你的实体类中包含了不是数据库表中的字段,你需要给这个字段加上@Transient
注解,这样通用Mapper在处理单表操作时就不会将标注的属性当成表字段处理!
3.CRUD
1.查询方法
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.插入方法:
/**
*
* 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.修改方法如下:
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.删除方法如下:
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.常见错误:
原因:我在Student类中加了a属性,但是表中是没有这个字段,因为报上面这个错。
解决办法:在a属性上加@Transient
使用@Transient注解可以忽略字段,添加该注解的字段不会作为表字段使用.
5.官方文档