Spring学习5:Spring+MyBatis整合,Dao层代理和Mapper动态代理

话不多说,开始整合框架Spring和框架MyBatis:

一、创建工程

二、引入依赖包

三、编写spring配置文件

四、编写Mybatis配置文件

五、编写Mapper及其他配置文件

六、编写Dao层

七、编写测试类

1.创建测试工程,并创建相关包和文件,如图所示:

在这里插入图片描述
mybatis包中存放mybatis的配置文件;
spring包中存放spring的配置文件;
sqlmap包中存放mapper的配置文件;
然后创建以下几个包:cn.com.dao、cn.com.mapper、cn.com.po、cn.com.test

2.引入依赖包:

引入以下依赖包:spring相关包、mybatis相关包、log4j测试包
在这里插入图片描述
首先我们使用Dao进行spring+mybatis进行合并,暂时不用mapper进行代理

3.编写spring配置文件:

  • applicationContext.xml文件内容:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns="http://www.springframework.org/schema/beans"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context-3.2.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
        http://www.springframework.org/schema/tx
        http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
        ">
    <!--配置数据源-->
    <context:property-placeholder location="db.properties"/>
    <!--数据源,使用DBCP-->
    <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-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
          >
        <!--Mybatis配置-->
        <property name="configLocation" value="mybatis/SqlMapConfig.xml"/>
        <!--数据源-->
        <property name="dataSource" ref="dataSource"/>
    </bean>
    
    <!--原始Dao接口-->
    <bean id="UserDao" class="cn.com.dao.UserDaoImp">
        <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
    </bean>
</beans>

4.编写MyBatis配置文件:

  • 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>
    <!--setting-->
    <settings>
        <!--打开延迟加载开关-->
        <setting name="lazyLoadingEnabled" value="true"/>
        <!--将积极加载改为消极加载-->
        <setting name="aggressiveLazyLoading" value="false"/>
        <!--打开二级缓存-->
        <setting name="cacheEnabled" value="true"/>
    </settings>

    <!--别名定义-->
    <typeAliases>
        <package name="cn.com.po"/>
    </typeAliases>

    <!--加载映射文件-->
    <mappers>
        <!--单次加载resource-->
        <mapper resource="sqlmap/UserMapper.xml"/>
        <!--&lt;!&ndash;批量加载mapper&ndash;&gt;-->
        <package name="cn.com.mapper"/>
    </mappers>
</configuration>

