spring&mybatis整合

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();
  1. 读取配置文件流信息
  2. 利用SqlSessionFactoryBuilder创建SqlSessionFactory
  3. 利用SqlSessionFactory对象得到SqlSession便可以操作sql

整合Spring

在 MyBatis 中,session 工厂可以使用 SqlSessionFactoryBuilder 来创建,而在 MyBatis-Spring 中,则使用 SqlSessionFactoryBean 来替代。

创建SqlSession一般有以下两种方式

  1. SqlSessionTemplate
  2. 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。

猜你喜欢

转载自blog.csdn.net/u010811939/article/details/80339723