记录MyBatis与Spring整合过程

将MyBatis的SqlSessionFactory、数据源、Mapper的创建过程交给Spring去进行管理。

PART_ONE:环境配置
1.MyBatis环境jar包
2.Spring环境jar包
3.MyBatis和Spring整合的jar包

image.png

4.项目文件结构

image.png


5.编写Spring的核心配置文件ApplicationContext.xml

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-3.2.xsd 
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc-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="classpath:db.properties" />

    <!-- 数据源,使用dbcp -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
        destroy-method="close">
        <property name="driverClass" value="${jdbc.driver}" />
        <property name="jdbcUrl" value="${jdbc.url}" />
        <property name="user" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
    </bean>
    
    <!-- sqlSessinFactory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 加载mybatis的配置文件 -->
        <property name="configLocation" value="mybatis/SqlMapConfig.xml" />
        <!-- 数据源 -->
        <property name="dataSource" ref="dataSource" />
    </bean>     
    
    <bean id="userDao" class="dao.UserDaoImpl">
        <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
    </bean>
    
    <!-- mapper配置 
    MapperFactoryBean:根据mapper接口生成代理对象
    -->
    <!-- <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
        <property name="mapperInterface" value="Mapper.UserMapper"></property>
        <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>
    </bean>  -->
    
    <!-- mapper批量扫描,从mapper包中扫描出mapper接口,自动创建代理对象并且在spring容器中注册 
    遵循规范:将mapper.java和mapper.xml映射文件名称保持一致,且在一个目录 中
    自动扫描出来的mapper的bean的id为mapper类名(首字母小写)
    -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <!-- 指定扫描的包名 
        如果扫描多个包,每个包中间使用半角逗号分隔
        -->
        <property name="basePackage" value="Mapper"/>
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
        
    </bean>         
</beans>

6.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>
                
    <!-- 加载 映射文件 -->
    <mappers>
        <!--配置单个xml文件-->
        <mapper resource="sqlmap/User.xml"/>
        <!--<mapper resource="mapperxml/UserMapper.xml"/>-->
        
        <!-- 配置mapper接口class的方式 -->
        <!--<mapper class="Mapper.UserMapper"/> -->
        
        <!-- 批量导入的方式 -->
        <package name="Mapper"/>
        
    </mappers>
    
</configuration>

PART_TWO:dao方式的实现

image.png

1.将dao实现类中的sqlSessionFactory交给Spring创建并且配置dao实现类的bean,使用时通过spring进行实例化。

2.UserDao.java

package dao;

import entiy.User;

public interface UserDao {
    
    public User selectUserById(int id);

}

3.UserDaoImpl.java

package dao;

import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.support.SqlSessionDaoSupport;

import entiy.User;

public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {
    
    @Override
    public User selectUserById(int id) {
        SqlSession sqlsession = this.getSqlSession();
        User user = sqlsession.selectOne("daomap.findUserById", id);
        return user;
    }
}

4.测试类

package test;

import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import dao.UserDao;
import entiy.User;

public class daoTest {
    
    @Test
    public void testDao() {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");
        UserDao userdao = (UserDao) applicationContext.getBean("userDao");
        User test = userdao.selectUserById(2);
        System.out.println(test);
    }

}

PART_THREE:Mapper方式的实现

image.png

1.Spring根据mapper接口生成代理

2.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">

<!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离 
注意:使用mapper代理方法开发,namespace有特殊重要的作用
-->

