Spring与 Mybatis的 整合 使用

  1. 上两篇文章讲述了 mybatis 的单独集成及使用入门,放置了几天,今天抽时间查看整合了一下mybatis和Spring的整合使用,导包就不说了 ,下载相应的 mybatis 和 spring 的整合开发jar包
  2. 先将实体的bean贴出来吧,放置的com.puya.mybatis.pojo.User包下
package com.puya.mybatis.pojo;

import java.io.Serializable;

public class User implements Serializable {
	private Integer id;
	private String name;
	private String station;
	private String telephone;
	private String address;
	private String decidedzone_id;
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getStation() {
		return station;
	}
	public void setStation(String station) {
		this.station = station;
	}
	public String getTelephone() {
		return telephone;
	}
	public void setTelephone(String telephone) {
		this.telephone = telephone;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	public String getDecidedzone_id() {
		return decidedzone_id;
	}
	public void setDecidedzone_id(String decidedzone_id) {
		this.decidedzone_id = decidedzone_id;
	}
	@Override
	public String toString() {
		return "User [id=" + id + ", name=" + name + ", station=" + station + ", telephone=" + telephone + ", address="
				+ address + ", decidedzone_id=" + decidedzone_id + "]";
	}
	

	
}
  1. 实体bean之后就是Mapper文件,就是前两篇使用的mapper文件,放置在package com.puya.mybatis.mapper下

public interface UserMapper {
	//遵循四个原则
	//接口方法名  == User.xml 中的id 名字
	//接口中的返回值类型   与  Mapper.xml文件中的返回值一样
	//方法的 形参  与Mapper.xml文件中的   形参一样
	//将Mapper.xml 文件  命名空间   和    接口  捆绑
	public User findUserById(Integer id);
	
}

对应的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">

<!-- 写sql语句的地方 -->
<mapper namespace="com.puya.mybatis.mapper.UserMapper">
	<!--
		mapper参数详解:
			namespace:命名空间,区分不同的sql,调用的时候使用 user.findUserById
		select 参数详解
			parameterType  : 传入参数的类型,mybatis封装了基本类,只需要写
			resultType     : 返回的数据类型,一般是全类名
			如果 sqlMapConfig 配置类别名 
			2. 指定扫描包,会把包内所有的类都设置别名,别名的名称就是类名,大小写不敏感
			//<typeAliases>
	
		//<package name="com.puya.mybatis.pojo" />
			//	</typeAliases>
			name返回值resultType 可以直接写类名字,不用全类名
	  -->

	<select id="findUserById" parameterType="Integer" resultType="com.puya.mybatis.pojo.User">
		select * from t_customer where id = #{v}
	
	</select>
	<!-- 
	#{v}            表示占位符v可以是任何字符           select * from t_customer where id = ?
	${value}        表示字符拼接,只能是value  select * from t_customer where name like '%张三%'  ,有单引号的
					为了防止sql注入  ${value}  可以这样写   select * from t_customer where name like "%"#{value}"%"
	 -->
	<select id="findUserByUserName" parameterType="String" resultType="com.puya.mybatis.pojo.User">
		<!-- select * from t_customer where username like '%${value}%' -->
		select * from t_customer where name like "%"#{value}"%"     <!-- 这个可以防止sql注入  -->
	</select>
	
