mybatis和spring的整合

一、搭建环境

spring和mybatis不同的厂家. 如果要进行整合需要有一个整合包 spring-mybatis的整合包.

整合包中就给了的工厂对象SqlSessionFactoryBean .

实现的步骤:

1.导入jar

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.itheima.day25_spring_mybatis</groupId>
    <artifactId>day25_spring_mybatis</artifactId>
    <version>1.0-SNAPSHOT</version>

    <dependencies>
        <!--配置包括spring很多依赖包-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>4.2.4.RELEASE</version>
        </dependency>
        <!--配置JdbcTemplate-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>4.2.4.RELEASE</version>
        </dependency>
        <!--spring的AOP的扩展-->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.7</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.46</version>
        </dependency>
        <!--mybatis核心依赖-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.5</version>
        </dependency>
        <!--Spring和MyBatis的整合包,要进行整合,就要这个包-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.0</version>
        </dependency>
        <!--单元测试-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>4.2.4.RELEASE</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-log4j12</artifactId>
            <version>1.6.6</version>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.10</version>
        </dependency>
    </dependencies>
</project>

2.引入配置文件

  • db.properties (复制修改)

  • log4j.properties (复制)

  • SqlMapConfig.xml (我们要改动 空文件)

  • xxxMapper.xml (我要改动)

  • applicationContext.xml (我们要改动)

applicationContext.xml 中的配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!--1.spring加载外部数据源-->
    <context:property-placeholder location="classpath:db.properties"/>

    <!--2.配置数据源-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

    <!--配置工厂对象 SqlSEssionFactoryBean (整合包中的工厂对象)-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--需要注入连接池对象-->
        <property name="dataSource" ref="dataSource"/>
        <!--加载SqlMapConfig.xml-->
        <property name="configLocation" value="classpath:SqlMapConfig.xml"/>
        <!--配置别名-->
        <property name="typeAliasesPackage" value="com.itheima.pojo"/>
        <!--配置加载映射文件-->
        <property name="mapperLocations" value="classpath:User.xml"/>
    </bean>

    <!--扫描所有类,创建对象-->
    <context:component-scan base-package="com.itheima"/>

    <!--
     配置事务
     -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!--配置增强-->
    <tx:advice id="txAdivce" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="add*" isolation="REPEATABLE_READ" propagation="REQUIRED" timeout="-1" read-only="false"/>
        </tx:attributes>
    </tx:advice>

    <aop:config>
        <aop:pointcut id="pointcutAdd" expression="execution(* com.itheima..add*(..))"/>
        <aop:advisor advice-ref="txAdivce" pointcut-ref="pointcutAdd"/>
    </aop:config>


    <!--
        如果使用远程的dao
    -->


    <!--
        如果使用Mapper动态代理如何做
    -->
</beans>

3.创建包结构

com.itheima.dao

com.itheima.pojo

4.数据库的创建

 CREATE TABLE USER (
	id INT(11) PRIMARY KEY AUTO_INCREMENT,
	username VARCHAR(32) NOT NULL COMMENT '用户名称',
	birthday DATE DEFAULT NULL COMMENT '生日',
	sex CHAR(1) DEFAULT NULL COMMENT '性别',
	address VARCHAR(256) DEFAULT NULL COMMENT '地址'

 );
 
INSERT INTO `user` VALUES (NULL, '王五', '2015-05-10', '2', NULL);
INSERT INTO `user` VALUES (NULL, '张三', '2014-07-10', '1', '北京市');
INSERT INTO `user` VALUES (NULL, '张小明', '2018-11-11', '1', '郑州');
INSERT INTO `user` VALUES (NULL, '陈小明', '2019-07-20', '1', '广州');
INSERT INTO `user` VALUES (NULL, '张三丰', '2011-04-11', '1', '西安');
INSERT INTO `user` VALUES (NULL, '陈小明', '2019-09-10', '2', '杭州');
INSERT INTO `user` VALUES (NULL, '王五', '2014-07-07', NULL, NULL);

二、使用原始的dao进行整合

