Spring整合Mybatis:dao层

Spring整合Mybatis

步骤:

  1. 导入相关jar包(Maven依赖)
    1. junit
    2. mybatis
    3. mysql数据库
    4. spring相关的
    5. spring-jdbc(连接Spring操作数据库的话,还需要一个Spring-jdbc)
    6. aop织入
    7. mybatis-spring【new】
  2. 编写配置文件
  3. 测试

Maven依赖

xml 复制代码
<dependencies>
    <!--Mysql数据库-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.47</version>
    </dependency>

    <!--Mybatis-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis</artifactId>
        <version>3.5.2</version>
    </dependency>

    <!--Spring相关的-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-webmvc</artifactId>
        <version>5.2.0.RELEASE</version>
    </dependency>

    <!--Spring-jdbc-->
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-jdbc</artifactId>
        <version>5.1.9.RELEASE</version>
    </dependency>

    <!--aop织入-->
    <dependency>
        <groupId>org.aspectj</groupId>
        <artifactId>aspectjweaver</artifactId>
        <version>1.9.4</version>
    </dependency>

    <!--mybatis-spring-->
    <dependency>
        <groupId>org.mybatis</groupId>
        <artifactId>mybatis-spring</artifactId>
        <version>2.1.2</version>
    </dependency>

    <!--lobok-->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.16.10</version>
    </dependency>
</dependencies>

参考文档:

plain 复制代码
https://mybatis.org/spring/zh_CN/index.html

回忆Mybatis

  1. 编写实体类
  2. 编写核心配置文件
  3. 编写接口
  4. 编写Mapper.xml
  5. 编写Mybatis工具类
  6. 测试

实体类

java 复制代码
import lombok.Data;

//@Data //提供该类上所有的属性getter/setter方法,还提供了构造函数,toString(),equals(),hashCode()方法
public class User {
    private int id;
    private String name;
    private String pwd;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    // 查询全部用户的数据,靠toStirng()方法
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }
}

核心配置文件

xml 复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<!--configuration核心配置文件-->
<configuration>
    <properties resource="config.properties"/>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="UserMapper.xml"/>
    </mappers>
</configuration>

config.properties

properties 复制代码
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username=root
password=123456

接口

java 复制代码
public interface UserMapper {
    List<User> selectUser();
}

Mapper.xml

xml 复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--namespcae=绑定一个对应的Dao/Mapper接口-->
<mapper namespace="com.cike10.mapper.UserMapper">
    <select id="selectUser" resultType="com.cike10.pojo.User">
        select * from mybatis.user;
    </select>

</mapper>

工具类

java 复制代码
public class MybatisUtils {
    private static SqlSessionFactory sqlSessionFactory;
    static {
        // 获取sqlSessionFacttory对象
        String resource= "mybatis-config.xml";
        try {
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

    }

    // 获取SqlSession 实例
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }
}

测试类

java 复制代码
public class cike10_test {
    @Test
    public void test(){
        SqlSession sqlSession = new MybatisUtils().getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        List<User> users = mapper.selectUser();
        for (User user : users) {
            System.out.println(user);
        }
        sqlSession.close();
    }
}

Mybatis-Spring

什么是Mybatis-Spring

MyBatis-Spring 会帮助你将 MyBatis 代码无缝地整合到 Spring 中。它将允许 MyBatis 参与到 Spring 的事务管理之中,创建映射器 mapper 和 <font style="color:rgb(221, 17, 68);background-color:rgb(247, 247, 249);">SqlSession</font> 并注入到 bean 中,以及将 Mybatis 的异常转换为 Spring 的 <font style="color:rgb(221, 17, 68);background-color:rgb(247, 247, 249);">DataAccessException</font>。 最终,可以做到应用代码不依赖于 MyBatis,Spring 或 MyBatis-Spring。

方式一

  1. 建一个数据库、表、列、内容
  2. 编写实体类JavaBean:对应数据库的字段
  3. 编写Dao层接口 UserMapper
  4. 编写绑定Dao层接口的UserMapper.xml配置文件
  5. 编写Dao层实现类 UserMaapperImpl
  6. 编写spring配置文件:spring-dao.xml(Spring整合mybatis)
    1. 配置数据源(使用Spring提供的JDBC、drivername、用户名、密码)
    2. 创建sqlSessionFactory和Sqlsession,并且绑定UserMapper.xml配置文件
    3. 使用SqlSessionTemplate,也就是使用SqlSession
    4. Dao层实现类,注入 sqlSession属性
  7. 可选(spring配置文件导入)
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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
		https://www.springframework.org/schema/beans/spring-beans.xsd">


    <import resource="spring-dao.xml"/>
<!--    <import resource="spring-mvc.xml"/>-->



</beans>
  1. 测试

User类 JavaBean

java 复制代码
public class User {
    private int id;
    private String name;
    private String pwd;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", pwd='" + pwd + '\'' +
                '}';
    }
}

UserMapper接口

java 复制代码
public interface UserMapper {
    List<User> selectUser();
}

UserMapper.xml

xml 复制代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">

<!--namespcae=绑定一个对应的Dao/Mapper接口-->
<mapper namespace="com.cike10.mapper.UserMapper">
    <select id="selectUser" resultType="com.cike10.pojo.User">
        select * from mybatis.user;
    </select>