	<insert id="insertUser" parameterType="com.puya.mybatis.pojo.User">
		<!--private Integer id;
		private String name;
		private String station;
		private String telephone;
		private String address;
		private String decidedzone_id;  -->
		<selectKey keyProperty="id" resultType="Integer" order="AFTER">
			select LAST_INSERT_ID()    <!-- 这个表示执行最新的id 服装到User的id中去-->
		</selectKey>
		insert into t_customer (name,station,telephone,address,decidedzone_id) value(#{name},#{station},#{telephone},#{address},#{decidedzone_id})
	
	</insert>
	
	<update id="updateUserById" parameterType="com.puya.mybatis.pojo.User">
		update t_customer 
		set name=#{name},station=#{station},telephone=#{telephone},address=#{address},decidedzone_id=#{decidedzone_id}
		where id=#{id}
	</update>
	
	<delete id="deleteUserById" parameterType="Integer">
		delete from t_customer where id =#{value}
		
	</delete>



</mapper>
  1. 接下来配置sqlMapconfig的文件,在src下新建一个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>
	<!-- 设置别名 -->
	<typeAliases>
		<!-- 2. 指定扫描包,会把包内所有的类都设置别名,别名的名称就是类名,大小写不敏感 -->
		<package name="com.puya.mybatis.pojo" />
	</typeAliases>
	
	<mappers>
		<package name="com.puya.mybatis.mapper"/>
	</mappers>
</configuration>
  1. jdbc的配置文件,db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/bos_puya32?characterEncoding=utf-8
jdbc.username=root
jdbc.password=123456

6.上面都是辅助的文件 和 类,主要的配置连接池和mybatis的基本文件,接下类是最 重要 重要 重要的地方来了,Spring中整合 mybatis,新建一个 applicationContext.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:db.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>
	
	<!-- 配置mybatis的工厂 -->
	<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
		<!-- 需要连接池 -->
		<property name="dataSource" ref="dataSource"/>
		<!-- 核心配置文件的位置 -->
		<property name="configLocation" value="classpath:sqlMapConfig.xml"/>
	
	</bean>
	
	<!--  传统到  的写法   -->
	<bean id="userDao" class="com.puya.mybatis.dao.UserDaoImpl">
		<property name="sqlSessionFactory" ref="sqlSessionFactoryBean"/>
	</bean> 
	
	<!-- Mapper动态代理开发 -->
	<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
		<property name="sqlSessionFactory" ref="sqlSessionFactoryBean"/>
		<property name="mapperInterface" value="com.puya.mybatis.mapper.UserMapper"/>
	</bean>
	
	<!-- Mapper动态代理开发   扫描 -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<!-- 基本包 -->
		<property name="basePackage" value="com.puya.mybatis.mapper"/>
	</bean>
	
	</beans>

其实也就两个重点,第一:配置连接池,这个在hibernate和struts中都用

<context:property-placeholder location="classpath:db.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>

第二个重点就是配置mybatis的工厂bean

<!-- 配置mybatis的工厂 -->
	<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean">
		<!-- 需要连接池 -->
		<property name="dataSource" ref="dataSource"/>
		<!-- 核心配置文件的位置 -->
		<property name="configLocation" value="classpath:sqlMapConfig.xml"/>
	
	</bean>

如果采用传统的dao 和 daoImpl的写法,如果是hibernate的话需要注入sessionFactory,提供属性,每个daoImpl都要有,但是在mybatis中我们可以键sessionFactory整合在 父类中个,到时我们到Impl要继承mybatis提供的 SqlSessionDaoSupport,在applicationContext配置如如下

<!-- Dao原始Dao -->
	<bean id="userDao" class="com.itheima.mybatis.dao.UserDaoImpl">
		<property name="sqlSessionFactory" ref="sqlSessionFactoryBean"/>
	</bean>

相应的daoImpl,dao是空的接口,就不贴出了


import org.mybatis.spring.support.SqlSessionDaoSupport;

/*public class UserDaoImpl implements UserDao{
	//传统的  dao  要注入sessionFactory
	//提供set方法
}
*/

public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao{
	//Mybatis 将session通过配置文件 将SessionFactory注入的父类中,子类直接盗用方法使用
	//  前提:  继承   Mybatis提供的  SqlSessionDaoSupport
	//  然后直接  用   调用父类中的  getSqlSession()方法
	public void  insertUser() {
//		this.getSqlSession().insert(arg0)
	}
}
  1. 如果采用Mapper代理的方式,就是下面这种方式,配置接口map
<!-- Mapper动态代理开发 -->
	<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
		<property name="sqlSessionFactory" ref="sqlSessionFactoryBean"/>
		<property name="mapperInterface" value="com.puya.mybatis.mapper.UserMapper"/>
	</bean>

下面是测试的代码,通过id的方式找到 有mybatis工厂创建实现类

	@Test
	public void testSpringMbatis() {
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
	
		UserMapper userMappter = (UserMapper) ac.getBean("userMapper");
	
		User user = userMappter.findUserById(1);
	
		System.out.println(user );
	}

如果Mapper的数量比较多,就可以通过配置包名动态扫描,在applicationContext配置

!-- Mapper动态代理开发   扫描 -->
	<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
		<!-- 基本包 -->
		<property name="basePackage" value="com.puya.mybatis.mapper"/>
	</bean>

mybatis会扫描配置包名中的所有子包,sessionFactory都不需要配置,mybatis会找到在applicationContext下配置的 sessionFactory ,使用的话就采用以下的方式来生成 实现类

@Test
	public void testSpringMbatis_swipe() {
		ApplicationContext ac = new ClassPathXmlApplicationContext("applicationContext.xml");
	
		UserMapper userMappter = (UserMapper) ac.getBean(UserMapper.class);
	
		User user = userMappter.findUserById(2);
	
		System.out.println(user+ "   11111111111111");
	}

采用接口的 .class 文件来创建对象,就不是通过id来查找了

以上的两个测试方法 都 测试通过 , 测试的时候请见数据库名字 和表名修改 ,jdbc的连接密码修改 ,希望对
大家有用!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值