1. springmvc之mapper.xml的痛
一般情况下都是一个类写一个xml或者说即使N个类共用一个XML,其实对于开发者的工作量也是很大的,前期倒没有什么,因为可以用自动生成工具来生成,但是后期,如果要添加什么字段或者修改字段的话,对于我们来说真的太恶心了
所以能不能有一个共用的方法,也就是共用的mapper或者service等让开发者少一些开发量,我们来自己封装一个共用的mapper mapper.xml service serviceImpl
1. 封装过程是基于对象中添加自定义注解,然后通过反射解析Class动态生成sql实现,
不要和Mybatis API的SqlSession中的方法混淆,
2. 并且SpringBoot集成Mybatis后不要轻易使用SqlFactory和SqlSession,
原因可参看Mybatis API
(http://www.mybatis.org/spring/zh/using-api.html),如下:
3. 它不会参与到 Spring 的事务之中。
如果 SqlSession 使用 DataSource,它也会被 Spring 事务管理器使用,
而且当前 有事务在进行时,这段代码会抛出异常。
4. MyBatis 的 DefaultSqlSession 是线程不安全的。
如果在 bean 中注入了它,就会 发生错误。
使用 DefaultSqlSession 创建的映射器也不是线程安全的。
如果你将它们注入到 bean 中,是会发生错误的。
你必须保证在 finally 块中来关闭 SqlSession。
项目地址:传送门
2. 确定这些需求之后,我们开始设计数据库
CREATE TABLE `mapper` (
`id` int(10) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL,
`sex` int(1) ,
PRIMARY KEY (`id`),
UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci;
重点来了,既然mapper.xml都想共用,那么我们需要在传参的时候就指定数据库名称还有每个成员变量对应得字段,那这些放到哪里合适呢?
答案:在每个实体类中指定
//注意:
// 使用注解编写对象类@Table为表名,@Id为主键,@Column为列名,
// 注意@Id和@Column需要定义在get方法上。
@Table(value = "mapper")
//表的名称
public class MapperDO {
// 使用注解编写对象类@Table为表名,@Id为主键,@Column为列名,
// 注意@Id和@Column需要定义在get方法上。
private Integer id ;
private String name ;
private Integer sex ;
@Id(value = "ID")
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(value = "name")
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@Column(value = "sex")
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
@Override
public String toString() {
return "MapperDO{" +
"id=" + id +
", name='" + name + '\'' +
", sex=" + sex +