• MyBatis与Spring的整合


    在确保可运行项目能够正确无误地运行之后,再严格照着教程的步骤,对代码模仿一遍。模仿过程难免代码有出入,导致无法得到期望的运行结果,此时此刻通过比较正确答案 ( 可运行项目 ) 和自己的代码,来定位问题所在。采用这种方式,学习有效果,排错有效率,可以较为明显地提升学习速度,跨过学习路上的各个槛。

    基于框架的程序要成功运行,对于JAR包的版本,配置文件的正确性有着苛刻的要求,任何一个地方出错了,都会导致框架程序运行失败。 请务必严格按照教程的指导,完全模仿操作,直到成功看到运行效果。 第一次成功之后,信心,思路都会有较好的铺垫,然后再根据自己的疑惑,在“成功”的代码上做原本想做的改动和调整,这样可以大大节约学习的时间,提高效率,切勿一来就擅自改动,给自己的学习制造障碍!!!
    链接:https://pan.baidu.com/s/1AeRffxjm3wU6kegtrJxIGA?pwd=5w5g
    提取码:5w5g

     数据库内容:

    1. create database db_mybatis;
    2. use db_mybatis;
    3. create table t_user(
    4. id int(32) primary key auto_increment ,
    5. username varchar(30) ,
    6. jobs varchar(30) ,
    7. phone varchar(16)
    8. );
    9. insert into t_user values(1,'zyy','teacher','18865123456');
    10. insert into t_user values(2,'wrr','student','18865124567');
    11. insert into t_user values(3,'xxc','student','18869872126');

    一.整合环境搭建

     1.准备所需要的jar包

    (1).所需Spring框架的jar包

     (2).所需MyBatis框架的jar包

     (3).MyBatis与Spring整合所需的中间jar包

     (4).数据库驱动jar包

     (5).数据源所需jar包

     2.编写配置文件

     (1).db.properties

    1. jdbc.driver=com.mysql.cj.jdbc.Driver
    2. jdbc.url=jdbc:mysql://127.0.0.1:3306/db_mybatis
    3. jdbc.username=root
    4. jdbc.password=root
    5. jdbc.maxTotal=30
    6. jdbc.maxIdle=10
    7. jdbc.initialSize=5

     除了配置连接数据库的4个基本项外,还配置数据库连接池的最大连接数(maxTotal),最大空闲连接数(maxIdle)以及初始化连接数(initialSize)。

    (2).applicationContext.xml

    1. <beans xmlns="http://www.springframework.org/schema/beans"
    2. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xmlns:aop="http://www.springframework.org/schema/aop"
    4. xmlns:tx="http://www.springframework.org/schema/tx"
    5. xmlns:jdbc="http://www.springframework.org/schema/jdbc"
    6. xmlns:context="http://www.springframework.org/schema/context"
    7. xmlns:mvc="http://www.springframework.org/schema/mvc"
    8. xsi:schemaLocation="
    9. http://www.springframework.org/schema/context
    10. http://www.springframework.org/schema/context/spring-context-3.0.xsd
    11. http://www.springframework.org/schema/beans
    12. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    13. http://www.springframework.org/schema/jdbc
    14. http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd
    15. http://www.springframework.org/schema/tx
    16. http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
    17. http://www.springframework.org/schema/aop
    18. http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
    19. http://www.springframework.org/schema/mvc
    20. http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    21. <context:property-placeholder location="classpath:db.properties"/>
    22. <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    23. <property name="driverClassName" value="${jdbc.driver}" />
    24. <property name="url" value="${jdbc.url}"/>
    25. <property name="username" value="${jdbc.username}"/>
    26. <property name="password" value="${jdbc.password}"/>
    27. <property name="maxTotal" value="${jdbc.maxTotal}"/>
    28. <property name="maxIdle" value="${jdbc.maxIdle}"/>
    29. <property name="initialSize" value="jdbc.initalSize"/>
    30. bean>
    31. <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    32. <property name="dataSource" ref="dataSource"/>
    33. bean>
    34. <tx:annotation-driven transaction-manager="transactionManager"/>
    35. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    36. <property name="dataSource" ref="dataSource"/>
    37. <property name="configLocation" value="classpath:mybatis-config.xml"/>
    38. bean>
    39. beans>

    (3).mybatis-config.xml

    1. configuration
    2. PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    3. "http://mybatis.org/dtd/mybatis-3-config.dtd">
    4. <configuration>
    5. <typeAliases>
    6. <package name="po"/>
    7. typeAliases>
    8. <mappers>
    9. mappers>
    10. configuration>

    二.整合

    1.传统DAO方式的开发整合

    采用传统DAO开发方式进行MyBatisSpring框架的整合时,我们需要编写DAO接口以及接口的实现类,并且需要向DAO实现类中注入SqlSessionFactory,然后在方法体内通过 SqlSessionFactory创建SqlSession

    SqlSessionTemplate:mybatis-spring的核心类,它负责管理MyBatis的SqlSession,调用MyBatis的SQL方法。当调用SQL方法时,SqlSessionTemplate将会保证使用的SqlSession和当前Spring的事务是相关的,他还管理SqlSession的生命周期,包含必要的管理,提交和回滚操作。

    SqlSessionDaoSupport:一个抽象支持类,他继承DaoSupport类,主要是作为Dao的基类来使用,可以通过SqlSessiondaoSupport类的getSqlSession()方法来获取所需的SqlSession。

    (1).在src目录下创建一个包命名为po,并在包下创建User类

    1. package po;
    2. public class User {
    3. private Integer id;
    4. private String username;
    5. private String jobs;
    6. private String phone;
    7. public Integer getId() {
    8. return id;
    9. }
    10. public void setId(Integer id) {
    11. this.id = id;
    12. }
    13. public String getUsername() {
    14. return username;
    15. }
    16. public void setUsername(String username) {
    17. this.username = username;
    18. }
    19. public String getJobs() {
    20. return jobs;
    21. }
    22. public void setJobs(String jobs) {
    23. this.jobs = jobs;
    24. }
    25. public String getPhone() {
    26. return phone;
    27. }
    28. public void setPhone(String phone) {
    29. this.phone = phone;
    30. }
    31. public String toString() {
    32. return "User [id=" + id + ", username=" + username + ", jobs=" + jobs + ", phone=" + phone + "]";
    33. }
    34. }

    (2).在po包下创建映射文件UserMapper.xml

    1. mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    2. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    3. <mapper namespace="po.UserMapper">
    4. <select id="findUserById" parameterType="Integer" resultType="User">
    5. select * from t_user where id=#{id}
    6. select>
    7. mapper>

    (3).在mybatis-config.xml中配置映射文件UserMapper.xml的位置

    <mapper resource="po/UserMapper.xml"/>

    (4).在src目录下创建一个包命名为dao,在包内创建UserDao接口,在接口内编写一个通过id查询用户的的方法findUserById()。

    1. package dao;
    2. import po.User;
    3. public interface UserDao {
    4. public User findUserById(Integer id) ;
    5. }

    (5).在src目录下创建一个包命名为impl,在包内创建UserDaoImpl类,在类中实现方法findUserById()。

    1. package impl;
    2. import dao.UserDao;
    3. import po.User;
    4. import org.mybatis.spring.support.SqlSessionDaoSupport;
    5. public class UserDaoImpl extends SqlSessionDaoSupport implements UserDao {
    6. public User findUserById(Integer id) {
    7. return this.getSqlSession().selectOne("po.UserMapper.findUserById", id);
    8. }
    9. }

    (6).在applicationContext.xml中编写实例化UserDaoImpl的配置

    1. <bean id="userDao" class="impl.UserDao.Impl">
    2. <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
    3. bean>

    (7).在src目录下创建包命名为test,在包内创建UserDaoTest01,并在类中编写测试方式.

    1. package test;
    2. import org.springframework.context.ApplicationContext;
    3. import org.springframework.context.support.ClassPathXmlApplicationContext;
    4. import dao.UserDao;
    5. import mapper.UserMapper;
    6. import po.User;
    7. public class UserDaoTest01 {
    8. public static void main(String[] args) {
    9. ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
    10. UserDao userDao=(UserDao)applicationContext.getBean("userDao");
    11. //UserDao userDao=applicationContext.getBean(UserDao.class);
    12. User user=userDao.findUserById(1);
    13. System.out.println(user);
    14. }
    15. }

     运行结果:

    2.Mapper接口方式的开发整合

    在MyBatis-Spring项目中,虽然使用传统的Dao开发方式可以实现所需功能,但是采用这种方式在实现类中会出现大量的重复的代码,在方法中也需要指定映射文件中执行语句的id,并且不能保证编写时id的正确性。为此,我们可以使用MyBatis提供的另一种编程方式,即使用Mapper接口编程。

    (1).在src目录下创建一个包命名为mapper,在包内创建UserMapper接口以及对应的映射文件UserMapper.xml。

    1. package mapper;
    2. import po.User;
    3. public interface UserMapper {
    4. public User findUserById(Integer id);
    5. }
    1. mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    2. "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    3. <mapper namespace="mapper.UserMapper">
    4. <select id="findUserById" parameterType="Integer" resultType="User">
    5. select * from t_user where id=#{id}
    6. select>
    7. mapper>

    (2).在mybatis的配置文件中引入相应的映射文件

    <mapper resource="po/UserMapper.xml" />

    (3).在applicationContext.xml中设置相应的Bean

    1. <bean id="userMapper2" class="org.mybatis.spring.mapper.MapperFactoryBean">
    2. <property name="mapperInterface" value="mapper.UserMapper" />
    3. <property name="sqlSessionFactory" ref="sqlSessionFactory" />
    4. bean>

    (4).在test包下创建测试类UserDaoTest02

    1. package test;
    2. import org.springframework.context.ApplicationContext;
    3. import org.springframework.context.support.ClassPathXmlApplicationContext;
    4. import mapper.UserMapper;
    5. public class UserDaoTest02 {
    6. public static void main(String[] args) {
    7. ApplicationContext applicationContext=new ClassPathXmlApplicationContext("applicationContext.xml");
    8. UserMapper userMapper=(UserMapper)applicationContext.getBean("userMapper2");
    9. po.User user= userMapper.findUserById(1);
    10. System.out.println(user);
    11. }
    12. }

     (5).基于MapperScannerConfigurer的整合

    在实际项目中,Dao层会包含很多接口,如果每一个接口都要在Spring配置文件中配置,那么不仅会增加工作量,还会使得Spring配置文件很臃肿。为此,mybatis-spring团队提供了一种自动扫描的形式来配置MyBatis中的映射器——采用MapperScannerConfigurer类。MapperScannerConfigurer类的使用很简单,只需要在Spring中做以下配置:

    1. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    2. <property name="basePackage" value="mapper" />
    3. bean>

     在通常情况下,MapperScannerConfigurer类在使用时只需要通过basePackage属性指定需要扫描的包即可。spring会自动地通过包中接口生成映射器。这使得开发人员可以在编写很少代码的情况下完成对映射器的配置,从而提高开发效率。

  • 相关阅读:
    图像梯度(opencv-c++)
    【业务功能篇106】 微服务-springcloud-springboot-电商订单模块--秒杀服务-定时任务【下篇】
    35. 搜索插入位置、Leetcode的Python实现
    大话STL第一期——初识相见恨晚
    python 正则表达式
    uni-app:通过ECharts实现数据可视化-如何引入项目
    安卓学习中遇到的问题【bug】
    canvas画图时的bug记录
    自动化监控系统Prometheus&Grafana
    Tomcat 源码分析 (整体架构) (一)
  • 原文地址:https://blog.csdn.net/weixin_52473454/article/details/126071321