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
相关推荐
YCY^v^4 小时前
JeecgBoot 项目运行指南
java·学习
云小逸4 小时前
【nmap源码解析】Nmap OS识别核心模块深度解析:osscan2.cc源码剖析(1)
开发语言·网络·学习·nmap
冰暮流星4 小时前
javascript之二重循环练习
开发语言·javascript·数据库
风指引着方向4 小时前
自定义算子开发入门:基于 CANN op-plugin 的扩展实践
开发语言
人间打气筒(Ada)4 小时前
jenkins基于Pipeline发布项目
java·pipeline·jenkins·流水线·ci·cd·cicd
Fairy要carry4 小时前
面试-GRPO强化学习
开发语言·人工智能
爬山算法4 小时前
Hibernate(88)如何在负载测试中使用Hibernate?
java·后端·hibernate
自不量力的A同学4 小时前
Solon AI v3.9 正式发布:全能 Skill 爆发
java·网络·人工智能
Liekkas Kono5 小时前
RapidOCR Python 贡献指南
开发语言·python·rapidocr
张张努力变强5 小时前
C++ STL string 类:常用接口 + auto + 范围 for全攻略,字符串操作效率拉满
开发语言·数据结构·c++·算法·stl