mapper-boot-starter
mapper-boot-starter copied to clipboard
使用1.2.0版本中遇到问题
trafficstars
- 1.按照作者说明,去掉官方mybatis-spring-boot-starter 依赖,如下是我们项目与mybatis相关的依赖:
<!--Mapper-SpringBoot-->
<dependency>
<groupId>tk.mybatis</groupId>
<artifactId>mapper-spring-boot-starter</artifactId>
<version>1.2.0</version>
</dependency>
<!--Pagehelper-SpringBoot-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.3</version>
</dependency>
- 2.如下是我们自定义的通用Mapper:
package com.xxx.usermanageserver.dao;
import tk.mybatis.mapper.common.BaseMapper;
import tk.mybatis.mapper.common.ConditionMapper;
import tk.mybatis.mapper.common.IdsMapper;
import tk.mybatis.mapper.common.special.InsertListMapper;
/**
* 定制版MyBatis Mapper插件接口,如需其他接口参考官方文档自行添加。
*/
public interface Mapper<T>
extends
BaseMapper<T>,
ConditionMapper<T>,
IdsMapper<T>,
InsertListMapper<T> {
}
- 3.如下是application.properties:
#数据源
spring.datasource.url=jdbc:mysql://localhost:3306/youdanDB?useSSL=false
spring.datasource.username=root
spring.datasource.password=buzhidao
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#连接池
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
#mybatis配置-entity扫描的包名
mybatis.type-aliases-package=com.xxx.usermanagerserver.model
#mybatis配置-开启驼峰映射
mybatis.configuration.map-underscore-to-camel-case=true
(没有mybatis的xml文件路径配置)
#mybatis配置-mapper配置
mapper.mappers=com.xxx.usermanageserver.dao.Mapper (这里是通用Mapper所在路径)
mapper.not-empty=false
mapper.identity=MYSQL
#mybatis配置-pagehelper分页插件配置
pagehelper.helper-dialect=mysql
pagehelper.page-size-zero=true
pagehelper.reasonable=true
pagehelper.supportMethodsArguments=true
pagehelper.params=count=countSql
- 4.一般接口集成通用Mapper:(用注解方式单独写了个自定义查询方法)
package com.xxx.usermanageserver.dao;
import com.xxx.usermanageserver.model.User;
import org.apache.ibatis.annotations.Select;
import java.util.List;
public interface UserMapper extends Mapper<User>{
@Select("select * from yd_user")
List<User> selectAll();
}
- 5.单元测试
@Slf4j
public class TestUserMapper extends UsermanageServerApplicationTests {
@Autowired
private UserMapper userMapper;
//测试自定义接口方法
@Test
public void selectAllUsersTest() {
List<User> list = userMapper.selectAll();
log.info(list.toString());
}
//测试通用Mapper接口方法
@Test
public void insertOneTest() {
User user = new User();
user.setAddress("测试街道");
user.setRegisterTime(new Date());
user.setUserName("张三");
user.setUserPasswd("123");
userMapper.insert(user);
}
}
- 6.启动类。这里MapperScan作者说用tk包下的,但是我尝试了用tk包下的MapperScan两个测试都不通过, 用org包下的MapperScan,第一个测试可以通过,第二测试不通过。
package com.xxx.usermanageserver;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
@MapperScan("com.xxx.usermanageserver.dao")
public class UsermanageServerApplication {
public static void main(String[] args) {
SpringApplication.run(UsermanageServerApplication.class, args);
}
}
- 7.执行第二个测试,报错如下:
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Error invoking SqlProvider method (tk.mybatis.mapper.provider.base.BaseInsertProvider.dynamicSQL). Cause: java.lang.InstantiationException: tk.mybatis.mapper.provider.base.BaseInsertProvider
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:77)
at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:446)
at com.sun.proxy.$Proxy54.insert(Unknown Source)
at org.mybatis.spring.SqlSessionTemplate.insert(SqlSessionTemplate.java:278)
at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:57)
at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:59)
at com.sun.proxy.$Proxy63.insert(Unknown Source)
at com.xxx.usermanageserver.dao.TestUserMapper.insertOneTest(TestUserMapper.java:31)
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 org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50)
at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12)
at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47)
at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17)
at org.springframework.test.context.junit4.statements.RunBeforeTestMethodCallbacks.evaluate(RunBeforeTestMethodCallbacks.java:75)
at org.springframework.test.context.junit4.statements.RunAfterTestMethodCallbacks.evaluate(RunAfterTestMethodCallbacks.java:86)
at org.springframework.test.context.junit4.statements.SpringRepeat.evaluate(SpringRepeat.java:84)
at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:252)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.runChild(SpringJUnit4ClassRunner.java:94)
at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290)
at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71)
at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288)
at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58)
at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268)
at org.springframework.test.context.junit4.statements.RunBeforeTestClassCallbacks.evaluate(RunBeforeTestClassCallbacks.java:61)
at org.springframework.test.context.junit4.statements.RunAfterTestClassCallbacks.evaluate(RunAfterTestClassCallbacks.java:70)
at org.junit.runners.ParentRunner.run(ParentRunner.java:363)
at org.springframework.test.context.junit4.SpringJUnit4ClassRunner.run(SpringJUnit4ClassRunner.java:191)
at org.junit.runner.JUnitCore.run(JUnitCore.java:137)
at com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:68)
at com.intellij.rt.execution.junit.IdeaTestRunner$Repeater.startRunnerWithArgs(IdeaTestRunner.java:47)
at com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:242)
at com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:70)
Caused by: org.apache.ibatis.builder.BuilderException: Error invoking SqlProvider method (tk.mybatis.mapper.provider.base.BaseInsertProvider.dynamicSQL). Cause: java.lang.InstantiationException: tk.mybatis.mapper.provider.base.BaseInsertProvider
at org.apache.ibatis.builder.annotation.ProviderSqlSource.createSqlSource(ProviderSqlSource.java:135)
at org.apache.ibatis.builder.annotation.ProviderSqlSource.getBoundSql(ProviderSqlSource.java:103)
at org.apache.ibatis.mapping.MappedStatement.getBoundSql(MappedStatement.java:292)
at org.apache.ibatis.executor.statement.BaseStatementHandler.<init>(BaseStatementHandler.java:64)
at org.apache.ibatis.executor.statement.PreparedStatementHandler.<init>(PreparedStatementHandler.java:40)
at org.apache.ibatis.executor.statement.RoutingStatementHandler.<init>(RoutingStatementHandler.java:46)
at org.apache.ibatis.session.Configuration.newStatementHandler(Configuration.java:558)
at org.apache.ibatis.executor.SimpleExecutor.doUpdate(SimpleExecutor.java:48)
at org.apache.ibatis.executor.BaseExecutor.update(BaseExecutor.java:117)
at org.apache.ibatis.executor.CachingExecutor.update(CachingExecutor.java:76)
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 org.apache.ibatis.plugin.Plugin.invoke(Plugin.java:63)
at com.sun.proxy.$Proxy67.update(Unknown Source)
at org.apache.ibatis.session.defaults.DefaultSqlSession.update(DefaultSqlSession.java:198)
at org.apache.ibatis.session.defaults.DefaultSqlSession.insert(DefaultSqlSession.java:185)
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 org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:433)
... 34 more
Caused by: java.lang.InstantiationException: tk.mybatis.mapper.provider.base.BaseInsertProvider
at java.lang.Class.newInstance(Class.java:427)
at org.apache.ibatis.builder.annotation.ProviderSqlSource.createSqlSource(ProviderSqlSource.java:117)
... 56 more
Caused by: java.lang.NoSuchMethodException: tk.mybatis.mapper.provider.base.BaseInsertProvider.<init>()
at java.lang.Class.getConstructor0(Class.java:3082)
at java.lang.Class.newInstance(Class.java:412)
... 57 more
help!!! 一直就很关注这个仓库,想着用SpringBoot的纯配置风格把mybatis/mapper/pagehelper都好好集成进来,希望作者能帮我看看问题所在,不胜感激!:)
现在有一个问题,就不支持relax方式的属性。
例如 not-empty,需要写成 notempty。
那意思就是你还是不推荐使用纯application配置文件的方式来集成mapper和pagehelper吗?还是我不用relax的方式来写配置文件就行得通?
问题找到了,我的定制Mapper和一般Mapper都放在dao目录下了。看到你源码里面说了定制Mapper不能被扫描到
Mapper-Starer 1.2.0 使用须知 使用1.2.0的时候需要满足下面三种情况之一
-
项目(间接)依赖中不包含官方的mybaitis-starter
-
使用tk提供的@MapperScan注解方式
-
在启动类上增加如下注解忽略
@EnableAutoConfiguration(
exclude={org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration.class})
public class Application {
}
1.2.1版本还需要在启动类上加@EnableAutoConfiguration注解吗?
@vision-ken 不需要加这个注解了。
如果你使用了官方的MapperScan 注解,就换成 tk 包中提供的同名注解。