• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

Spring系列(七)、Spring与MyBatis框架整合

互联网 diligentman 5小时前 2次浏览

7 搭建Spring与MyBatis的集成环境

要实现Spring与MyBatis的整合,很明显需要这两个框架各自的jar包,以及整合两个框架的中间包mybatis-spring.jar:

我们使用maven创建web项目spring-mybatis,只需要引入相关jar的依赖即可:
Spring系列(七)、Spring与MyBatis框架整合

  • 相关依赖文件:
    <!--druid连接池-->
        <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>druid</artifactId>
          <version>1.2.6</version>
        </dependency>
    
        <!--spring上下文-->
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-context</artifactId>
          <version>5.3.0</version>
        </dependency>
    
        <!--aspectJweaver-->
        <dependency>
          <groupId>org.aspectj</groupId>
          <artifactId>aspectjweaver</artifactId>
          <version>1.9.0</version>
          <scope>runtime</scope>
        </dependency>
    
    
    
        <!--spring-jdbc 此处的版本号尽量和spring上下文的版本号保持一致-->
        <dependency>
          <groupId>org.springframework</groupId>
          <artifactId>spring-jdbc</artifactId>
          <version>5.3.0</version>
        </dependency>
    
        <!--mybatis-->
        <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis</artifactId>
          <version>3.5.7</version>
        </dependency>
    
        <!--spring-mybatis-->
        <dependency>
          <groupId>org.mybatis</groupId>
          <artifactId>mybatis-spring</artifactId>
          <version>2.0.3</version>
        </dependency>
    
        <!--oracle-->
        <dependency>
          <groupId>com.oracle</groupId>
          <artifactId>ojdbc6</artifactId>
          <version>11.2.0.2.0</version>
          <scope>compile</scope>
        </dependency>
    
    
        <!--log4j日志文件-->
        <dependency>
          <groupId>log4j</groupId>
          <artifactId>log4j</artifactId>
          <version>1.2.17</version>
        </dependency>
        <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-api</artifactId>
          <version>1.7.21</version>
        </dependency>
        <dependency>
          <groupId>org.slf4j</groupId>
          <artifactId>slf4j-log4j12</artifactId>
          <version>1.7.21</version>
        </dependency>
    
        <!--javaee-api中含有mail邮件api-->
        <dependency>
          <groupId>javax</groupId>
          <artifactId>javaee-api</artifactId>
          <version>8.0</version>
        </dependency>
    
        <!--单元测试-->
        <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <version>4.11</version>
          <scope>test</scope>
        </dependency>
    

在spring-context上下文依赖中,就已经包含了spring常常用的核心标签依赖,eg:aop、beans、core、expression等。

我们虽然引入了spring-jdbc相关依赖,但是我们并不使用它来连接数据库,只是为了引入其依赖下的tx标签的依赖文件,我们使用alibaba为我们提供的druid连接池(德鲁斯)连接数据库,因为其功能强悍,而且可以配置许多连接参数,配置最大连接数和最大空闲等待数等。

7.1 编写database.properties配置文件

#数据库驱动
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
#数据库
jdbc.url=jdbc:oracle:thin:localhost:1521:orcl
#用户名
jdbc.username=ebuy
#密码
jdbc.password=123456
#别名方式,扩展插件,监控统计用的filter:stat,日志用的filter:log4j,防御sql注入的filter:wall
jdbc.filters=stat 
#最大连接数
jdbc.maxActive=300
#初始化连接数
jdbc.initialSize=2
#获取连接最大等待时间
jdbc.maxWait=60000
#最小连接数
jdbc.minIdle=1
#检测连接有效性的时间间隔
jdbc.timeBetweenEvictionRunsMillis=60000
#连接保持空闲而不被驱逐的最长时间
jdbc.minEvictableIdleTimeMillis=300000
#连接有效性,检测sql
jdbc.validationQuery=SELECT  * from dual
#定时检测空闲连接有效性
jdbc.testWhileIdle=true
#检测获取的连接的有效性
jdbc.testOnBorrow=false
#检测要归还的连接的有效性
jdbc.testOnReturn=false
#是否缓存preparedStatement,即PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。
jdbc.poolPreparedStatements=false
jdbc.maxPoolPreparedStatementPerConnectionSize=50

7.2 log4j.properties日志输出文件

log4j.rootLogger=DEBUG,CONSOLE
#log4j.rootLogger=ERROR,ROLLING_FILE
log4j.logger.com.dao=debug
log4j.logger.com.ibatis=debug 
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=debug 
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=debug 
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=debug 
log4j.logger.java.sql.Connection=debug 
log4j.logger.java.sql.Statement=debug 
log4j.logger.java.sql.PreparedStatement=debug 
log4j.logger.java.sql.ResultSet=debug 
######################################################################################
# Console Appender  u65e5u5fd7u5728u63a7u5236u8f93u51fau914du7f6e
######################################################################################
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=error
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[%p] %d %c - %m%n

