abel533 / mapper-boot-starter

mapper-boot-starter
MIT License
111 stars 46 forks source link

使用1.2.0版本中遇到问题 #8

Open wirechen opened 6 years ago

wirechen commented 6 years ago

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;

/**

连接池

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{

@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.(BaseStatementHandler.java:64) at org.apache.ibatis.executor.statement.PreparedStatementHandler.(PreparedStatementHandler.java:40) at org.apache.ibatis.executor.statement.RoutingStatementHandler.(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.() at java.lang.Class.getConstructor0(Class.java:3082) at java.lang.Class.newInstance(Class.java:412) ... 57 more



### help!!! 一直就很关注这个仓库,想着用SpringBoot的纯配置风格把mybatis/mapper/pagehelper都好好集成进来,希望作者能帮我看看问题所在,不胜感激!:)
abel533 commented 6 years ago

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

wirechen commented 6 years ago

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

wirechen commented 6 years ago

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

abel533 commented 6 years ago

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 {

}
vision-ken commented 6 years ago

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

abel533 commented 6 years ago

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

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