<mapper namespace="Mapper.UserMapper">

    <!-- 在 映射文件中配置很多sql语句 -->
        <!-- 需求:通过id查询用户表的记录 -->
        <!-- 通过 select执行数据库查询
        id:标识 映射文件中的 sql
        将sql语句封装到mappedStatement对象中,所以将id称为statement的id
        parameterType:指定输入 参数的类型,这里指定int型 
        #{}表示一个占位符号
        #{id}:其中的id表示接收输入 的参数,参数名称就是id,如果输入 参数是简单类型,#{}中的参数名可以任意,可以value或其它名称
        
        resultType:指定sql输出结果 的所映射的java对象类型,select指定resultType表示将单条记录映射成的java对象。
         -->
    <select id="findUserById" parameterType="int" resultType="entiy.User">
        select * from t_user where id =#{value}
    </select>
    
    <!--用户名模糊查询用户,${}表示拼接字符串,如果只需要传入简单类型,里面只能传value-->
    <select id="findUserByName" parameterType="String" resultType="entiy.User">
        select * from t_user where name like '%${value}%'
    </select>
    
    <!-- 添加用户,#{}中对应User中的变量 -->
    <insert id="addUser" parameterType="entiy.User">
        <!--查询刚插入的ID,只对sql的自增适用,id是保存在user中的意思-->
        <selectKey keyProperty="id" order="AFTER" resultType="String">SELECT LAST_INSERT_ID()</selectKey>
        
        <!--插入UUID-->
        <!--<selectKey keyProperty="id" order="BEFORE" resultType="String">SELECT UUID()</selectKey>-->
        insert into t_user (name,address) values (#{name},#{address})
    </insert>
    
    <!--删除用户-->
    <delete id="deleteUserById" parameterType="int">
        delete from t_user where id =#{id}
    </delete>
    
    <!-- 更新用户 -->
    <update id="updateUser" parameterType="entiy.User">
        update t_user set name=#{name},address=#{address} where id=#{id}
    </update>
    
    <!-- 用户综合查询 -->
    <select id="findUserList" parameterType="entiy.UserQueryVo" resultType="entiy.UserCustom">
        select * from t_user 
        <where>
            <if test="usercustom!=null">
                <if test="usercustom.address!=null and usercustom.address!=''">
                    and address = #{usercustom.address}
                </if>   
            </if>
        </where>
        
    </select>
    
    <!--自定义的resultMap-->
    <resultMap type="entiy.User" id="userResultMap">
        <id column="id_" property="id"/>
        <result column="name_" property="name"/>
    </resultMap>
    
    <!-- 字段查询 -->
    <select id="findUserResultMap" parameterType="int" resultMap="userResultMap" >
        select id id_,name name_ from t_user where id = #{id}
    </select>
</mapper>

3.UserMapper.java

package Mapper;

import java.util.List;

import entiy.User;
import entiy.UserCustom;
import entiy.UserQueryVo;

public interface UserMapper {
    
    public User findUserById(int id);
    
    public List<User> findUserByName(String name);
    
    public void addUser(User user);
    
    public void deleteUserById(int id);
    
    public List<UserCustom> findUserList(UserQueryVo userQueryVo);
    
    public List<User> findUserResultMap(int id);

}

4.测试类

package test;

import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import Mapper.UserMapper;
import entiy.User;

public class mapperTest {
    
    @Test
    public void testMap() {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");
        UserMapper userMapper = (UserMapper) applicationContext.getBean("userMapper");
        User test = userMapper.findUserById(3);
        System.out.println(test);
    }
}

注意:如果在applicationContext.xml中使用mapper的批量处理,遵循规范:将mapper.java和mapper.xml映射文件名称保持一致,且在一个目录中自动扫描出来的mapper的bean的id为mapper类名(首字母小写)。而且在SqlMapConfig.xml中不用配置UserMapper.xml如

image.png


欢迎大家进群

进群:可以领取免费的架构师学习资料。

进群:了解最新的学习动态

进群:了解最新的阿里,京东招聘资讯

进群:获取更多的面试资料

1、具有1-5工作经验的,面对目前流行的技术不知从何下手,需要突破技术瓶颈的可以加群。

2、在公司待久了,过得很安逸,但跳槽时面试碰壁。需要在短时间内进修、跳槽拿高薪的可以加群。

3、如果没有工作经验,但基础非常扎实,对java工作机制,常用设计思想,常用java开发框架掌握熟练的,可以加群。

4、觉得自己很牛B,一般需求都能搞定。但是所学的知识点没有系统化,很难在技术领域继续突破的可以加群。

5. 群号:835638062 点击链接加入群:https://jq.qq.com/?_wv=1027&k=5S3kL3v
6.阿里Java高级大牛直播讲解知识点,分享知识,上面五大专题都是各位老师多年工作经验的梳理和总结,带着大家全面、科学地建立自己的技术体系和技术认知!

猜你喜欢

转载自blog.csdn.net/Java1122zzz/article/details/82807631