MyBatis使用
获得数据库连接驱动Connection:
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
- 读取配置文件流信息
- 利用SqlSessionFactoryBuilder创建SqlSessionFactory
- 利用SqlSessionFactory对象得到SqlSession便可以操作sql
整合Spring
在 MyBatis 中,session 工厂可以使用 SqlSessionFactoryBuilder 来创建,而在 MyBatis-Spring 中,则使用 SqlSessionFactoryBean 来替代。
创建SqlSession一般有以下两种方式
- SqlSessionTemplate
- SqlSessionDaoSupport
1. SqlSessionTemplate
SqlSessionTemplate实现了SqlSession接口
1.1 spring-dao.xml配置
<!-- 建立数据库连接池 -->
<context:property-placeholder location="classpath:jdbc.propeties"/>
<bean id = "writeDataSource" class = "com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${driverClass}"/>
<property name="jdbcUrl" value="${jdbcUrl}"/>
<property name="user" value="${user}"/>
<property name="password" value="${password}"/>
</bean>
<!-- 配置SqlSessionFactory -->
<bean id = "sqlSessionFactory" class = "org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="writeDataSource"/>
<!-- mybatis.xml全局配置文件 -->
<property name="configLocation" value="classpath:mybatis/mybatis.xml"/>
<!-- mybatis映射器文件 -->
<property name = "mapperLocations" value = "classpath:mapper/*.xml"/>
<!-- 设定实体别名 -->
<property name="typeAliasesPackage" value = "com.gz.mybatis.entity"/>
</bean>
<bean id="sqlSession"class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0"ref="sqlSessionFactory" />
</bean>
1.2. mybatis.xml配置
<?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>
<!-- 配置全局属性 -->
<settings>
<!-- 使用jdbc的getGeneratedKeys 获取数据库自增主键 -->
<setting name = "useGeneratedKeys" value = "true"/>
<!-- 使用列别名替换列名 默认:true -->
<setting name = "useColumnLabel" value = "true"/>
<!-- 开启驼峰命名转换:Table(create_time) -> Entity(createTime) -->
<setting name = "mapUnderscoreToCamelCase" value = "true"/>
</settings>
</configuration>
1.3. dao层
package com.gz.teset;
import java.util.List;
public interface StudentDao {
List<Student> queryStudent();
}
package com.gz.teset;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
@Repository
public class StudentDaoImpl implements StudentDao{
@Autowired
private SqlSession sqlSession;
@Override
public List<Student> queryStudent() {
return sqlSession.selectList("com.gz.mybatis.dao.StudentDao.queryStudent");
}
}
1.4.mapper文件
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.gz.mybatis.dao.StudentDao">
<!-- 一对多 -->
<resultMap type="com.gz.mybatis.entity.StudentDO" id="studentMap">
<id column="id" property="id"></id>
<result column="name" property="name"/>
<collection property="cards" ofType="com.gz.mybatis.entity.Card">
<result column="id" property="id"/>
<result column="cardName" property="cardName"/>
<result column="money" property="money"/>
</collection>
</resultMap>
<select id = "queryStudent" resultMap="studentMap">
SELECT s.id,
s.name,
c.id,
c.money,
c.cardName,
c.student_id
FROM student s,card c
where s.id = c.student_id
</select>
</mapper>
2. SqlSessionDaoSupport
SqlSessionDaoSupport 是一个抽象的支持类, 用来为你提供 SqlSession。调用 getSqlSession()方法你会得到一个SqlSessionTemplate,之后可以用于执行 SQL 方法。
SqlSessionDaoSupport 需要一个 sqlSessionFactory 或sqlSessionTemplate 属性来设置 。
实体类继承SqlSessionDaoSupport 类将sqlSessionFactory 或sqlSessionTemplate
注入到属性中
2.1. spring-dao.xml配置
<!-- 建立数据库连接池 -->
<context:property-placeholder location="classpath:jdbc.propeties"/>
<bean id = "writeDataSource" class = "com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${driverClass}"/>
<property name="jdbcUrl" value="${jdbcUrl}"/>
<property name="user" value="${user}"/>
<property name="password" value="${password}"/>
</bean>
<!-- 配置SqlSessionFactory -->
<bean id = "sqlSessionFactory" class = "org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="writeDataSource"/>
<!-- mybatis.xml全局配置文件 -->
<property name="configLocation" value="classpath:mybatis/mybatis.xml"/>
<!-- mybatis映射器文件 -->
<property name = "mapperLocations" value = "classpath:mapper/*.xml"/>
<!-- 设定实体别名 -->
<property name="typeAliasesPackage" value = "com.gz.mybatis.entity"/>
</bean>
<bean id="sqlSession"class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg index="0"ref="sqlSessionFactory" />
</bean>
<bean id="userDao"class="com.gz.teset.StudentDaoImpl ">
<!--注入SqlSessionTemplate实例 -->
<propertynamepropertyname="sqlSessionTemplate" ref="sqlSession" />
2.2. mybatis.xml配置
<?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>
<!-- 配置全局属性 -->
<settings>
<!-- 使用jdbc的getGeneratedKeys 获取数据库自增主键 -->
<setting name = "useGeneratedKeys" value = "true"/>
<!-- 使用列别名替换列名 默认:true -->
<setting name = "useColumnLabel" value = "true"/>
<!-- 开启驼峰命名转换:Table(create_time) -> Entity(createTime) -->
<setting name = "mapUnderscoreToCamelCase" value = "true"/>
</settings>
</configuration>
2.3. dao层
package com.gz.teset;
import java.util.List;
public interface StudentDao {
List<Student> queryStudent();
}
package com.gz.teset;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
@Repository
public class StudentDaoImpl extends SqlSessionDaoSupport implements StudentDao{
@Override
public List<Student> queryStudent() {
return getSqlSession().selectList("com.gz.mybatis.dao.StudentDao.queryStudent");
}
}
2.4.mapper文件
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.gz.mybatis.dao.StudentDao">
<!-- 一对多 -->
<resultMap type="com.gz.mybatis.entity.StudentDO" id="studentMap">
<id column="id" property="id"></id>
<result column="name" property="name"/>
<collection property="cards" ofType="com.gz.mybatis.entity.Card">
<result column="id" property="id"/>
<result column="cardName" property="cardName"/>
<result column="money" property="money"/>
</collection>
</resultMap>
<select id = "queryStudent" resultMap="studentMap">
SELECT s.id,
s.name,
c.id,
c.money,
c.cardName,
c.student_id
FROM student s,card c
where s.id = c.student_id
</select>
</mapper>
扩展:
问题:使用SqlSessionDaoSupport每个Dao都要在xml配置文件中注入 sqlSessionFactory 或sqlSessionTemplate
可以利用MapperScannerConfigurer扫描映射器接口,会自动注入sqlSessionTemplate
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.test.soa.order.mapper"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
MapperScannerConfigurer实现了BeanDefinitionRegistryPostProcessor。