</mapper>

UserMapper实现类 SqlSession.getMapper()的操作

java 复制代码
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);
        List<User> users = mapper.getByUserList();
//        for (User user : users) {
//            System.out.println(user);
//        }
        return users;
    }
}

spring-dao.xml

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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
		https://www.springframework.org/schema/beans/spring-beans.xsd">


    <!--DataSource:使用Spring的数据源替换Mybatis的配置 c3p0 dbcp druid
    我们这里使用Spirng提供的JDBC org.springframework.jdbc.datasource
    spring管理数据源了
    -->

    <bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
    </bean>

    <!--sqlSessionFactory
    Sqlsession的创建
    -->

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref="datasource" />
        <!--绑定Mybatis配置文件(可选)-->
<!--        <property name="configLocation" value="classpath:mybatis-config.xml"/>-->
        <property name="mapperLocations" value="classpath:UserMapper.xml"/>
    </bean>

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

    <bean id="userMapper" class="com.cike10.mapper.UserMapperImpl">
        <property name="sqlSession" ref="sqlSession"/>
    </bean>


</beans>

可以发现这里的class其实指的是Maven依赖中路径对应的

测试类

java 复制代码
@Test
public void test(){
    ApplicationContext context = new ClassPathXmlApplicationContext("spring-dao.xml");
    UserMapperImpl userMapperImpl = context.getBean("userMapperImpl", UserMapperImpl.class);
    List<User> UserList = userMapperImpl.getByUserList();
    for (User user : UserList) {
        System.out.println(user);
    }

参考文档:

plain 复制代码
https://mybatis.org/spring/zh_CN/sqlsession.html

方式二(简化写法-SqlSessionDaoSupport)

原理

在 SqlSessionDaoSupport抽象类中,存在可以直接调用SqlSession

可以看到这里返回的就是SqlSessionTemplate类

java 复制代码
  public SqlSession getSqlSession() {
    return this.sqlSessionTemplate; // 
  }

不用去注册SqlSessionTemplate类的bean id了

xml 复制代码
    <!--使用SqlSession-->
    <bean id="SqlSession" class="org.mybatis.spring.SqlSessionTemplate ">
        <constructor-arg index="0" ref="SqlSessionFactory"/>
    </bean>
实现代码

UserMapper实现类(操作SqlSession.getMapper().xx方法())

java 复制代码
public class UserMapperImp2 extends SqlSessionDaoSupport implements UserMapper {

    @Override
    public List<User> getByUserList() {
//        SqlSession sqlSession = getSqlSession();
//        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//        return mapper.getByUserList();
//      相当于下面这行代码;
        return getSqlSession().getMapper(UserMapper.class).getByUserList();
    }
}

配置Spring容器元数据:Spring-dao.xml

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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
		https://www.springframework.org/schema/beans/spring-beans.xsd">

        <!--配置数据源-->
    <bean id="datasource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
        <property name="schema" value="mybatis"/>
    </bean>

    <!--创建SqlSessionFactory-->
    <bean id="SqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="datasource"/>
        <property name="mapperLocations" value="classpath:UserMapper.xml"/>
    </bean>

    <!--使用SqlSession-->
<!--    <bean id="SqlSession" class="org.mybatis.spring.SqlSessionTemplate ">-->
<!--        <constructor-arg index="0" ref="SqlSessionFactory"/>-->
<!--    </bean>-->

    <!--SqlSession实现类
    相当于sqlSession.getMapper(User.class)操作
    -->
<!--    <bean id="userMapperImpl" class="com.cike11.dao.UserMapperImpl">-->
<!--        <property name="sqlSession" ref="SqlSession"/>-->
<!--    </bean>-->

    <bean id="userMapperImpl2" class="com.cike11.dao.UserMapperImp2">
        <property name="sqlSessionFactory" ref="SqlSessionFactory"/>
    </bean>
</beans>

参考文档:

plain 复制代码
https://mybatis.org/spring/zh_CN/sqlsession.html
相关推荐
鱼跃鹰飞12 小时前
设计模式系列:工厂模式
java·设计模式·系统架构
时见先生13 小时前
Python库和conda搭建虚拟环境
开发语言·人工智能·python·自然语言处理·conda
a努力。13 小时前
国家电网Java面试被问:混沌工程在分布式系统中的应用
java·开发语言·数据库·git·mysql·面试·职场和发展
Yvonne爱编码13 小时前
Java 四大内部类全解析:从设计本质到实战应用
java·开发语言·python
wqwqweee13 小时前
Flutter for OpenHarmony 看书管理记录App实战:搜索功能实现
开发语言·javascript·python·flutter·harmonyos
li_wen0113 小时前
文件系统(八):Linux JFFS2文件系统工作原理、优势与局限
大数据·linux·数据库·文件系统·jffs2
J2虾虾13 小时前
SpringBoot和mybatis Plus不兼容报错的问题
java·spring boot·mybatis
yongui4783413 小时前
基于MATLAB的NALM锁模光纤激光器仿真实现
开发语言·matlab
毕设源码-郭学长14 小时前
【开题答辩全过程】以 基于springboot 的豪华婚车租赁系统的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
wWYy.14 小时前
详解redis(16):缓存击穿
数据库·redis·缓存