MyBatis, MyBatis-Spring 常用访问数据库的方式
来源:互联网 发布:浙江大学网络预约 编辑:程序博客网 时间:2024/06/07 23:11
一、MyBatis 访问数据库的方式
使用 MyBatis 的主要 Java 接口就是 SqlSession,可通过 SqlSessionFactoryBuilder 创建 SqlSession。
文档:MyBatis 官方文档
二、MyBatis-Spring 访问数据库的方式
文档:MyBatis-Spring 文档
先放出结论,MyBatis-Spring 访问数据库的方式主要有三种:
- SqlSessionTemplate
- MapperFactoryBean
- MapperScannerConfigurer
1、SqlSessionTemplate 简介:
SqlSessionTemplate 是 MyBatis-Spring 的核心,这个类负责管理 MyBatis 的 SqlSession。
SqlSessionTemplate 实现了 SqlSession 接口,这就是说,在代码中无需对 MyBatis 的 SqlSession 进行替换。 SqlSessionTemplate 通常是被用来替代默认的 MyBatis 实现的 DefaultSqlSession 。
2、SqlSessionDaoSupport 简介:
SqlSessionDaoSupport 是 一 个抽象的支持类, 用来为你提供 SqlSession 。 调用 getSqlSession() 方法你会得到一个 SqlSessionTemplate,之后可以用于执行 SQL 方法, 就像下面这样:
public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao { public User getUser(String userId) { return (User) getSqlSession().selectOne("org.mybatis.spring.sample.mapper.UserMapper.getUser", userId); }}
3、MapperFactoryBean 简介:
为了代替手工使用 SqlSessionDaoSupport 或 SqlSessionTemplate 编写数据访问对象 (DAO)的代码, MyBatis-Spring 提供了一个动态代理的实现: MapperFactoryBean。
如:
<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mapperInterface" value="org.mybatis.spring.sample.mapper.UserMapper" /> <property name="sqlSessionFactory" ref="sqlSessionFactory" /></bean>
即 MapperFactoryBean 创建的代理类实现了 UserMapper 接口,并且注入到应用程序中。 因为代理创建在运行时环境中(Runtime,译者注) ,那么指定的映射器必须是一个接口,而 不是一个具体的实现类。
如果 xml 映射器文件在类路径的 位置和映射器类相同时, 它会被 MapperFactoryBean 自动解析,否则需要配置 configLocation 路径来指定 mybatisConfig.xml 文件(该文件中有配置 xml 映射器文件路径)。
4、MapperScannerConfigurer 简介:
此种方式即通过 MapperScannerConfigurer 查找类路径下的映射器并自动将它们创建成 MapperFactoryBean。与 MapperFactoryBean 相比,不用在 spring.xml 文件中定义所有的 dao 类的对应的 bean 声明。
三种实现方式如下:
0、spring 公共模块的配置: dataSource 和 sqlSessionFactory:
<bean id="mysqlTestDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.c3p0.driverClass}"/> <property name="url" value="${mysql.test.jdbc.c3p0.jdbcUrl}"/> <property name="username" value="${mysql.test.jdbc.c3p0.user}"/> <property name="password" value="${mysql.test.jdbc.c3p0.password}"/></bean><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <property name="dataSource" ref="mysqlTestDataSource" /> <property name="configLocation" value="classpath:context/mybatis/mapperConfig.xml" /> <!--<property name="mapperLocations" value="classpath*:mappers/mysql_test/*Mapper.xml" />--></bean>
注:sqlSessionFactory 里配置xml映射文件的两种方式:
1、configLocation:配置 mybatisConfig.xml 文件的路径,在该文件内配置xml 映射文件的路径即可;
2、mapperLocations:配置所有 xml 映射文件路径。
方式1、使用 SqlSessionTemplate 方式:
spring.xml 配置:
<bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactory" /></bean>
mapperConfig.xml (MyBatis 相关配置项):
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><configuration> <mappers> <mapper resource="mappers/mysql_test/AwardMapper.xml" /> </mappers></configuration>
AwardMapper.xml 映射文件:
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" ><mapper namespace="AwardDao" > <insert id="insert" parameterType="com.wlm.test.award.Award"> insert into award (award, count, created_time, updated_time) values (#{award}, #{count}, #{createdTime}, #{updatedTime}) </insert></mapper>
注:当使用 SqlSessionTemplate 方式时,namespace 可任意。
AwardDao 接口:
public interface AwardDao { public void insert(Award award);}
AwardDaoImpl 实现类:
@Repositorypublic class AwardDaoImpl implements AwardDao { @Resource(name = "sqlSessionTemplate") private SqlSession sqlSession; @Override public void insert(Award award) { sqlSession.insert("AwardDao.insert", award); }}
运行测试代码:
@Testpublic void awardTest() { Award award = new Award(); award.setAward(2); awardMapper.insert(award);}
执行结果:
方式2、MapperFactoryBean 方式:
spring.xml 配置:
<bean id="awardDao" class="org.mybatis.spring.mapper.MapperFactoryBean"> <property name="mapperInterface" value="com.wlm.test.award.AwardDao" /> <property name="sqlSessionFactory" ref="sqlSessionFactory" /></bean>
AwardMapper.xml 映射文件:
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" ><mapper namespace="com.wlm.test.award.AwardDao" > <insert id="insert" parameterType="com.wlm.test.award.Award"> insert into award (award, count, created_time, updated_time) values (#{award}, #{count}, #{createdTime}, #{updatedTime}) </insert></mapper>
注:此处 namespace 和 SqlSessionTemplate 方式不同。与 接口 关联时(即通过MyBatis-Spring的动态代理实现), MyBatis 通过接口的完整名称(包名+类名)查找对应的 mapper 配置,保证唯一性。
测试代码为:
@Testpublic void awardTest() { Award award = new Award(); award.setAward(3); awardDao.insert(award);}
运行结果如下:
方式3、MapperScannerConfigurer 方式:
spring.xml 文件:
<!-- 只有一个 dataSource 时, 自动装配, 多个 dataSource 时, 通过 sqlSessionFactoryBeanName 指定 --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="com.wlm.test.award" /> <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" /></bean>
注: 此处 AwardMapper.xml 映射文件和上方 MapperFactoryBean 方式相同。
三、如何配置多套数据库环境
使用 MyBatis-Spring 时,配置多个 dataSource 数据源,且使用 SqlSessionTemplate 的方式实现数据库访问。
在实现类中,注入不同的 SqlSesion 即可。
即:
<bean id="sqlSessionTemplate1" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactory1" /> </bean> <bean id="sqlSessionTemplate2" class="org.mybatis.spring.SqlSessionTemplate"> <constructor-arg index="0" ref="sqlSessionFactory2" /> </bean>
@Repositorypublic class AwardDaoImpl implements AwardDao { @Resource(name = "sqlSessionTemplate1") private SqlSession sqlSession1; @Resource(name = "sqlSessionTemplate2") private SqlSession sqlSession2; @Override public void insert(Award award) { sqlSession1.insert("AwardDao.insert", award); sqlSession2.insert("AwardDao.insert", award); }}
- MyBatis, MyBatis-Spring 常用访问数据库的方式
- 常用的两种spring、mybatis 配置方式
- Spring Boot集成MyBatis访问数据库
- Spring +MyBatis 整合访问数据库出现错误
- spring mvc集成mybatis进行数据库访问
- Spring Mybatis的分库分表方式
- Spring Mybatis的分库分表方式
- mybatis集成spring操作数据库(以注解的方式)
- Mybatis操作数据库的方式
- mybatis集成spring操作数据库(注解方式
- 通过MyBatis 访问数据库
- mybatis访问数据库
- mybatis+spring 方式一
- spring集成mybatis的三种方式
- spring mybatis 整合的三种方式
- Mybatis Spring 组合的三种方式
- Spring整合Mybatis的三种方式
- Spring 与 myBatis的一种整合方式
- LAJP框架简易配置步骤
- docker 内cron建立定时任务完成nginx 日志轮询切割
- 根据VIEW创建数据源涉及参考表
- chrome调试工具常用功能整理
- 延迟加载的单例设计模式
- MyBatis, MyBatis-Spring 常用访问数据库的方式
- Fragment碎片切换
- POJ 2417 Discrete Logging【大步小步
- Django几个小错误
- UVA 11440
- UEditor文本浏览器,解决引号加斜杠问题
- 设计模式 策略模式
- Android混淆从入门到精通
- 利用java做一个简单的音乐播放器