Spring教程03-Spring和MyBatis整合

2 篇文章 0 订阅

Spring-MyBatis整合

4.1 整合概述

  • 将 MyBatis 与 Spring 进行整合,主要解决的问题就是将 SqlSessionFactory 对象交由 Spring 来管理。所以,只需要将 SqlSessionFactory 的对象生成器 SqlSessionFactoryBean 注册在 Spring 容器中,再将其注入给 Dao 的实现类即可完成整合。

  • 使用技术:IOC

4.2 复习MyBatis步骤

mybatis使用步骤:

  1. 创建dao接口 StudentDao
  2. 定义mapper文件 StudentDao.xml
  3. 定义mybatis的主配置文件 mybatis.xml
  4. 创建dao的代理对象 StudentDao dao = SqlSession.getMapper(StudentDao.class)
  5. 测试 List students = dao.selectStudents()

4.3 MyBatis和Spring整合分析

要使用dao对象 需要使用getMapper()方法,如何使用getMapper()方法,需要哪些条件:

  1. 获取SqlSession对象,需要使用SqlSessionFactory的openSession()方法

  2. 创建SqlSessionFactory对象,通过读取mybatis的主配置文件,能创建SqlSessionFactory对象

​ 需要SqlSessionFactory对象,使用Factory能获取SqlSession, 有了SqlSession就能有dao,目的就是获取dao对象

​ Factory需要读取主配置文件

  1. 主配置文件包含:

    • 数据库信息
    <environments default="development">
      <environment id="development">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
          <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
          <property name="url" value="jdbc:mysql://localhost:3306/springdb"/>
          <property name="username" value="root"/>
          <property name="password" value="12345678"/>
        </dataSource>
      </environment>
    
    • mapper文件位置
    <mappers>
      <mapper resource="com/st/dao/StudentDao.xml"/>
    </mappers>
    
  2. 使用独立的连接池对象替换mybatis默认自带的,把连接池类也交给spring创建

通过以上的说明,我们需要让spring创建一下对象

  1. 独立的连接池对象,使用阿里云druid连接池
  2. SqlSessionFactory对象
  3. 创建dao对象

需要学习的就是以上三个对象的创建方法,使用xml的bean标签。

4.4 整合步骤

步骤:

  1. MySQL创建数据库,新建表
  2. 新建maven项目,加入依赖
    1. spring依赖
    2. mybatis依赖
    3. mysql驱动
    4. spring事务的依赖
    5. mybatis和spring集成的依赖:mybatis官方提供的,用来在spring创建mybatis的SqlSessionFactory,dao对象的
  3. 创建实体类
  4. 创建dao接口和mapper文件
  5. 创建mybatis主配置文件
  6. 创建Service的接口和实现类,属性是dao
  7. 创建spring的配置文件:声明mybatis的对象交给spring创建
    1. 数据源 DataSource
    2. SqlSessionFactory
    3. Dao对象
    4. 声明自定义的service
  8. 创建测试类,获取Service对象,通过service调用dao完成数据库的访问

4.4.1 MySQL新建表

image-20220624101835784

4.4.2 新建maven项目,加入依赖

  • 添加spring以外的依赖

    • Spring事务依赖

    • jdbc

    • mybatis

    • mybatis和spring集成的依赖:mybatis官方提供的,用来在spring创建mybatis的SqlSessionFactory,dao对象

    • 数据库驱动

    • druid连接池

<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-tx</artifactId>
  <version>5.3.20</version>
</dependency>
<dependency>
  <groupId>org.springframework</groupId>
  <artifactId>spring-jdbc</artifactId>
  <version>5.3.20</version>
</dependency>
<!--mybatis依赖-->
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>3.5.10</version>
</dependency>
<!--mybatis和spring集成的依赖-->
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis-spring</artifactId>
  <version>2.0.7</version>
</dependency>
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>8.0.29</version>
</dependency>
<!--阿里云数据库连接池-->
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>druid</artifactId>
  <version>1.2.11</version>
</dependency>
</dependencies>

<build>
  <resources>
    <resource> <directory>src/main/java</directory><!--所在的目录-->
      <includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
        <include>**/*.properties</include>
        <include>**/*.xml</include> </includes> <filtering>false</filtering>
    </resource>
  </resources>
</build>

4.4.3 创建实体类Student

@Data
@ToString
public class Student {
    private Integer id;
    private String name;
    private String email;
    private Integer age;

    public Student() {
    }

    public Student(Integer id, String name, String email, Integer age) {
        this.id = id;
        this.name = name;
        this.email = email;
        this.age = age;
    }
}

4.4.4 创建dao接口和mapper文件

​ 创建StudentDao接口:

public interface StudentDao {
    int insertStudent(Student student);
    List<Student> selectStudents();
}

