怎么整合?
- SqlSessionFactory对象应该放到spring容器中作为单例存在。
- 传统dao的开发方式中,应该从spring容器中获得sqlsession对象,以及dao接口对象。
- 官方推荐的动态代理模式中,应该从spring容器中直接获得mapper的代理对象,以及 sqlsession对象。
- 数据库的连接以及数据库连接池以及事务管理都交给spring容器来完成。
整合环境搭建
- 创建一个java工程。
- 导入jar包。(课前资料中mybatis与spring整合所有包)
- mybatis的配置文件sqlMapConfig.xml(空文件即可,其他都可以在spring配置文件中配置)
<?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>
</configuration>
- 编写Spring的配置文件applicationContext.xml
配置以下内容:
- 数据库连接及连接池
- sqlsessionFactory对象,配置到spring容器中
- 编写Spring的配置文件(配置bean的properties:之前在sqlmapconfig.xml中配置的都可以在这里配)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd">
<!-- 加载数据库配置文件 -->
<context:property-placeholder location="classpath:jdbc.properties" />
<!-- 数据库连接池 -->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
<property name="maxActive" value="10" />
<property name="maxIdle" value="5" />
</bean>
<!-- 配置sqlsessionfactory -->
<!-- 不写id属性的话后续用到默认名字是首字母小写的类名 -->
<bean id="sqlsessionfactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 配置数据源 -->
<property name="dataSource" ref="dataSource"></property>
<!-- 加载mybatis核心配置文件 -->
<property name="configLocation" value="classpath:SqlMapConfig.xml"></property>
<!-- 配置别名包扫描 -->
<property name="typeAliasesPackage" value="com.lin.pojo"></property>
</bean>
</beans>
- 复制jdbc.properties配置文件到新工程
- 复制log4j.properties配置文件到新工程
整合之后的传统dao开发
- 新建sql关系映射文件user.xml
(sourcefolder下mybatis文件夹下)
<?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="user">
<!-- 命名空间 用来隔离sql语句 -->
<!-- id 语句的标识 parameter type 传入参数的类型 resulttype 查询结果的返回类型 写全类名 -->
<select id="getUserById" parameterType="int"
resultType="com.lin.pojo.User">
select * from user where id =#{sb};
<!-- #{}相当于占位符 ? 里面内容代表pojo里面的属性 ${}字符串拼接指令 如果是普通数据类型 里面只能写value , -->
</select>
<!-- 查出来的返回值类型是一个集合 只要写集合里面的参数类型就可以 -->
<select id="getUserByUsername" parameterType="string"
resultType="com.lin.pojo.User">
select username,birthday from user where username like '%${value}%';
</select>
<!-- useGeneratedKeys表示主键为自增长模式
keyProperty:与useGeneratedKeys配套使用,用于绑定主键接收的pojo属性-->
<insert id="insertUser" parameterType="com.lin.pojo.User" useGeneratedKeys="true" keyProperty="id">
<!--主键返回 keyproperty pojo中的主键属性 resulttype 主键类型 order在插入语句之后执行 只能大写 -->
<!-- <selectKey keyProperty="id" resultType="int" order="AFTER"> select
last_insert_id(); </selectKey> -->
insert into user
values(null,#{username},#{birthday},#{sex},#{address},null)
</insert>
</mapper>
- sqlMapConfig.xml中加载user.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>
<mappers>
<mapper resource="mybatis/user.xml"/>
</mappers>
</configuration>
- 新建userdao接口,写三个需要测试的方法
package com.lin.dao;
import java.util.List;
import com.lin.pojo.User;
/*
* 用户信息持久化接口
*@author linone
*/
public interface UserDao{
/**
* 根据用户id信息查询讯息
* @param id
* @return
*/
User getUserById(Integer id);
/**
* 根据用户名查询信息(模糊查询)
* @param username
* @return
*/
List<User> getUserByUsername(String username);
/**
* 插入用户信息
* @param user
*/
void insertUser(User user);
}
- 编写userdaoimpl实现类,关键要继承SqlSessionDaoSupport
package com.lin.dao.impl;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import com.lin.dao.UserDao;
import com.lin.pojo.User;
/*
*@author linone
*/
public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {
@Override
public User getUserById(Integer id) {
SqlSession sqlSession = super.getSqlSession(); //sqlsession交给spring了
User user = sqlSession.selectOne("user.getUserById", id);
return user;
}
@Override
public List<User> getUserByUsername(String username) {
SqlSession session = super.getSqlSession();
List<User> list = session.selectList("user.getUserByUsername", username);
return list;
}
@Override
public void insertUser(User user) {
SqlSession sqlSession2 = getSqlSession();
sqlSession2.insert("user.insertUser", user);
//事务管理也交给spring
}
}
- 在applicationContext.xml中配置userdaoimlp,并且注入sqlsessionfactory属性
<bean class="com.lin.dao.impl.UserDaoImpl">
<property name="sqlSessionFactory" ref="sqlsessionfactory"></property>
</bean>
- 测试
package com.lin.test;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.lin.dao.UserDao;
import com.lin.pojo.User;
/*
*@author linone
*传统dao开发模式测试类
*/
public class UserDaoTest {
private ApplicationContext ac;
@Before //在执行任何方法之前先执行该方法
public void init() {
ac=new ClassPathXmlApplicationContext("applicationContext.xml");
}
@Test
public void test() {
UserDao dao = ac.getBean(UserDaoImpl.class);
User userById = dao.getUserById(1);
System.out.println(userById);
}
}
整合之后的官方推荐动态代理dao开发
- 新建usermapper.xml
- 新建usermapper接口 ,注意两者需要符合四条开发 规则
- namespace必须是接口的全路径名(包名.类名)(这条要求保证了测试类能找到这个sql映射文件)
- 接口里面的方法名必须与映射文件的SQLid一致
- 接口方法的入参必须与sql标签parameterType一致
- 接口的返回值必须与sql标签的resultType一致
- 在applicationcontext.xml中配置mapper
(不用在sqlMapConfig.xml中配置)
<!-- 动态代理Dao开发,第一种方式,包扫描器(推荐使用) -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- basePackage:配置映射包装扫描,多个包时用","或";"分隔 (接口和映射文件所在的包)-->
<property name="basePackage" value="com.lin.mapper" />
</bean>
- 测试
package com.lin.test;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import com.lin.mapper.UserMapper;
import com.lin.pojo.User;
/*
*@author linone
*/
public class UserMapperTest {
private ApplicationContext ac;
@Before //在执行任何方法之前先执行该方法
public void init() {
ac=new ClassPathXmlApplicationContext("applicationContext.xml");
}
@Test
public void test() {
UserMapper mapper = ac.getBean(UserMapper.class);
User userById = mapper.getUserById(1);
System.out.println(userById);
}
}