MyBatis详细讲解DAO代理的使用

 更新时间:2022年04月07日 12:38:25   作者:托马斯-酷涛  
MyBatis允许只声明一个dao接口,而无需写dao实现类的方式实现数据库操作。前提是必须保证Mapper文件中的<mapper>标签的namespace属性值必须要和dao接口的类路径一致,MyBatis容器会自动通过动态代理生成接口的实现类

DAO代理实现数据库操作

1、去掉Dao接口实现类

2、getMapper获取代理对象

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

SqlSession session = factory.openSession();
StudentDao dao = session.getMapper(StudentDao.class);

使用工具类

StudentDao studentDao = 
MyBatisUtil.getSqlSession().getMapper(StudentDao.class);

getMapper()创建的对象,是代替我们自己创建的 StudentDaoImpl 类

3、使用 Dao 代理对象方法执行 sql 语句

select方法进行查询

@Test
public void testSelect() throws IOException {
 final List<Student> studentList = studentDao.selectStudents();
 studentList.forEach( stu -> System.out.println(stu));
}

insert方法进行插入

@Test
public void testInsert() throws IOException {
 Student student = new Student();
 student.setId(1006);
 student.setName("林浩");
 student.setEmail("linhao@163.com");
 student.setAge(26);
 int nums = studentDao.insertStudent(student);
 System.out.println("使用 Dao 添加数据:"+nums);
}

4、深入理解参数

从 java 代码中把参数传递到 mapper.xml 文件。

parameterType

parameterType: 接口中方法参数的类型, 类型的完全限定名或别名。这个属 性是可选的,因为 MyBatis 可以推断出具体传入语句的参数,默认值为未设置 (unset)。接口中方法的参数从 java 代码传入到 mapper 文件的 sql 语句。

  • int 或 java.lang.Integer
  • hashmap 或 java.util.HashMap
  • list 或 java.util.ArrayList
  • student 或 com.bjpowernode.domain.Student

<select>,<insert>,<update>,<delete>都可以使用 parameterType 指定类型。

eg:

<delete id="deleteStudent" parameterType="int">
 delete from student where id=#{studentId}
</delete>
等同于
<delete id="deleteStudent" parameterType="java.lang.Integer">
 delete from student where id=#{studentId}
</delete>

一个简单参数

Dao 接口中方法的参数只有一个简单类型(java 基本类型和 String),占位符 #{ 任意字符 },和方法的参数名无关。

接口方法

Student selectById(int id);

mapper文件

<select id="selectById" resultType="com.bjpowernode.domain.Student">
 select id,name,email,age from student where id=#{studentId}
</select>

#{studentId} , studentId 是自定义的变量名称,和方法参数名无关。

测试方法

@Test
public void testSelectById(){
 //一个参数 
 Student student = studentDao.selectById(1005);
 System.out.println("查询 id 是 1005 的学生:"+student);
}

使用@Param

当 Dao 接口方法多个参数,需要通过名称使用参数。 在方法形参前面加 入@Param(“自定义参数名”),mapper 文件使用#{自定义参数名}。

例如定义 List<Student> selectStudent( @Param(“personName”) 

String name ) { … } 

mapper 文件 select * from student where name = 

#{ personName}

接口方法

List<Student> selectMultiParam(@Param("personName") String name,
 @Param("personAge") int age);

Mapper文件

<select id="selectMultiParam" resultType="com.bjpowernode.domain.Student">
 select id,name,email,age from student where name=#{personName} or age 
=#{personAge}
</select>

测试方法

@Test
public void testSelectMultiParam(){
 List<Student> stuList = studentDao.selectMultiParam("李力",20);
 stuList.forEach( stu -> System.out.println(stu));
}

使用对象

使用 java 对象传递参数, java 的属性值就是 sql 需要的参数值。 每一个属性就是一个参数。

语法格式: #{ property,javaType=java 中数据类型名

jdbcType=数据类型名称 } javaType, jdbcType 的类型 MyBatis 可以检测出来,一般不需要设置。常用格式 #{ property }

 创建保存参数值的对象 QueryParam

package com.bjpowernode.vo; 
public class QueryParam {
 private String queryName;
 private int queryAge;
 //set ,get 方法
}

接口方法

List<Student> selectMultiObject(QueryParam queryParam);

Mapper文件

<select id="selectMultiObject" resultType="com.bjpowernode.domain.Student">
 select id,name,email,age from student where name=#{queryName} or age 
=#{queryAge}
</select>
或
<select id="selectMultiObject" resultType="com.bjpowernode.domain.Student">
 select id,name,email,age from student
 where name=#{queryName,javaType=string,jdbcType=VARCHAR}
 or age =#{queryAge,javaType=int,jdbcType=INTEGER}
</select>

测试方法

@Test
public void selectMultiObject(){
 QueryParam qp = new QueryParam();
 qp.setQueryName("李力");
 qp.setQueryAge(20);
 List<Student> stuList = studentDao.selectMultiObject(qp);
 stuList.forEach( stu -> System.out.println(stu));
}

到此这篇关于MyBatis详细讲解DAO代理的使用的文章就介绍到这了,更多相关MyBatis DAO代理内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Spring MVC实现一次简单的CRUD示例

    Spring MVC实现一次简单的CRUD示例

    这篇文章主要介绍了Spring MVC实现一次简单的CRUD示例,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • Spring Batch远程分区的本地Jar包模式的代码详解

    Spring Batch远程分区的本地Jar包模式的代码详解

    这篇文章主要介绍了Spring Batch远程分区的本地Jar包模式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • 一文带你搞懂Java中的递归

    一文带你搞懂Java中的递归

    这篇文章主要为大家详细介绍了Java中的递归的实现以及应用,文中的示例代码讲解详细,对我们学习Java有一定帮助,需要的可以参考一下
    2022-10-10
  • 解决maven maven.compiler.source和maven.compiler.target的坑

    解决maven maven.compiler.source和maven.compiler.target的坑

    这篇文章主要介绍了解决maven maven.compiler.source和maven.compiler.target的坑,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Java实现Fast DFS、服务器、OSS上传功能

    Java实现Fast DFS、服务器、OSS上传功能

    这篇文章主要介绍了Java实现Fast DFS、服务器、OSS上传功能,在实际的业务中,可以根据客户的需求设置不同的文件上传需求,支持普通服务器上传+分布式上传(Fast DFS)+云服务上传OSS(OSS),需要的朋友可以参考下
    2024-04-04
  • java Arrays快速打印数组的数据元素列表案例

    java Arrays快速打印数组的数据元素列表案例

    这篇文章主要介绍了java Arrays快速打印数组的数据元素列表案例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-09-09
  • 聊聊Spring Cloud Cli 初体验

    聊聊Spring Cloud Cli 初体验

    这篇文章主要介绍了聊聊Spring Cloud Cli 初体验,SpringBoot CLI 是spring Boot项目的脚手架工具。非常具有实用价值,需要的朋友可以参考下
    2018-04-04
  • spring security在分布式项目下的配置方法(案例详解)

    spring security在分布式项目下的配置方法(案例详解)

    这篇文章主要介绍了spring security在分布式项目下的配置方法,本文通过一个项目案例给大家详细介绍,通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-10-10
  • SpringBoot实现API接口的完整代码

    SpringBoot实现API接口的完整代码

    这篇文章主要给大家介绍了关于SpringBoot实现API接口的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-10-10
  • SpringBoot实现快递物流查询功能(快递鸟)

    SpringBoot实现快递物流查询功能(快递鸟)

    本文将基于springboot2.4.0实现快递物流查询,物流信息的获取通过快递鸟第三方实现,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-10-10

最新评论