MyBatis框架Dao代理

一、Dao开发

首先创建Dao接口

package com.md.dao;
import com.md.domain.Student;
import java.util.List;

/**
 * @author MD
 * @create 2020-08-05 14:18
 */
public interface StudentDao {
    List<Student> selectStudents();
    int insertStudent(Student student);
}

然后创建Dao接口的实现类

public class StudentDaoImpl implements StudentDao

1. 实现接口中的select方法

先在StudentDao.xml中写对应的sql

<?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.md.dao.StudentDao">

    <select id="selectStudents" resultType="com.md.domain.Student">
      select id,name,eamil,age from student
    </select>


    <insert id="insertStudent">
        insert into student values(#{id},#{name},#{email},#{age})
    </insert>

</mapper>

然后在实现类中写具体的方法

public List<Student> selectStudents() {
    // 工具类
	SqlSession session = MyBatisUtil.getSqlSession();
	List<Student> studentList = session.selectList("com.md.dao.StudentDao.selectStudents");
	session.close();
	return studentList;
}

在测试类中写

@Test
    public void testSelectStudent(){
        StudentDao dao = new StudentDaoImpl();

        List<Student> studentList = dao.selectStudents();
        studentList.forEach(stu -> System.out.println(stu));
    }

需要注意:

  1. dao对象,类型是StudentDao,而这个接口的全限定名称是:com.md.dao.StudentDao正好和类型是StudentDao.xml中的namespace是一样的
  2. 方法名称,selectStudents,这个方法的名称正是mapper文件中的id值 selectStudents
  3. 通过dao中方法的返回值也是可以确定MyBatis要调用的SqlSession的方法
    • 如果返回的是list,那就说明调用的是selectList()方法
    • 如果返回的是int、或是其他,看mapper文件中的标签 <insert>,<update>
    • 就会调用SqlSession的insert、update方法
  4. mybatis的动态代理,mybatis根据dao的方法调用,获取执行sql语句信息,mybatis根据你的dao接口,创建一个到接口的实现类,并创建这个类的对象,完成SqlSession调用方法,访问数据库

2. 实现接口中insert方法

 @Override
    public int insertStudent(Student student) {
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        int nums = sqlSession.insert("com.md.dao.StudentDao.insertStudent",student);

        // 注意提交事务
        sqlSession.commit();

        sqlSession.close();
        return nums;
    }

测试类

 int i = dao.insertStudent(new Student(1005,"李白","li@qq.com",30));
        System.out.println("成功插入:"+i+" 条数据");

3. 实现接口中 update 方法

public int updateStudent(Student student) {
	SqlSession session = MyBatisUtil.getSqlSession();
	int nums = session.insert(
	"com.md.dao.StudentDao.updateStudent",student);
	session.commit();
	session.close();
	return nums;
}

测试:

public void testUpdate() throws IOException {
	Student student = new Student();
	student.setId(1006);
	student.setAge(28);
	int nums = studentDao.updateStudent(student);
	System.out.println(" 使用 Dao 修改数据:"+nums);
}

4. 实现接口中 delete 方法

public int deleteStudent(int id) {
	SqlSession session = MyBatisUtil.getSqlSession();
	int nums = session.insert(
		"com.md.dao.StudentDao.deleteStudent",1006);
	session.commit();
	session.close();
	return nums;
}

测试:

@Test
public void testDelete() throws IOException {
	int nums = studentDao.deleteStudent(1006);
	System.out.println(" 使用 Dao 修改数据:"+nums);
}

二、Dao开发分析

在前面例子中自定义 Dao 接口实现类时发现一个问题:

Dao 的实现类其实并没有干什么实质性的工作,而且代码还是千篇一律,它仅仅就是通过 SqlSession 的相关 API 定位到映射文件 mapper 中相应 id 的 SQL 语句,真正对 DB 进行操作的工作其实是由框架通过 mapper 中的 SQL 完成的

所以,MyBatis 框架就抛开了 Dao 的实现类,直接定位到映射文件 mapper 中的相应 SQL 语句,对DB 进行操作。这种对 Dao 的实现方式称为 Mapper 的动态代理方式

Mapper 动态代理方式无需程序员实现 Dao 接口。接口是由 MyBatis 结合映射文件自动生成的动态代
理实现的

三、Dao代理实现CURD

首先就是删除Dao接口的实现类

1. 使用getMapper获取代理对象

只需调用 SqlSession 的 getMapper()方法,即可获取指定接口的实现类对象。该方法的参数为指定 Dao接口类的 class 值

还是直接使用工具类获取获取SqlSession

 /**
         * 使用mybatis的动态代理机制, 使用SqlSession.getMapper(dao接口.class)
         * getMapper能获取dao接口对于的实现类对象。
         */

        SqlSession sqlSession = MybatisUtils.getSqlSession();
        StudentDao dao = sqlSession.getMapper(StudentDao.class);

这样的话就无需再写实现类了,使用dao接口.class就行

上面使用传统Dao的方式就可以修改成这样

select

  @Test
    public void testSelectStudent(){

        SqlSession sqlSession = MybatisUtils.getSqlSession();
        StudentDao dao = sqlSession.getMapper(StudentDao.class);

        // 调用dao方法,执行数据库操作
        List<Student> studentList = dao.selectStudents();
        studentList.forEach(stu -> System.out.println(stu));
    }

insert

@Test
    public void testInsertStudent(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        StudentDao dao = sqlSession.getMapper(StudentDao.class);

        int i = dao.insertStudent(new Student(1006,"王昭君","wzj@qq.com",30));

        // 注意提交事务
        sqlSession.commit();
        System.out.println("成功插入:"+i+" 条数据");
    }

这样就更加的方便了

四、总结

1. 什么是动态代理?

mybatis帮你创建dao接口的实现类,在实现类中调用SqlSession的方法执行sql语句

2. 使用动态代理的方式

  1. 获取SqlSession对象,SqlSessionFactory.openSession(),只不过我们可以直接使用工具类
  2. 使用getMapper方法获取某个接口的对象,sqlSession.getMapper(接口.class);
  3. 调用接口的方法,调用那个方法就执行了mapper文件中的那个sql语句

3. 使用动态代理的要求

  1. dao接口和mapper文件放在一个目录中
  2. dao接口和mapper文件名称一致
  3. mapper文件中的namespace的值是dao接口的全限定名称
  4. mapper文件中的<select>、<insert>、<update>、<delete>等的id值是接口中的方法名
  5. dao接口中不要使用重载的方法,不要使用同名的,不同参数的方法

具体的如下:

目录结构

dao接口:

package com.md.dao;

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

}

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.md.dao.StudentDao">

    <select id="selectStudents" resultType="com.md.domain.Student">
      select id,#{age})
    </insert>