需求:

1.根据id查询用户信息

2.根据name模糊查询用户信息

3.添加用户信息

编写了UserDao

package com.itheima.dao;

import com.itheima.pojo.User;

import java.util.List;

public interface UserDao {

    //根据id查询User
    public User findUserById(int id);

    //根据name模糊查询user
    public List<User>  queryUserByName(String name);

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

编写UserDaoImpl实现类

package com.itheima.dao;

import com.itheima.pojo.User;
import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * SqlSessionFactory
 * sqlSession  (selectOne   selectList   insert  update   delete 方法)
 *
 * 因为我们需要一个SqlSession会话对象来进行数据的查询和增加.
 * spirng提供了一个类 SqlSessionDaoSupport  ,继承该类,就可以或货到sqlSession.
 *
 * 可以在方法中 super.getSqlSession() 获取sqlSession对象 (获取到的该对象不能直接使用)
 * 我们需要给SqlSessionDaoSupport设置一个工厂对象.
 *
 */
public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {

    public User findUserById(int id) {
        SqlSession sqlSession = super.getSqlSession();
        //selectOne("namespace的id值.sql的id值",实际的参数)
        User user = sqlSession.selectOne("test.findUserById", id);
        return user;
    }

    public List<User> queryUserByName(String name) {
        SqlSession sqlSession = super.getSqlSession();
        List<User> list = sqlSession.selectList("test.findUserByName", name);
        return list;
    }

    public void addUser(User user) {
        SqlSession sqlSession = super.getSqlSession();
        sqlSession.insert("test.addUser",user);
    }
}

修改applicationContext.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!--1.spring加载外部数据源-->
    <context:property-placeholder location="classpath:db.properties"/>

    <!--2.配置数据源-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

    <!--配置工厂对象 SqlSEssionFactoryBean (整合包中的工厂对象)-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--需要注入连接池对象-->
        <property name="dataSource" ref="dataSource"/>
        <!--加载SqlMapConfig.xml-->
        <property name="configLocation" value="classpath:SqlMapConfig.xml"/>
        <!--配置别名-->
        <property name="typeAliasesPackage" value="com.itheima.pojo"/>
        <!--配置加载映射文件-->
        <property name="mapperLocations" value="classpath:User.xml"/>
    </bean>

    <!--扫描所有类,创建对象-->
    <context:component-scan base-package="com.itheima.dao"/>

    <!--
     配置事务
     -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!--配置增强-->
    <tx:advice id="txAdivce" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="add*" isolation="REPEATABLE_READ" propagation="REQUIRED" timeout="-1" read-only="false"/>
        </tx:attributes>
    </tx:advice>

    <aop:config>
        <aop:pointcut id="pointcutAdd" expression="execution(* com.itheima..add*(..))"/>
        <aop:advisor advice-ref="txAdivce" pointcut-ref="pointcutAdd"/>
    </aop:config>


    <!--
        如果使用原生的dao
    -->
    <bean id="userDao" class="com.itheima.dao.UserDaoImpl">
        <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
    </bean>


    <!--
        如果使用Mapper动态代理如何做
    -->
</beans>

User.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">
<mapper namespace="test">

    <!--根据id查询-->
    <select id="findUserById" resultType="user">
        select * from user where id = #{id}
    </select>

    <!--根据name模糊查询-->
    <select id="findUserByName" resultType="user">
        select * from user where username like '%${value}%'
    </select>

    <!--添加用户-->
    <insert id="addUser" >
        insert into user values(null,#{username},#{birthday},#{sex},#{address});
    </insert>
</mapper>

测试Dao

package com.itheima.dao;

import com.itheima.pojo.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.Date;
import java.util.List;

import static org.junit.Assert.*;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext.xml")
public class UserDaoTest {

    @Autowired
    private UserDao userDao;

    @Test
    public void findUserByIdTest() {
        User user = userDao.findUserById(5);
        System.out.println(user);
    }

    @Test
    public void queryUserByNameTest() {
        List<User> list = userDao.queryUserByName("张");
        for (User user : list) {
            System.out.println(user);
        }
    }

    @Test
    public void addUserTest() {
        User user = new User();
        user.setUsername("柳岩");
        user.setSex("2");
        user.setBirthday(new Date());
        user.setAddress("北京");
        userDao.addUser(user);

    }
}

三、mapper动态代理的方式整合 (重点)

需求:

1.根据id查询用户信息

2.根据name模糊查询用户信息

3.添加用户信息

1)新建一个com.itheima.mapper包 -- 存放的是接口

public interface UserMapper {