​ 创建StudentDao对应的mapper文件:

<?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="com.st.dao.StudentDao">
    <insert id="insertStudent" >
        insert into student values (#{id}, #{name}, #{email}, #{age})
    </insert>

    <select id="selectStudents" resultType="com.st.domain.Student">
        select id, name, email, age from student order by id desc
    </select>
</mapper>

4.4.5 创建mybatis主配置文件

​ 不需要在配置文件中定义DataSource等,只需将mapper文件配置好即可,mybatis.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>
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>

    <mappers>
        <!--<mapper resource="com/st/dao/StudentDao.xml"/>-->
        <package name="com.st.dao"/>
    </mappers>
</configuration>

4.4.6 创建Service的接口和实现类,属性是dao

调用service --> 调用dao --> 实现持久化

​ StudentService接口:

public interface StudentService {
    int addStudent(Student student);
    List<Student> queryStudent();
}

​ 接口实现类,StudentServiceImpl:

public class StudentServiceImpl implements StudentService {
    private StudentDao studentDao;
  
    public void setStudentDao(StudentDao studentDao){
        this.studentDao = studentDao;
    }

    @Override
    public int addStudent(Student student) {
        int nums = studentDao.insertStudent(student);
        return nums;
    }

    @Override
    public List<Student> queryStudent() {
        List<Student> students = studentDao.selectStudents();
        return  students;
    }
}

4.4.7 创建spring的配置文件

创建spring的配置文件:声明mybatis的对象交给spring创建

  1. 数据源 DataSource,作用是连接数据库的
  2. SqlSessionFactoryBean,SqlSessionFactory获取
    • dataSource属性,set注入数据库连接池赋值给datasource
    • configLocation属性mybatis主配置文件的位置 ,configLocation是Resource类型,用来读取配置文件,它的赋值使用value指定文件的路径,使用classpath表示文件的位置
  3. MapperScannerConfigurer, 创建dao对象,使用SqlSession的getMapper,
    • sqlSessionFactoryBeanName属性,指定sqlSessionFactory的id
    • basePackage属性,指定包名,包名是dao接口所在的包名,MapperScannerConfigurer会扫描这个包中的所有接口,把每个接口都执行一次getMapper方法,得到每个接口的dao对象 ,创建好的dao对象放入到spring的容器中,名字是:接口名的首字母小写
  4. 声明自定义的service

​ applicatiaonContext.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
		
    <!--0. 外部配置文件 -->	
    <context:property-placeholder location="jdbc.properties"/>

    <!--1. 声明数据源-->
    <bean id="myDataSource" class="com.alibaba.druid.pool.DruidDataSource"
            init-method="init"  destroy-method="close">
        <!--set注入给DruidDataSource提供连接数据库信息-->
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>

    <!--2. 声明的是mybatis中提供的SqlSessionFactoryBean类,这个类内部创建SqlSessionFactory的-->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="myDataSource"/>
        <property name="configLocation" value="classpath:mybatis.xml"/>
    </bean>

    <!--3. 创建dao对象,使用SqlSession的getMapper-->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/> 
        <property name="basePackage" value="com.st.dao"/>
    </bean>

    <!--4. 声明service-->
    <bean id="studentService" class="com.st.Service.StudentServiceImpl">
        <property name="studentDao" ref="studentDao"/>
    </bean>
</beans>

4.4.8 创建测试类

​ 创建测试类,获取Service对象,通过service调用dao完成数据库的访问。MyTest代码:

public class MyTest {

    @Test
    public void test01(){
        String config = "applicationContext.xml";
        ApplicationContext ctx = new ClassPathXmlApplicationContext(config);
        String[] names = ctx.getBeanDefinitionNames();
        for(String na:names){
            System.out.println("容器中对象名称:" + na + "|" + ctx.getBean(na));
        }
    }

    @Test
    public void testServiceInsert(){
        String config = "applicationContext.xml";
        ApplicationContext ctx = new ClassPathXmlApplicationContext(config);
        StudentService service = (StudentService) ctx.getBean("studentService");
        Student student = new Student();
        student.setId(2003);
        student.setName("testService");
        student.setEmail("testService");
        student.setAge(25);
        //spring和mybatis整合在一起时,事务是自动提交的 不必手动提交事务SqlSession.commit()
        int nums = service.addStudent(student);
        System.out.println(nums);
    }

    @Test
    public void testServiceSelect(){
        String config = "applicationContext.xml";
        ApplicationContext ctx = new ClassPathXmlApplicationContext(config);
        StudentService service = (StudentService) ctx.getBean("studentService");
        List<Student> students = service.queryStudent();
        students.forEach(student -> System.out.println(student));
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

St_up

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值