7.3 mybatis-conf.xml配置文件(此文件中可以什么都不写,单纯为了以后mybatis扩展业务,也可以稍加配置常用机制)

<?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>

    <settings>
        <!--设置MyBatis控制台输出为log4j日志文件-->
        <setting name="logImpl" value="log4j"/>
        <!--开启二级缓存-->
        <setting name="cacheEnabled" value="true"/>
    </settings>

    <!--开启类名简写——别名-->
    <typeAliases>
        <package name="com.pojo"/>
    </typeAliases>

</configuration>

7.4 Spring的核心配置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:bean="http://www.springframework.org/schema/aop"
       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/aop https://www.springframework.org/schema/aop/spring-aop.xsd
       http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx-3.2.xsd">

    <!--加载连接Oracle数据库参数配置文件-->
    <context:property-placeholder location="database.properties"/>

    <!--配置数据库连接池(使用alibaba提供的druid连接池——德鲁斯)-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <!--此处我们不适用spring内部提供的jdbc连接数据库,所以jdbc.driverClassName不需要引入-->
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="filters" value="${jdbc.filters}"/>
        <property name="maxActive" value="${jdbc.maxActive}"/>
        <property name="initialSize" value="${jdbc.initialSize}"/>
        <property name="maxWait" value="${jdbc.maxWait}"/>
        <property name="minIdle" value="${jdbc.minIdle}"/>
        <property name="timeBetweenEvictionRunsMillis" value="${jdbc.timeBetweenEvictionRunsMillis}"/>
        <property name="minEvictableIdleTimeMillis" value="${jdbc.minEvictableIdleTimeMillis}"/>
        <property name="validationQuery" value="${jdbc.validationQuery}"/>
        <property name="testWhileIdle" value="${jdbc.testWhileIdle}"/>
        <property name="testOnBorrow" value="${jdbc.testOnBorrow}"/>
        <property name="testOnReturn" value="${jdbc.testOnReturn}"/>
        <property name="poolPreparedStatements" value="${jdbc.poolPreparedStatements}"/>
        <property name="maxPoolPreparedStatementPerConnectionSize"
                  value="${jdbc.maxPoolPreparedStatementPerConnectionSize}"/>
    </bean>

</beans>