</mapper>

这样就ok了

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


1.pom.xml引入依赖 &lt;dependency&gt; &lt;groupId&gt;com.github.pagehelper&lt;/groupId&gt; &lt;artifactId&gt;pagehelper&lt;/artifactId&gt; &lt;version&gt;5
&lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot; ?&gt; &lt;!DOCTYPE configuration PUBLIC &quot;-//mybatis.org//DTD Config 3.0//EN&quot; &qu
准备工作 ① 创建数据库&amp;数据表 ## 创建数据库 CREATE DATABASE `dbtest1`; ## 创建数据表 CREATE TABLE `t_user` ( `id` INT NOT NULL AUTO_INCREMENT, `username` VARCHAR(20) DEF
MyBatis逆向工程是指根据数据库表结构自动生成对应的实体类、Mapper接口以及SQL映射文件的过程。这个过程可以通过MyBatis提供的逆向工程工具来完成,极大地方便了开发人员,避免了重复的代码编写,提高了开发效率。 创建逆向工程的步骤 1、添加依赖&amp;插件 &lt;!-- 控制Mave
MyBatis获取参数值的两种方式:${}和#{} ${}的本质就是字符串拼接,#{}的本质就是占位符赋值。 ${}使用字符串拼接的方式拼接sql,若为字符串类型或日期类型的字段进行赋值时,需要手动加单引号;但是#{}使用占位符赋值的方式拼接sql,此时为字符串类型或日期类型的字段进行赋值时,可以自
resultMap作用是处理数据表中字段与java实体类中属性的映射关系。 准备工作 ① 创建数据库&amp;数据表 CREATE DATABASE `dbtest1`; CREATE TABLE `t_emp` ( `emp_id` int NOT NULL AUTO_INCREMENT, `em
EHCache缓存针对于MyBatis的二级缓存。 MyBatis默认二级缓存是SqlSessionFactory级别的。 添加依赖 &lt;!-- MyBatis-EHCache整合包 --&gt; &lt;dependency&gt; &lt;groupId&gt;org.mybatis.cac
MyBatis 提供了一级缓存和二级缓存的支持,用于提高数据库查询的性能,减少不必要的数据库访问。 一级缓存(SqlSession 级别的缓存) 一级缓存是 MyBatis 中最细粒度的缓存,也称为本地缓存。它存在于每个 SqlSession 的生命周期中,当 SqlSession 被关闭或清空时,
动态SQL是 MyBatis 中非常强大且灵活的功能,允许你根据不同的条件构建SQL查询。 这主要通过 &lt;if&gt;、&lt;choose&gt;、&lt;when&gt;、&lt;otherwise&gt;、&lt;foreach&gt;等标签实现。 查询场景 /** * 根据条件查询员工
本教程操作系统:windows10系统、DELL G3电脑。 MyBatis 是一个优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。在 MyBatis 中,配置数据库连接是非常重要的第一步。下面将详细介绍如何配置 MyBatis 的
今天小编给大家分享的是MyBatis批量查询、插入、更新、删除如何实现,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。
今天小编给大家分享的是Mybatis操作多数据源实现的方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获...
本篇文章和大家了解一下mybatis集成到spring的方式有哪些。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。1 前言1.1 集成spring前使用mybat...
今天小编给大家分享的是mybatis-plus分页查询的3种方法,相信很多人都不太了解,为了让大家更加了解,所以给大家总结了以下内容,一起往下看吧。一定会有所收获...
本篇内容主要讲解“mybatis之BaseTypeHandler怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“mybatis...
这篇文章主要介绍了mybatisforeach怎么传两个参数的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇mybatisforeach怎...
这篇“MyBatis映射文件中parameterType与resultType怎么使用”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的...
这篇文章主要介绍“MyBatis怎么获取自动生成的键值”,在日常操作中,相信很多人在MyBatis怎么获取自动生成的键值问题上存在疑惑,小编查阅了各式资料,整理出
这篇文章主要讲解了“怎么去掉IntelliJIDEA中mybatis对应的xml文件警告”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入...
这篇文章主要介绍“MybatisPlus使用@TableId主键id自增长无效如何解决”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这...