- 上两篇文章讲述了 mybatis 的单独集成及使用入门,放置了几天,今天抽时间查看整合了一下mybatis和Spring的整合使用,导包就不说了 ,下载相应的 mybatis 和 spring 的整合开发jar包
- 先将实体的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 + "]";
}
}
- 实体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>
- 接下来配置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>
- 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)
}
}
- 如果采用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的连接密码修改 ,希望对
大家有用!