写在前面
写这篇文章主要是为了纪念下走过的坑,记得老大说过
“如果我早知道通用Mapper是中国人写的框架我就不让你们用了”
通用mapper简介
通用mapper主要是对Mybatis进行了一定的封装,我们在使用mybatis时候面对的一个比较烦的问题就是经常需要使用xml对一些比较简单的单表进行增删改查,通用Mapper提供了这样的一套规范 ,让我们在开发的时候可以通过集成一个写好的Mapper类来减少我们对单表的操作.
讲一下Mybatis
- 优点:
- 易于上手和掌握
- sql写在xml里,便于统一管理和优化。
- 接触sql与代码的耦合
- 支持自动映射
- 提供xml标签,支持动态拼接sql
- 缺点
- sql工作量很大,尤其是字段多,关联多表是,更是如此.
- sql依赖数据库,导师制数据库移植性差.
- dao层方法不能进行重载
- dao层过于简单,对象组装的工作量较大
- 虽然提供了动态拼接sql的功能,但是标签的可读性很差,而且在拼接的时候也是受到限制的
- 缓存使用不当很容易造成脏数据
总结一下吧
在使用Mybatis的时候前期开发很容易但是对数据库的依赖很严重如果在开发的时候想将数据库从mysql换成Orcale是不可能的,但是如果使用Hibernate就可以很容易的更换过来.mybatis的最大优势就是它上手容易,操作简单,开发人员可以通过优化自己的sql来提高性能,而不是像hibernate那样在使用的时候需要有很多注意的地方.
进入正题吧
# mybatis配置
mybatis:
type-aliases-package: tk.mybatis.springboot.model
mapper-locations: classpath:mapper/*.xml
configuration:
map-underscore-to-camel-case: true
# mapper配置
mapper:
mappers:
- top.jbzm.demo.springsecuritymybatic.mapper
not-empty: false
identity: MYSQL
style: camelhump
enable-method-annotation: true
# pagehelper配置
pagehelper:
helperDialect: mysql
reasonable: true
supportMethodsArguments: true
params: count=countSql
<!-- mysql连接使用 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- 直接引用通用mapper -->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>1.2.3</version>
</dependency>
<!-- 引用分页工具 -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.3</version>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
简单的介绍下上面的配置,首先引入了通用Mapper的start和分页插件的start,这两个组合起来使用真的是6到飞起.之后会在后面演示.
最上面的yml配置文件(其实都引用了start,理论上来讲是不会需要配置的,这些配置很多都是默认的),上面的配置文件指定了所引用的mapper包,添加Mybatis的驼峰命名法.其他的配置就省略了总之都是从官网粘过来的.
实战Demo
配置entity这里有个小坑
@EqualsAndHashCode(callSuper = true)
@Data
@ToString(callSuper = true)
@Table(name = "t_user")
public class User extends BaseEntity{
private String username;
private String password;
}
这里需要指定表明是t_user
配置Mapper里面的内容
@Component
public interface TagMapper extends Mapper<Tag> {
@Select(value = "select * from t_tag where status=#{status} and channel=#{channel}")
List<Tag> selectAllTagByPage(@Param("status") Integer status, @Param("channel") Integer channel, @Param("pageNum") int pageNum, @Param("pageSize") int pageSize);
@Select(value = "select * from t_tag")
List<Tag> selectAllJBZM(@Param("lol") int lol);
}
这里我都是使用自定义sql进行查询的.
@Test
public void test02() {
PageInfo<Tag> pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(() -> tagMapper.selectAll());
Page<Tag> page = PageHelper.startPage(1, 10).doSelectPage(() -> tagMapper.selectAllJBZM(1));
pageInfo.getList().forEach(System.out::println);
page.getResult().forEach(System.out::println);
System.out.println(page.toString());
}
简单的实现了一个demo
通过分页插件完成了分页