Spring3集成Mybatis3

来源:互联网 发布:windows intune 编辑:程序博客网 时间:2024/05/21 09:34

刚把Spring3与Mybatis3集成起,记录一下.本文只为了Spring与Mybatis集成,没有太复杂的应用,配置相对简单,如果有需求,可以根据自己需求添加更详细配置.

jar准备

MyBatis-3.1.1.jarMybatis-spring-1.1.1.jarmysql-connector-java-5.1.1.21Commons-dbcp-1.4.jarCommons-pool-1.6.jarCommons-logging-1.1.1.jarorg.springframework.beans-3.1.2.RELEASE.jarorg.springframework.core-3.1.2.RELEASE.jarorg.springframework.context-3.1.2.RELEASE.jarorg.springframework.tx-3.1.2.RELEASE.jar

1 编写实体

package com.ywxm.bean;public class Type {private int id;private String name;public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}}

2 编写application.properties

jdbc.driver=com.mysql.jdbc.Driverjdbc.url=jdbc:mysql://localhost:3306/ywxmjdbc.username=rootjdbc.password=root
3编写Spring的配置文件applicationContext.xml

     <!-- 使用注解自动注入bean --><context:component-scan base-package="com.ywxm" /><context:property-placeholder location="classpath*:/application.properties" /><!--数据源配置 --><bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"><property name="driverClassName" value="${jdbc.driver}" /><property name="url" value="${jdbc.url}" /><property name="username" value="${jdbc.username}" /><property name="password" value="${jdbc.password}" /></bean><!-- MyBatis配置 --><bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"><property name="dataSource" ref="dataSource" /><property name="configLocation" value="classpath:mybatis.xml" />    <property name="mapperLocations" value="classpath:mapper/*_mapper.xml" /></bean>        <!-- 事务管理 -->     <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">            <property name="dataSource" ref="dataSource" />     </bean>     <tx:annotation-driven transaction-manager="transactionManager" />

4 编写Mybatis的配置文件 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><typeAliases><typeAlias type="com.ywxm.bean.Type" alias="type" /></typeAliases></configuration>
5 编写mapper.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="Type"><resultMap type="com.ywxm.bean.Type" id="Type"><id column="id" property="id" /><result column="name" property="name" /></resultMap><insert id="save" parameterType="type">insert intotype(id,name)values(#{id},#{name})</insert>                <!-- ibatis 配置id=#id# ,mysqlbatis 配置id=#{id}--><select id="get" parameterType="int" resultType="type">select * from type where id=#{id}</select></mapper>
6 Dao编写

package com.ywxm.dao;import org.mybatis.spring.SqlSessionTemplate;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import com.ywxm.bean.Type;@Componentpublic class TypeDao {@Autowiredprivate SqlSessionTemplate sqlSessionTemplate;public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {this.sqlSessionTemplate = sqlSessionTemplate;}public Type get(int id){return sqlSessionTemplate.selectOne("Type.get", id);}public void save(Type type) {sqlSessionTemplate.insert(".save", type);}}

  请注意上图中insert("sava",user) 中没有使用namespace值(mapper.xml中),那么必须保证所有mapper文件中"save"是唯一的.我就是犯了这种错误,结果就是数据库操作不成功,但不报错. 浪费了很多时间. 这让我感觉Mybatis测试有点困难.如果使用namespace值( 例:selectOne("Type.get", id))那么不同mapper 文件中有相同的"get" ,那么无所谓.
7 service编写

package com.ywxm.service;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import org.springframework.transaction.annotation.Transactional;import com.ywxm.bean.Type;import com.ywxm.dao.TypeDao;@Component@Transactionalpublic class TypeManager {@Autowiredprivate TypeDao type;public void setType(TypeDao type) {this.type = type;}public void save(Type type) {this.type.save(type);}public void get(int id){   Type t=type.get(id);   }}


在上面配置中dao继承SqlSessionDaoSupport,如果不想使用继承,我们可以稍作改动在Spring的配置文件applicationContext.xml中增加

    <!--  配置sqlSessionTemplate -->    <bean id="sqlSessionTemplate" class="org.mybatis.spring.SqlSessionTemplate"><constructor-arg index="0" ref="sqlSessionFactory" />    </bean> 

在把dao修改如下即可

package com.ywxm.dao;import org.mybatis.spring.SqlSessionTemplate;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import com.ywxm.bean.Type;@Componentpublic class TypeDao {@Autowiredprivate SqlSessionTemplate sqlSessionTemplate;public void setSqlSessionTemplate(SqlSessionTemplate sqlSessionTemplate) {this.sqlSessionTemplate = sqlSessionTemplate;}public Type get(int id){return sqlSessionTemplate.selectOne("Type.get", id);}public void save(Type type) {sqlSessionTemplate.insert("Type.save", type);}}

那为何可以这样呢,通过查看SqlSessionDaoSupport类 发现有这样一段话

" This class needs a SqlSessionTemplate or a SqlSessionFactory. If both are set the SqlSessionFactory will be ignored."

也就是需要SqlSessionTemplate或SqlSessionFactory. 看它源码 SqlSessionFactory作为参数传给SqlSessionTemplate.无论是SqlSessionTemplate还是SqlSessionFactory.最终都是获得SqlSessionTemplate实例.通过SqlSessionTemplate进行数据库操作.因此给它个SqlSessionTemplate实例.从而不使用SqlSessionDaoSupport使用SqlSessionTemplate也能成功