Spring入门——day5

一 . 回忆 Mybatis

  1 . 导入相关 jar包:junit、mybatis、mysql、spring相关、aop织入

             mybatis-spring【新知识点】

<dependencies>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.28</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.2</version>
        </dependency>
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.16</version>
        </dependency>
        <!--spring操作数据库需要 spring-jdbc-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.3.16</version>
        </dependency>
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.7</version>
        </dependency>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.2</version>
        </dependency>
    </dependencies>

 

 

  2 . 流程:

      1 . 编写实体类 pojo

package com.ma.pojo;

import lombok.Data;

@Data
public class User {
    private int id;
    private String name;
    private String pwd;
}

      2 . 编写 mybatis 的核心配置文件 (连接数据库和注册mapper)

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

    <typeAliases>
        <package name="com.ma.pojo"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&amp;useUnicode=true&amp;characterEncoding=utf8"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

    <!--注册接口-->
    <mappers>
        <mapper class="com.ma.dao.UserMapper"/>
    </mappers>

</configuration>

 

      3 . 编写接口

package com.ma.dao;

import com.ma.pojo.User;

import java.util.List;

public interface UserMapper {
    public List<User> selectUser();
}

      4 . 编写接口对应的 Mapper.xml(要执行的查询语句)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.ma.dao.UserMapper">

    <select id="selectUser" resultType="user">
        select * from mybatis.user;
    </select>


</mapper>

      5 . 回 核心配置文件 注册接口

<!--注册接口-->
    <mappers>
        <mapper class="com.ma.dao.UserMapper"/>
    </mappers>

 

      5 . 测试

import com.ma.dao.UserMapper;
import com.ma.pojo.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;
//import org.apache.ibatis.io.Resources;

public class Mytest {
    @Test
    public void test() throws IOException {
        //工具类(把 mybatis-utils的代码移到了此处)
        /*使用mybatis必须使用 SqlSessionFactory 的对象,所以之前是用
        * utils包 下的 mybatis-utils 工具类
        * 获取实例化 SqlSessionFactory 的对象 来创建 sqlSession
        * 通过sqlSession.XXX 来使用 SQL语句*/
        String resources = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resources);
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sessionFactory.openSession(true);

        //获取接口
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        //调用接口中的方法
        List<User> users = mapper.selectUser();

        for (User user : users) {
            System.out.println(user);
        }

    }
}

 

 

二 . 整合mybatis(Mybatis-Spring)

  需要在Spring的配置文件中定义至少两个东西:SqlSessionFactory 和 至少一个数据映射器    

   

  方法一:SqlSessionTemplate

  1 . Spring来管理数据源

    将mybatis核心配置文件中 连接数据库的代码,写到了spring的配置文件中(applicationContext)

    

 

   2 . 以前我们是通过工具类或者右侧代码来 new一个sqlSessionFactory ,再通过sqlSessionFactory 来创建 sqlSession,来进行操作

    

       整合的话,就直接用 SqlSessionTemplate 代替 sqlSession,在 bean下注册并使用构造器注入到 sqlSessionFactory中

 

  3 . 把 Spring 整合Mybatis之后会比原来多出一个 接口的 实现类 UserMapperImpl

     因为 Spring接管了所有创建和调用对象的操作,无法注册接口只能注册实现类,所以便多了一个接口的实现类

     但是mybatis 的对象它无法自动创建,所以只能在实现类中手动写一个 set方法(相当于 Service层的操作)

    这个实现类的作用就是通过接口的对象来做原来 mybatis 做的事情

public class UserMapperImpl implements UserMapper {

    /*原来的所有操作都用sqlSession来执行,现在用 SqlSessionTemplate*/
    private SqlSessionTemplate sqlSession;

    public void setSqlSession(SqlSessionTemplate sqlSession) {
        this.sqlSession = sqlSession;
    }

    @Override
    public List<User> selectUser() {
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        return mapper.selectUser();
    }
}

 

   方法二:SqlSessionDaoSupport

       用于提供一个 SqlSession,调用 getSqlSession 方法 会得到一个 SqlSessionTemplate

       方法一是需要手动在 接口的实现类中 手动创建 SqlSessionTemplate的对象,然后手动写一个 set方法,

public class UserMapperImpl implements UserMapper {

    /*原来的所有操作都用sqlSession来执行,现在用 SqlSessionTemplate*/
    private SqlSessionTemplate sqlSession;

    public void setSqlSession(SqlSessionTemplate sqlSession) {
        this.sqlSession = sqlSession;
    }

    @Override
    public List<User> selectUser() {
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        return mapper.selectUser();
    }
}

       方法二直接通过 继承 SqlSessionDaoSupport类 就可以代替上面的操作了

public class UserMapperImpl2 extends SqlSessionDaoSupport implements UserMapper {
    @Override
    public List<User> selectUser() {
        SqlSession sqlSession = getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        return mapper.selectUser();
        //精简操作:return getSqlSession().getMapper(UserMapper.class).selectUser()
    }
}

      同时 spring-dao 中的如下代码也被省略

<!--SqlSessionTemplate:就是 sqlSession-->
    <bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate">
        <!--只能使用构造器来注入sqlSessionFactory,因为他没有set方法-->
        <constructor-arg index="0" ref="sqlSessionFactory"/>
    </bean>

      转为在 bean 中配置如下

   <bean id="userMapper2" class="com.ma.dao.UserMapperImpl2">
        <property name="sqlSessionFactory" ref="sqlSessionFactory"/>
    </bean>

 

     

  

 

posted @ 2022-03-21 14:07  TRUENO-86  阅读(27)  评论(0)    收藏  举报