5.编写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 namespace="test">

    <!--查询-->
    <select id="findUserById" parameterType="int" resultType="cn.com.po.User">
       select * from user where id= #{id}
    </select>

    <select id="findUser" resultType="cn.com.po.User">
        select * from user
    </select>

    <select id="findUserByUsername" parameterType="java.lang.String"
            resultType="cn.com.po.User">
        select * from user where username like '%${value}%'
    </select>
    <!--插入-->
    <insert id="insertUser" parameterType="cn.com.po.User">
        <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
            SELECT  LAST_INSERT_ID()
        </selectKey>
        insert into user(username,password,gender,birthday,email,province,city)
        value (#{username},#{password},#{gender},#{birthday,jdbcType=DATE},#{email},#{province},#{city})
    </insert>
    <!--删除-->
    <delete id="deleteUser" parameterType="java.lang.Integer">
        delete from user where id=#{id}
    </delete>
    <!--修改-->
    <update id="updateUser" parameterType="cn.com.po.User">
        update user set username=#{username} where id=#{id}
    </update>

    <!--开启Mapper二级缓存-->
    <cache/>

</mapper>
  • db.properties文件内容:数据库相关配置文件
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybitas_test?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC&useSSL=false
jdbc.username=root
jdbc.password=123456
  • log4j.properties文件内容:
log4j.rootLogger = debug,stdout

log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
  • User.java文件内容:
package cn.com.po;

import java.io.Serializable;
import java.util.Date;

public class User implements Serializable {
    private int id;
    private String username;
    private String password;
    private String gender;
    private String email;
    private String province;
    private String city;
    private Date birthday;
    public User(){  }
    public User(int id, String username, String password, String gender, String email, String province, String city, Date birthday) {
        super();
        this.id = id;
        this.username = username;
        this.password = password;
        this.gender = gender;
        this.email = email;
        this.province = province;
        this.city = city;
        this.birthday = birthday;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getProvince() {
        return province;
    }

    public void setProvince(String province) {
        this.province = province;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
}
  • UserDao接口文件内容:
package cn.com.dao;

import cn.com.po.User;

public interface UserDao {
    public User findUserById(int id) throws Exception;
}

  • UserDaoImp.java文件内容:
package cn.com.dao;

import cn.com.po.User;
import org.apache.ibatis.session.SqlSession;
import org.mybatis.spring.support.SqlSessionDaoSupport;

public class UserDaoImp extends SqlSessionDaoSupport implements UserDao {
    @Override
    public User findUserById(int id) throws Exception {
        SqlSession sqlSession=this.getSqlSession();
        User user=sqlSession.selectOne("test.findUserById",id);
        return user;
    }
}
  • UserServiceTest测试文件:
package cn.com.test;

import cn.com.dao.UserDao;


import cn.com.mapper.UserQueryMapper;
import cn.com.po.User;
import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class UserServiceTest {
    private ApplicationContext applicationContext;
//在执行Test前 先执行该函数
    @Before
    public void setApplicationContext() throws Exception{
        applicationContext=
                new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");
    }

    //不使用Mapper代理
    @Test
    public void testFindUserById() throws Exception{
        UserDao userDao=(UserDao) applicationContext.getBean("UserDao");
        User user=userDao.findUserById(1);
        System.out.println(user.getUsername()+","+user.getPassword());

    }
}

一切配置完毕后,进行单元测试,正确的输出为:
在这里插入图片描述

6.使用mapper进行动态代理:

在这里插入图片描述
我们在使用非mapper动态代理的时候,使用了SqlMapConfig.xml批量加载mapper代理接口,但是Spring框架拥有自己的Mapper批量扫描器类,用于扫描Mapper代理接口。所以使用mapper进行动态代理的时候,我们无需再使用SqlMapConfig.xml进行批量加载mapper了。

mapper动态代理:

1.第一步:

在mapper包中新建:UserQueryMapper接口和UserQueryMapper.xml文件(注意:必须两个文件在一个包下,并且同名,我自己被坑了一下午 emmm)
文件内容如下:

package cn.com.mapper;

import cn.com.po.User;

public interface UserQueryMapper {
    public User findUserById(int id) throws Exception;
}

<?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="cn.com.mapper.UserQueryMapper">
    <select id="findUserById" parameterType="int" resultType="cn.com.po.User">
      select * from user where id=#{id}
    </select>
</mapper>

2.第二步:

在applicationContext.xml文件中添加以下内容:

<!--Mapper代理-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!--指定扫描包名,如果扫描多个包,包之间使用半角逗号隔开-->
        <property name="basePackage" value="cn.com.mapper"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>

    </bean>

3.第三步:编写测试类:

//使用Mapper代理
    @Test
    public void test_mapper_FindUserById() throws Exception{
        UserQueryMapper userQueryMapper=
                (UserQueryMapper) applicationContext.getBean("userQueryMapper");
        User user=userQueryMapper.findUserById(1);
        System.out.println(user.getUsername()+","+user.getPassword());
    }

得到结果和非动态代理相同,对于mapper动态代理,我们不需要自己再去实现接口函数,applicationContext.xml文件会自动找到该接口,会从mapper包中扫描出该接口,自动创建代理对象并且在spring容器中注入。

发布了65 篇原创文章 · 获赞 29 · 访问量 6492

猜你喜欢

转载自blog.csdn.net/qq_41617848/article/details/104415919