#Spring集成MyBatis (方式一 使用Mapper映射器)
-
step1.导包。
spring-webmvc,mybatis,mybatis-spring,spring-jdbc
ojdbc,dbcp,junit。 -
step2.添加Spring配置文件
MyBatis配置文件的内容变成了一个bean
(SqlSessionFactoryBean)
<util:properties id="db" location="classpath:db.properties"/>
<!-- 配置数据库连接池 -->
<bean id="ds"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName"
value="#{db.driver}"/>
<property name="url"
value="#{db.url}"/>
<property name="username"
value="#{db.user}"/>
<property name="password"
value="#{db.pwd}"/>
</bean>
<!-- 配置SqlSessionFactoryBean -->
<!--
该bean的作用是用来代替MyBatis配置文件
-->
<bean
class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 指定连接池 -->
<property name="dataSource" ref="ds"/>
<!-- 指定映射文件位置 -->
<property name="mapperLocations"
value="classpath:entity/*.xml"/>
</bean>
<!-- 配置MapperScannerConfigurer -->
<!--
该bean会扫描指定包及其子包下面的所有的Mapper
映射器(接口),然后生成符合该接口要求的对象
(通过调用SqlSession的getMapper方法),接下来,
会将这些对象(即Mapper映射器的实现对象)添加到
Spring容器里面(默认的id是首字母小写之后的接口名)。
-->
<bean
class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 指定要扫描的包 -->
<property name="basePackage" value="dao"/>
<!-- 指定只扫描带有该注解的接口 -->
<property name="annotationClass"
value="annotations.MyBatisRepository"/>
</bean>
</beans>
-
step3.实体类
-
step4.映射文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//ibatis.apache.org//DTD Mapper 3.0//EN"
"http://ibatis.apache.org/dtd/ibatis-3-mapper.dtd">
<mapper namespace="dao.EmployeeDAO">
<!--
id:每一条sql语句都有唯一的id,称之为sqlId。
parameterType:参数类型(如果是类,要写全限定名)
-->
<insert id="save" parameterType="entity.Employee">
INSERT INTO t_emp VALUES(t_emp_seq.nextval,
#{ename},#{salary},#{age})
</insert>
<!--
resultType: 返回类型(如果是类,要写全限定名)
-->
<select id="findAll"
resultType="entity.Employee">
SELECT * FROM t_emp
</select>
<!-- 返回Map类型的结果 -->
<!--
map是java.util.Map的简写形式。
-->
<select id="findById2" parameterType="int"
resultType="map">
SELECT * FROM t_emp WHERE id = #{id1}
</select>
<!--
设置字段名与实体类的属性名的对应关系。
只需要将不一致的列出来。
-->
<resultMap type="entity.Emp2" id="empResultMap">
<result property="empNo" column="id"/>
<result property="name" column="ename"/>
</resultMap>
<select id="findById3" parameterType="int"
resultMap="empResultMap">
SELECT * FROM t_emp WHERE id = #{id1}
</select>
</mapper>
-
step5.Mapper映射器
和映射文件相对应的接口 -
step6.配置MapperScannerConfigurer
该bean会扫描指定包及其子包下面的所有的Mapper映射器(接口),会调用SqlSession的getMapper方法返回Mapper映射器的实现对象,并且将这些对象添加到Spring容器里面。(默认的id是首字母小写之后的接口名)。
<bean
class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 指定要扫描的包 -->
<property name="basePackage" value="dao"/>
<!-- 指定只扫描带有该注解的接口 -->
<property name="annotationClass"
value="annotations.MyBatisRepository"/>
</bean>
#只扫描带有特定注解的Mapper映射器
step1.开发一个注解。
package annotations;
public @interface MyBatisRepository {
}
step2.将注解添加到Mapper映射器上面。
@Repository("empDAO")
@MyBatisRepository
public interface EmployeeDAO {
}
step3.配置MapperScannerConfigurer。
#Spring集成MyBatis (方式二 不使用Mapper映射器)
step1.导包。
spring-webmvc,mybatis,mybatis-spring,spring-jdbc
ojdbc,dbcp,junit。
step2.添加Spring配置文件
MyBatis配置文件的内容变成了一个bean
(SqlSessionFactoryBean)
<util:properties
id="db" location="classpath:db.properties"/>
<!-- 配置数据库连接池 -->
<bean id="ds"
class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName"
value="#{db.driver}"/>
<property name="url"
value="#{db.url}"/>
<property name="username"
value="#{db.user}"/>
<property name="password"
value="#{db.pwd}"/>
</bean>
<!-- 配置SqlSessionFactoryBean -->
<!--
该bean的作用是用来代替MyBatis配置文件
-->
<bean id="ssfb"
class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 指定连接池 -->
<property name="dataSource" ref="ds"/>
<!-- 指定映射文件位置 -->
<property name="mapperLocations"
value="classpath:entity/*.xml"/>
</bean>
<!-- 配置SqlSessionTemplate -->
<!--
SqlSessionTemplate封装了SqlSession的操作。
-->
<bean id="sst"
class="org.mybatis.spring.SqlSessionTemplate">
<!-- 指定SqlSessionFactoryBean -->
<constructor-arg index="0" ref="ssfb"/>
</bean>
<!-- 配置组件扫描 -->
<context:component-scan base-package="dao"/>
</beans>
step3.实体类
@Repository("empDAO")
public class EmployeeDAOMyBatisImpl implements
EmployeeDAO{
@Autowired
@Qualifier("sst")
private SqlSessionTemplate sst;
public void save(Employee emp) {
/*
* 不用考虑提交事务和关闭SqlSession,
* SqlSessionTemplate已经处理了。
*/
sst.insert("dao.EmployeeDAO.save", emp);
}
public List<Employee> findAll() {
return sst.selectList("dao.EmployeeDAO.findAll");
}
public Employee findById(int id) {
return sst.selectOne("dao.EmployeeDAO.findById", id);
}
public void update(Employee e) {
sst.update("dao.EmployeeDAO.update", e);
}
public void delete(int id) {
sst.delete("dao.EmployeeDAO.delete", id);
}
public Map findById2(int id) {
return sst.selectOne(
"dao.EmployeeDAO.findById2", id);
}
public Emp2 findById3(int id) {
return sst.selectOne("dao.EmployeeDAO.findById3",id);
}
}
step4.映射文件
namespace可以自定义。
step5.DAO接口方法名等不做要求。
step6.DAO实现类。
step7.配置SqlSessionTemplate
可以将SqlSessionTemplate注入到DAO,然后 调SqlSessionTemplate提供的方法即可。SqlSessionTemplate封装了SqlSession,我们不用去考虑如何获得SqlSession,如何关闭SqlSession。
<bean id="sst"
class="org.mybatis.spring.SqlSessionTemplate">
<!-- 指定SqlSessionFactoryBean -->
<constructor-arg index="0" ref="ssfb"/>
</bean>
<!-- 配置组件扫描 -->
<context:component-scan base-package="dao"/>