Mybatis的坑——SqlSessionFactory,Mapper接⼝和mapper.。。。
在平时的开发中,连接数据库进⾏增删改查的⽅案有很多,常见的直接有:
1. jdbc,但是如果直接使⽤jdbc,会存在很多问题。⾸先,频繁的创建连接和释放会造成资源的浪费从⽽影响性能,这个问题可以⽤数
据库连接池来解决。⽽且,还有⼀种情况⽐较坑,就是在开发中,有时新⼿在开发中会忘记close掉connection,造成连接数不够,⽆法访问数据库。⼀般企业开发中,如果使⽤jdbc,也不会直接⼿写,⽽是开发⼀个访问数据库连接的对象,⽐如DBACCESS之类的,在这个类⾥⾯进⾏连接进⾏创建和关闭,这样就不会踩到这个坑了。第⼆,sql会直接写在代码⾥⾯,导致的结果是如果我们想要只想要改变下查询的条件或者数据库表结构变化,需要我们重新编写sql语句,那么我们只能修改代码,维护起来就不是很⽅便。如果不嵌在代码⾥,⽽是⽤⼀个配置⽂件来保存sql,那么事情就变得简单起来了。
2. JdbcTemplate。这是spring⾃带的数据库操作持久层框架。⽬前不是很熟悉这块,等有机会会好好看。等填坑。。。
3. JPA
4. Mybatis。Mybatis最近在创建springboot项⽬,整合Mybatis时,遇到了⼀些常见的问题,不过在⽹上
没到答案,⾃⼰把问题列
出来,从⽽在以后的开发中,能够避免这⼀块。
项⽬⽬录结构:
mapper接⼝在ample.demo.mapper⽬录下。正常情况下,l⽂件是可以直接放在和XXXmapper.java接⼝同包下的,这样spring可以⾃动扫描到,这是不需要我们再在application.properties⾥配置mybatis.mapper-
locations=classpath:mappers/*.xml之类的。但是对于这种情况,我们在在使⽤maven打包时,会⾃动过滤掉除了java之类的其他⽂件,这个时候,我们可以在l⽂件⾥⾯配置
<build>
<!-- 打包时不要忽略xml⽂件 -->
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
jpa mybatis
<directory>src/main/resource</directory>
</resource>
</resources>
</build>
还有⼀种解决办法,就是在src/main/resource⽬录下,创建⼀个和mapper同级的⽬录,也可以解决这个问题。如下
还有如果⽤springboot,则可以使⽤注解,这时可以直接在mapper接⼝⽂件⾥卖弄通过@select,@insert,@Delete,@Update,此时不⽤再写l配置⽂件了。
现在我的问题是,mapper接⼝⽂件在src/main/java/com/example/demo/mapper,⽽我想要在src/main/resource下新建⼀个mappers⽬录把l配置⽂件放在⾥⾯,我在l如下配置:
spring:
datasource:
url: jdbc:mysql://localhost:3306/mango?useUnicode=true&characterEncoding=utf-8
username: root
password: root
driver-class-name: sql.jdbc.Driver
mybatis:
mapper-locations: classpath:mappers/*l
type-aliases-package: del
这⾥使⽤java代码替换xml的配置,代码如下
@Configuration
@MapperScan("ample.demo.mapper")
public class MybatisConfig {
@Autowired
private DataSource datasource;
@Bean
public SqlSessionFactory sqlSessionFactory()throws Exception {
SqlSessionFactoryBean sessionFactory =new SqlSessionFactoryBean();
sessionFactory.setDataSource(datasource);
sessionFactory.setTypeAliasesPackage("del");//扫描model
Object();
}
}
然后运⾏,报错是
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): ample.demo.mapper.SysConfigMapper.findById
后来到原因,Springboot如果没有⼿动配置,它内部会⾃动帮你实现。上⾯的程序mapper接⼝和mapper映射⽂件没有匹配,就是因为⾃⼰创建了⼀个SqlSessionFactory对象,在springboot内部实现了这个对象,那么,spring就不会⽤它默认的SqlSessionFactory对象,⽽是直接使⽤你创建出来的对象。⽽现在代码⾥⾯只有加载了数据源的配置,并没有设置mapper的路径,所以这时是⽆法匹配的。知道了这个原因,那么解决⽅案有两个,⼀个是直接把该配置java类直接删除(使⽤spring内部⾃动创建的SqlSesssionFactory),只保留⼀个l配置⽂件;另⼀个直接在java配置⽂件⾥⾯,定义mapper的位置,这时,application⾥⾯的配置就可以删除掉了。代码如下:
@Configuration
@MapperScan("ample.demo.mapper")
public class MybatisConfig {
@Autowired
private DataSource datasource;
@Bean
public SqlSessionFactory sqlSessionFactory()throws Exception {
SqlSessionFactoryBean sessionFactory =new SqlSessionFactoryBean();
sessionFactory.setDataSource(datasource);//定义数据源
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mappers/*.xml"));//定义mapper映射⽂件
sessionFactory.setTypeAliasesPackage("del");//扫描model
Object();
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论