mapper-boot-starter icon indicating copy to clipboard operation
mapper-boot-starter copied to clipboard

使用1.2.0版本中遇到问题

Open wirechen opened this issue 7 years ago • 6 comments
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都好好集成进来,希望作者能帮我看看问题所在,不胜感激!:)

wirechen avatar Jan 08 '18 10:01 wirechen

现在有一个问题,就不支持relax方式的属性。 例如 not-empty,需要写成 notempty

abel533 avatar Jan 08 '18 14:01 abel533

那意思就是你还是不推荐使用纯application配置文件的方式来集成mapper和pagehelper吗?还是我不用relax的方式来写配置文件就行得通?

wirechen avatar Jan 08 '18 14:01 wirechen

问题找到了,我的定制Mapper和一般Mapper都放在dao目录下了。看到你源码里面说了定制Mapper不能被扫描到

wirechen avatar Jan 08 '18 15:01 wirechen

Mapper-Starer 1.2.0 使用须知 使用1.2.0的时候需要满足下面三种情况之一

  1. 项目(间接)依赖中不包含官方的mybaitis-starter

  2. 使用tk提供的@MapperScan注解方式

  3. 在启动类上增加如下注解忽略

@EnableAutoConfiguration(
   exclude={org.mybatis.spring.boot.autoconfigure.MybatisAutoConfiguration.class})
public class Application {

}

abel533 avatar Jan 09 '18 13:01 abel533

1.2.1版本还需要在启动类上加@EnableAutoConfiguration注解吗?

vision-ken avatar Jan 13 '18 05:01 vision-ken

@vision-ken 不需要加这个注解了。

如果你使用了官方的MapperScan 注解,就换成 tk 包中提供的同名注解。

abel533 avatar Jan 13 '18 13:01 abel533