您的位置:首页 > 编程语言 > Java开发

11.MyBatis与Spring整合

2015-06-22 23:44 591 查看
测试代码在下面(没jar)
集成步骤

1、 jar包集成;
2、 配置文件集成(数据源);
3、 Spring对SqlSessionFactory进行管理配置;
4、 Mybatis程序编写(接口、映射文件);
5、 Spring通过配置文件管理mybatis 的对象;

jar包集成

Mybatis3.2.7 的jar包(mybatis核心包、依赖包)


Spring3.2.0 的jar包


Spring与mybatis的集成包




数据库驱动包


Dbcp连接池包



搭建工程环境




配置文件集成
注意:Mybatis的配置文件中的数据源配置去掉,由spring进行管理配置。
Mybatis的SqlMapConfig.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>
<!-- lazyLoadingEnabled:延迟加载的开关,默认是false -->
<setting name="lazyLoadingEnabled"value="true"/>
<!-- aggressiveLazyLoading:默认为true,一旦为true上面的懒加载开关失效 -->
<setting name="aggressiveLazyLoading"value="false"/>

<!-- cacheEnabled:二级缓存的总开关默认是false-->
<setting name="cacheEnabled"value="true"/>
</settings>

<!-- 定义别名 -->
<typeAliases>
<!-- 批量定义别名 -->
<!-- name:指定需要别名定义的包的名称它的别名就是类名(类名的首字母大小写都可)-->
<package name="cn.mybatis.sm.domain"></package>
</typeAliases>

<!-- 注意:与spring集成后,数据源和事务交给spring来管理 -->

<!-- 加载mapper文件 -->
<mappers>

<!-- 批量加载mapper
注意:mapper接口文件和mapper映射文件,名称相同,在同一个包下
-->
<package name="cn.mybatis.sm.mapper"/>
</mappers>
</configuration>
Spring的applicationContext.xml配置文件头:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop"xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.2.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.2.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">[/code]
Spring的applicationContext.xml配置文件内容:
<!-- 引用db.properties配置文件 -->
<context:property-placeholder location="db.properties"/>

<!-- 配置数据源,使用dbcp连接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName"value="${db.driver}" />
<property name="url"value="${db.url}" />
<property name="username"value="${db.username}" />
<property name="password"value="${db.password}" />
<property name="maxActive"value="10" />
<property name="maxIdle"value="5" />
</bean>

Spring对SqlSessionFactory进行管理配置

<!-- Spring管理SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- mybatis配置文件的地址 -->
<property name="configLocation" value="mybatis/sqlMapConfig.xml"></property>
<!-- 配置数据源 -->
<property name="dataSource" ref="dataSource"></property>
</bean>
MyBatis程序编写
编写DAO接口
package cn.mybatis.sm.dao;

import cn.mybatis.sm.domain.User;

public interface UserDao {

public User findUserById(int id);
}
编写dao实现类(继承SqlSessionDaoSupport)
package cn.mybatis.sm.dao.impl;

import org.mybatis.spring.support.SqlSessionDaoSupport;

import cn.mybatis.sm.dao.UserDao;
import cn.mybatis.sm.domain.User;

public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {

public User findUserById(int id) {

return this.getSqlSession().selectOne("cn.mybatis.sm.mapper.UserMapper.findUserById", id);
}

}
编写Mapper映射文件

<select id="findUserById" parameterType="int" resultType="user">
SELECT <include refid="selectUserSql"></include> FROM USER WHERE ID = #{id}
</select>
Spring定义bean
<!-- 配置UserDao进行注入开发 -->
<bean id="userDao" class="cn.mybatis.sm.dao.impl.UserDaoImpl">
<property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
</bean>
编写测试代码
package cn.mybatis.sm.dao;

import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.mybatis.sm.domain.User;

public class UserDaoTest {

private ApplicationContext applicationContext;

@Before
public void setUp() throws Exception {
applicationContext = new ClassPathXmlApplicationContext("spring/applicationContext.xml");
}

@Test
public void testFindUserById() {
UserDao dao = (UserDao) applicationContext.getBean("userDao");
User user = dao.findUserById(1);
System.out.println(user);
}

}
Mapper接口开发
编写mapper接口
package cn.mybatis.sm.mapper;

import java.util.List;

import cn.mybatis.sm.domain.User;
import cn.mybatis.sm.domain.UserQuery;

/**
* 这是一个mapper接口,就和DAO的接口一样
* 定义方法,然后其他的实现都由MyBatis来完成就好啦
* @author 刘泽栋
* @date 2015年6月20日 下午2:33:58
*/
public interface UserMapper {
// 根据用户的ID来查询用户
public User findUserById(int id);

// 根据用户的名字来模糊查询用户
public List<User> findUserByName(String username);

// 添加用户
public void insertUser(User user);

// 根据用户的 性别和姓名来查询用户
public List<User> findUserByUser(User user);

// 复杂查询,就是使用 封装类,里面的类的条件进行查询
public List<User> findUserByList(UserQuery userQuery);

// 查询所有用户的id
public List<Integer> findIdList();

// 测试if
public List<User> findUser4If(User user);

// 测试where,动态的查询用户,看用户传入的是什么,在配置文件中做判断
public List<User> findUser4Where(User user);

//根据用户ID的集合查询用户列表(学习foreach标签之直接传ID集合)
public List<User> findUserByIdListForEach(List<Integer> idList);
}
编写mapper映射文件
<?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">