7.5 创建com.pojo.SystemUser实体类

	package com.pojo;
	
	import java.io.Serializable;
	
	/**
	 * 用户实体
	 */
	public class SystemUser implements Serializable {
	
	    private String userinfo_uid;
	    private String userinfo_loginid;
	    private String userinfo_name;
	    private String userinfo_password;
	    private String userinfo_sex;
	    private String userinfo_email;
	    private String userinfo_mobile;
	    private int userinfo_status;
	
	    @Override
	    public String toString() {
	        return "SystemUser{" +
	                "userinfo_uid='" + userinfo_uid + ''' +
	                ", userinfo_loginid='" + userinfo_loginid + ''' +
	                ", userinfo_name='" + userinfo_name + ''' +
	                ", userinfo_password='" + userinfo_password + ''' +
	                ", userinfo_sex='" + userinfo_sex + ''' +
	                ", userinfo_email='" + userinfo_email + ''' +
	                ", userinfo_mobile='" + userinfo_mobile + ''' +
	                ", userinfo_status=" + userinfo_status +
	                '}';
	    }
	
	    public String getUserinfo_uid() {
	        return userinfo_uid;
	    }
	
	    public void setUserinfo_uid(String userinfo_uid) {
	        this.userinfo_uid = userinfo_uid;
	    }
	
	    public String getUserinfo_loginid() {
	        return userinfo_loginid;
	    }
	
	    public void setUserinfo_loginid(String userinfo_loginid) {
	        this.userinfo_loginid = userinfo_loginid;
	    }
	
	    public String getUserinfo_name() {
	        return userinfo_name;
	    }
	
	    public void setUserinfo_name(String userinfo_name) {
	        this.userinfo_name = userinfo_name;
	    }
	
	    public String getUserinfo_password() {
	        return userinfo_password;
	    }
	
	    public void setUserinfo_password(String userinfo_password) {
	        this.userinfo_password = userinfo_password;
	    }
	
	    public String getUserinfo_sex() {
	        return userinfo_sex;
	    }
	
	    public void setUserinfo_sex(String userinfo_sex) {
	        this.userinfo_sex = userinfo_sex;
	    }
	
	    public String getUserinfo_email() {
	        return userinfo_email;
	    }
	
	    public void setUserinfo_email(String userinfo_email) {
	        this.userinfo_email = userinfo_email;
	    }
	
	    public String getUserinfo_mobile() {
	        return userinfo_mobile;
	    }
	
	    public void setUserinfo_mobile(String userinfo_mobile) {
	        this.userinfo_mobile = userinfo_mobile;
	    }
	
	    public int getUserinfo_status() {
	        return userinfo_status;
	    }
	
	    public void setUserinfo_status(int userinfo_status) {
	        this.userinfo_status = userinfo_status;
	    }
	}

7.6 创建com.dao.SystemUserMapper映射接口类,并创建登陆和注册用户方法

package com.dao;

import com.pojo.SystemUser;

/**
 * @author 一宿君(CSDN : qq_52596258)
 * @date 2021-07-08 10:25:52
 * 用户数据访问接口
 */
public interface SystemUserMapper {

    /**
     * 根据登录id和密码
     * @param systemUser
     * @return
     */
    SystemUser login(SystemUser systemUser);

    /**
     * 用户注册
     * @param systemUser
     * @return
     */
    int save(Syste8 mUser systemUser);
}

7.7 创建com.dao.SystemUserMapper.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">

<!--namespace是命名空间,要与对应的接口的路径保持一致(如果没有创建该接口,MyBatis在内部编译时会自动创建)-->
<mapper namespace="com.dao.SystemUserMapper">
    <!--开启字段自动映射-->
    <resultMap id="userMap" type="com.pojo.SystemUser" autoMapping="true">
        <!--<result property="userinfo_uid" column="userinfo_uid"/>
        <result property="userinfo_loginid" column="userinfo_loginid"/>
        <result property="userinfo_name" column="userinfo_name"/>
        <result property="userinfo_password" column="userinfo_password"/>
        <result property="userinfo_sex" column="userinfo_sex"/>
        <result property="userinfo_email" column="userinfo_email"/>
        <result property="userinfo_mobile" column="userinfo_mobile"/>
        <result property="userinfo_status" column="userinfo_status"/>-->
    </resultMap>

    <!--关联查询表system_userinfo和表system_role,查询结果是多对一,也就是多个用户对应一个角色-->
    <select id="login" parameterType="com.pojo.SystemUser" resultMap="userMap">
        select * from system_userinfo where userinfo_loginid = #{userinfo_loginid} and userinfo_password = #{userinfo_password}
    </select>

    <!--用户注册-->
    <insert id="save" parameterType="com.pojo.SystemUser">
        <selectKey keyProperty="userinfo_uid" resultType="String" order="BEFORE">
            select seq_user_id.nextval from dual
        </selectKey>
        insert into system_userinfo(userinfo_uid,userinfo_loginid,userinfo_name,userinfo_password,
        userinfo_sex,userinfo_email,userinfo_mobile,userinfo_status)
        values(seq_user_id.nextval,#{userinfo_loginid},#{userinfo_name},#{userinfo_password},#{userinfo_sex},#{userinfo_email},#{userinfo_mobile},#{userinfo_status})
    </insert>

</mapper>

7.8 创建com.service.SystemUserServiceMapper接口

package com.service;

import com.pojo.SystemUser;

/**
 * @author 一宿君(CSDN : qq_52596258)
 * @date 2021-07-08 10:25:52
 * 用户业务逻辑接口
 */
public interface SystemUserServiceMapper {

    /**
     * 根据登录id和密码
     * @param systemUser
     * @return
     */
    SystemUser login(SystemUser systemUser);

    /**
     * 用户注册
     * @param systemUser
     * @return
     */
    int save(SystemUser systemUser);
}

7.9 创建com.service.SystemUserServiceImpl实现类

package com.service.impl;

import com.dao.SystemUserMapper;
import com.pojo.SystemUser;
import com.service.SystemUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * @author 一宿君(CSDN : qq_52596258)
 * @date 2021-07-08 10:28:46
 * 用户业务逻辑接口实现类
 */
@Service("systemUserServiceImpl")
public class SystemUserServiceImpl implements SystemUserService {

    //在此处mybatis内部机制在执行过程中会默认帮我们创建一个实现类,
    // 所以自动装配即可识别这个实现类
    @Autowired
    SystemUserMapper systemUserMapper;

    @Override
    public SystemUser login(SystemUser systemUser) {
        return systemUserMapper.login(systemUser);
    }

    @Override
    public int save(SystemUser systemUser) {
        return systemUserMapper.save(systemUser);
    }
}

7.10 mybatis将数据库控制权交给spring管理,需要在Spring配置文件applicationContext.xml中,定义一些类:

  • SqlSessionFactoryBean:

    为整合应用提供SqlSession对象资源

  • SqlSessionTemplate:

    负责管理MyBatis的SqlSession,调用SQL映射语句,实现对数据库的访问

  • MapperFactoryBean:

    根据指定Mapper接口生成Bean实例

    • mapperInterface:用于指定接口;
    • SqlSessionFactory:用于指定SqlSessionFactory;
    • SqlSessionTemplate:用于指定SqlSessionTemplate。如果与SqlSessionFactory同时设定,则只会启用SqSessionTemplate。
  • MapperBeanScannerConfigurer:

    根据指定包批量扫描Mapper接口并生成实例

    • basePackage:指定映射接口文件所在的包路径,当需要扫描多个包时,可以使用分号或逗号作为分隔符。指定包路径后,会扫描该包及其包中的所有文件。
    • annotationClass:指定了要扫描的注解名,只有被注解标识的类才会被配置为映射器;
    • sqlSessionFactoryBeanName:指定在Spring中定义的SqlSessionFactory的Bean名称;
    • sqlSessionTemplateBeanName:指定在Spring中定义的SqlSessionTemplate的Bean名称。如果定义此属性,则sqlSeBeanssionFactoryBeanName将不起作用;
    • markerInterface:指定创建映射器的接口。
      <!--使用mybatis操作数据库,首先要解析xml文件,
        然后要根据sqlSessionFactoryBean工厂创建sqlSessionFactory,
        最后由sqlSessionFactory创建sqlSession来操作数据库-->
    
        <!--在spring中,mybatis将操作数据库的控制权全权交给了spring管理-->
        <!--配置sqlSessionFactory工厂-->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <!--加载数据源-->
            <property name="dataSource" ref="dataSource"/>
            <!--读取mybatis的配置文件(此处是为了以后使用mybatis扩展业务,此文件中可以什么都不做)-->
            <property name="configLocation" value="mybatis-conf.xml"/>
        </bean>
    
    	<!--通过映射工厂创建接口Bean实例-->
        <!--<bean id="accountService" class="org.mybatis.spring.mapper.MapperFactoryBean">
            <property name="mapperInterface" value="com.service.AccountService"/>
            <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
        </bean>-->
    
        <!--指定Spring到哪个包下扫描MyBatis操作数据库的映射文件-->
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <property name="basePackage" value="com.dao"/>
        </bean>
    
        <!--开启注解扫描——指定Spring到哪个包下扫描业务逻辑注解组件类-->
        <context:component-scan base-package="com.service"/>
    

    Spring系列(七)、Spring与MyBatis框架整合

7.11 数据库SystemUserinfo表中数据

Spring系列(七)、Spring与MyBatis框架整合

7.12 编写测试类TestSpring_MyBatis

package com.test;

import com.pojo.SystemUser;
import com.service.SystemUserService;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * @author 一宿君(CSDN : qq_52596258)
 * @date 2021-07-19 20:17:37
 */
public class TestSpring_MyBatis {
    public static void main(String[] args) {

        ApplicationContext ap = new ClassPathXmlApplicationContext("applicationContext.xml");
        SystemUserService systemUserService = (SystemUserService)ap.getBean("systemUserServiceMapperImpl");

        /**
         * 测试登录
         */
        SystemUser systemUser = new SystemUser();
        systemUser.setUserinfo_loginid("root");
        systemUser.setUserinfo_password("123456");
        SystemUser systemUser1 = systemUserService.login(systemUser);
        if(systemUser1 != null){
            System.out.println("登录成功!");
        }else {
            System.out.println("登录失败!");
        }

        /**
         * 测试保存用户
         */
        SystemUser systemUser2 = new SystemUser();
        systemUser2.setUserinfo_loginid("egz");
        systemUser2.setUserinfo_name("二狗子");
        systemUser2.setUserinfo_password("123456");
        systemUser2.setUserinfo_email("123@163.com");
        systemUser2.setUserinfo_mobile("123456789");
        systemUser2.setUserinfo_sex("男");
        systemUser2.setUserinfo_status(0);

        int r = systemUserService.save(systemUser2);
        if(r>0){
            System.out.println(systemUser2.getUserinfo_name() + ":用户保存成功!");
        }else {
            System.out.println("用户保存失败!");
        }
    }
}
  • 控制台执行结果:
    Spring系列(七)、Spring与MyBatis框架整合
    Spring系列(七)、Spring与MyBatis框架整合

至此spring与mybatis整合就完成了,妥了!!!

7.13 总结

Spring系列(七)、Spring与MyBatis框架整合


程序员灯塔
转载请注明原文链接:Spring系列(七)、Spring与MyBatis框架整合
喜欢 (0)