    //根据id查询User
    public User findUserById(int id);

    //根据name模糊查询user
    public List<User> queryUserByName(String name);

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

2) resources目录下创建一个和mapper接口目录已经的配置文件名字: UserMapper.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">

<!--
    mapper动态代理四个规则:
    1.namespace和接口的完全路径名一致
    2.sql的id和接口中方法的名称一致
    3.sql中的返回值类型和接口的方法返回值类型一致
    4.sql中的参数类型和接口中方法的参数类型一致
-->

<mapper namespace="com.itheima.mapper.UserMapper">

    <!--根据id查询-->
    <select id="findUserById" resultType="user" parameterType="int">
        select * from user where id = #{id}
    </select>

    <!--根据name模糊查询-->
    <select id="queryUserByName" resultType="user" parameterType="string">
        select * from user where username like '%${value}%'
    </select>

    <!--添加用户-->
    <insert id="addUser" parameterType="user">
        insert into user values(null,#{username},#{birthday},#{sex},#{address});
    </insert>
</mapper>

applicationContext2.xml 修改

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd">

    <!--1.spring加载外部数据源-->
    <context:property-placeholder location="classpath:db.properties"/>

    <!--2.配置数据源-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

    <!--配置工厂对象 SqlSEssionFactoryBean (整合包中的工厂对象)-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!--需要注入连接池对象-->
        <property name="dataSource" ref="dataSource"/>
        <!--加载SqlMapConfig.xml-->
        <property name="configLocation" value="classpath:SqlMapConfig.xml"/>
        <!--配置别名-->
        <property name="typeAliasesPackage" value="com.itheima.pojo"/>
    </bean>

    <!--扫描所有类,创建对象-->
    <context:component-scan base-package="com.itheima.dao"/>

    <!--
     配置事务
     -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!--配置增强-->
    <tx:advice id="txAdivce" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="add*" isolation="REPEATABLE_READ" propagation="REQUIRED" timeout="-1" read-only="false"/>
        </tx:attributes>
    </tx:advice>

    <aop:config>
        <aop:pointcut id="pointcutAdd" expression="execution(* com.itheima..add*(..))"/>
        <aop:advisor advice-ref="txAdivce" pointcut-ref="pointcutAdd"/>
    </aop:config>


    <!--
        如果使用Mapper动态代理如何做
        MapperScannerConfigurer  整合包中提供的一个扫描类
        需要配置basePackage , spring就会扫描该包
        1.加载该包下的映射文件  UserMapper.xml
        2.创建给包下的所有接口的代理对象
    -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.itheima.mapper"/>
    </bean>
</beans>

测试Dao

package com.itheima.mapper;

import com.itheima.pojo.User;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

import java.util.Date;
import java.util.List;

import static org.junit.Assert.*;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:applicationContext2.xml")
public class UserMapperTest {

    @Autowired
    private UserMapper mapper;

    @Test
    public void findUserById() {
        User user = mapper.findUserById(8);
        System.out.println(user);
    }

    @Test
    public void queryUserByName() {
        List<User> list = mapper.queryUserByName("丰");
        System.out.println(list);
    }

    @Test
    public void addUser() {
        User user = new User();
        user.setUsername("柯镇恶");
        user.setSex("1");
        user.setBirthday(new Date());
        user.setAddress("桃花岛");
        mapper.addUser(user);
    }
}

 

posted @ 2019-08-27 22:15  我の女王  阅读(287)  评论(0编辑  收藏  举报