<!-- namespace:此时用mapper代理方式开发,它的值必须等于对应mapper接口的全限定名 -->
<mapper namespace="cn.mybatis.sm.mapper.UserMapper">

<!-- 定义sql片段 -->
<!--
[sql标签]:定义一个SQL片段
[id]:SQL片段的唯一标识
建议:
1、SQL片段中的内容最好是以单表来定义
2、如果是查询字段,则不要写上SELECT
3、如果是条件语句,则不要写上WHERE
-->
<sql id="selectUserSql">
ID,USERNAME,SEX,BIRTHDAY,ADDRESS
</sql>

<!-- 根据id查询用户 -->
<!--
[include标签]:引用已经定义好的SQL片段
[refid]:引用的SQL片段id
-->
<select id="findUserById" parameterType="int" resultType="user"> SELECT <include refid="selectUserSql"></include> FROM USER WHERE ID = #{id} </select>

<!-- 根据用户的姓名模糊查询用户列表 -->
<select id="findUserByName" parameterType="String" resultType="User">
SELECT * FROM USER WHERE USERNAME LIKE '%${value}%'
</select>

<!-- 添加用户 -->
<insert id="insertUser" parameterType="User">
INSERT INTO USER(username,sex,birthday,address) VALUES(#{username},#{sex},#{birthday},#{address})
</insert>

<!-- 根据用户的性别和姓名来查询用户 -->
<!--
[if标签]:进行动态判断,如果成功则把if标签内的内容拼接到原有SQL上
[test]:填写判断表达式
-->
<select id="findUserByUser" parameterType="User" resultType="User">
SELECT * FROM USER WHERE sex = #{sex} AND username like '%${username}%'
</select>

<!-- 复杂查询,就是查询类,里面的类 -->
<select id="findUserByList" parameterType="UserQuery" resultType="User">
SELECT * FROM USER WHERE sex = #{user.sex} AND username like '%${user.username}%'
</select>

<!-- 查询所有id,返回的是简单类型 -->
<select id="findIdList" resultType="int">
SELECT ID FROM USER
</select>

<!-- 测试动态查询(if) -->
<!--
[if标签]:进行动态判断,如果成功则把if标签内的内容拼接到原有SQL上
[test]:填写判断表达式
-->
<select id="findUser4If" parameterType="User" resultType="User">
SELECT * FROM USER WHERE sex = #{sex}
<if test="username != null and username != '' ">
AND username like '%${username}%'
</if>
</select>

<!-- 测试动态查询(where) -->
<!--
通过动态SQL可以看出,为了保证SQL语句的正确性,需要在where 后面添加没有任何意义的1=1
[where标签]:使用它可以去掉它后面的第一个and,这样就可以保证SQL的正确性了
-->
<select id="findUser4Where" parameterType="User" resultType="User">
SELECT <include refid="selectUserSql"/> FROM USER
<where>
<if test="sex != null and sex != ''">
AND sex=#{sex}
</if>
<if test="username != null and username != ''">
AND username LIKE '%${username}%'
</if>
</where>
</select>

<!-- 根据用户ID的集合查询用户列表(学习foreach标签之直接传ID集合) -->
<!--
[foreach标签]:表示一个foreach循环
[collection]:集合参数的名称,如果是直接传入集合参数,则该处只能填写[list]。
[item]:定义遍历集合之后的参数名称
[open]:开始遍历之前需要拼接的SQL串
[close]:结束遍历之后需要拼接的SQL串
[separator]:遍历出的每个对象之间需要拼接的字符
-->
<select id="findUserByIdListForEach" parameterType="list" resultType="User">
select <include refid="selectUserSql"/> from user
<where>
<if test="list != null and list.size > 0">
<foreach collection="list" item="id" open="AND ID IN (" close=")" separator=",">
#{id}
</foreach>
</if>
</where>
</select>

</mapper>
Spring定义bean
Mapper代理开发方式有两种bean的定义方法,一种是MapperFactoryBean,一种是MapperScannerConfigurer。

通过MapperFactoryBean创建代理对象





通过MapperScannerConfigurer批量扫描创建代理对象

<!-- 使用mapper接口的形式开发 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 指定扫描的包 -->
<property name="basePackage" value="cn.mybatis.sm.mapper"></property>
<!-- 指定sqlSessionFactory的名字 -->
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
编写测试代码

package cn.mybatis.sm.mapper;

import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import cn.mybatis.sm.domain.User;
/**
* Mapper测试代码
* @author 刘泽栋
* @date 2015年6月22日 下午11:39:58
*/
public class UserMapperTest {

private ApplicationContext applicationContext;

@Before
public void setUp() throws Exception {
applicationContext = new ClassPathXmlApplicationContext("spring/applicationContext.xml");
}

@Test
public void testFindUserById() {
UserMapper userMapper = (UserMapper) applicationContext.getBean("userMapper");
User user = userMapper.findUserById(1);
System.out.println(user);
}

}
测试结果




附件:http://down.51cto.com/data/2365836
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息