Mybatis(九)之spring+mybatis整合

怎么整合?

  1. SqlSessionFactory对象应该放到spring容器中作为单例存在。
  2. 传统dao的开发方式中,应该从spring容器中获得sqlsession对象,以及dao接口对象。
  3. 官方推荐的动态代理模式中,应该从spring容器中直接获得mapper的代理对象,以及 sqlsession对象。
  4. 数据库的连接以及数据库连接池以及事务管理都交给spring容器来完成。

整合环境搭建

  1. 创建一个java工程。
  2. 导入jar包。(课前资料中mybatis与spring整合所有包)
    在这里插入图片描述
  3. 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>

  1. 编写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>
  1. 复制jdbc.properties配置文件到新工程
  2. 复制log4j.properties配置文件到新工程

整合之后的传统dao开发

  1. 新建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>

  1. 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>

  1. 新建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);
}

  1. 编写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
	}

}

  1. 在applicationContext.xml中配置userdaoimlp,并且注入sqlsessionfactory属性
<bean class="com.lin.dao.impl.UserDaoImpl">
	<property name="sqlSessionFactory" ref="sqlsessionfactory"></property>
	</bean>
  1. 测试
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开发

  1. 新建usermapper.xml
  2. 新建usermapper接口 ,注意两者需要符合四条开发 规则
  • namespace必须是接口的全路径名(包名.类名)(这条要求保证了测试类能找到这个sql映射文件)
  • 接口里面的方法名必须与映射文件的SQLid一致
  • 接口方法的入参必须与sql标签parameterType一致
  • 接口的返回值必须与sql标签的resultType一致
  1. 在applicationcontext.xml中配置mapper
    (不用在sqlMapConfig.xml中配置)

	<!-- 动态代理Dao开发,第一种方式,包扫描器(推荐使用) -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
   		<!-- basePackage:配置映射包装扫描,多个包时用","或";"分隔 (接口和映射文件所在的包)-->
<property name="basePackage" value="com.lin.mapper" />
   </bean>
  1. 测试
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);
	}
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值