在写Mybatis的时候,selectAll、selectOne这种常用的每次都要在不同的业务写一次,实在太累了。像这种有规律的应该写成公共的,这时候通用Mapper就有意义了。
tk.mybatis就做了这个事情,集成很简单。
第一步加入关键的maven依赖
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper</artifactId>
<version>4.0.0</version>
</dependency>
第二步修改Mapper,都继承 tk.mybatis.mapper.common.Mapper
public interface SysUserMapper extends Mapper<SysUser> {
}
第三步修改@MapperScan,注意 tk.mybatis.spring.annotation.MapperScan 是这个类
@MapperScan(basePackages = "com.pss.mybatis_spring.dao", sqlSessionTemplateRef = "sqlSessionTemplate")
第四步重启服务运行,全程不到30秒,成为全宇宙最快的男人
非常好,报了个错,看第四行getAllColumns。
Caused by: java.lang.StringIndexOutOfBoundsException: String index out of range: -1
at java.lang.AbstractStringBuilder.substring(AbstractStringBuilder.java:935)
at java.lang.StringBuilder.substring(StringBuilder.java:76)
at tk.mybatis.mapper.mapperhelper.SqlHelper.getAllColumns(SqlHelper.java:249)
at tk.mybatis.mapper.mapperhelper.SqlHelper.exampleSelectColumns(SqlHelper.java:644)
at tk.mybatis.mapper.provider.ExampleProvider.selectByExample(ExampleProvider.java:100)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at tk.mybatis.mapper.mapperhelper.MapperTemplate.setSqlSource(MapperTemplate.java:246)
... 49 common frames omitted
看第四行,应该是至少要有一个字段匹配上,这个字段在数据库我使用的BIGINT,所以要用Long
@Data
public class SysUser {
private int userId;
}
改成
@Data
public class SysUser {
private Long userId;
}
完成,成功执行。
2019-06-03 17:00:42.051 [http-nio-8080-exec-1] DEBUG o.m.spring.transaction.SpringManagedTransaction - JDBC Connection [com.mysql.jdbc.JDBC4Connection@450af11c] will not be managed by Spring
2019-06-03 17:00:42.055 [http-nio-8080-exec-1] DEBUG com.pss.mybatis_spring.dao.SysUserMapper.selectAll - ==> Preparing: SELECT user_id FROM sys_user
2019-06-03 17:00:42.073 [http-nio-8080-exec-1] DEBUG com.pss.mybatis_spring.dao.SysUserMapper.selectAll - ==> Parameters:
2019-06-03 17:00:42.182 [http-nio-8080-exec-1] DEBUG com.pss.mybatis_spring.dao.SysUserMapper.selectAll - <== Total: 1857
2019-06-03 17:00:42.183 [http-nio-8080-exec-1] DEBUG org.mybatis.spring.SqlSessionUtils - Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@5a8b979]
集成官方文档
https://github.com/abel533/Mapper/wiki/1.integration
点开Mapper类看一眼,动态SQL
@RegisterMapper
public interface Mapper<T> extends BaseMapper<T>, ExampleMapper<T>, RowBoundsMapper<T>, Marker {
}
@RegisterMapper
public interface SelectOneMapper<T> {
@SelectProvider(
type = BaseSelectProvider.class,
method = "dynamicSQL"
)
T selectOne(T var1);
}
@RegisterMapper 自动注册 Mapper 接口标记
通用 Mapper 所有已有方法都增加了该注解,MapperHelper 中实现对该注解的检测和自动配置。