三、MyBatis 使用传统 Dao 开发方式

1.0 使用 Dao 的实现类,操作数据库

1.0.1 Dao 开发

(0)定义接口StudentDao 及创建接口的映射文件StudentDao .xm
package com.zep.dao;import com.zep.domain.Student;import java.util.List;public interface StudentDao {List<Student> selectStudents();int insertStudent(Student student);int updateStudent(Student student);int deleteStudent(int id);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zep.dao.StudentDao"><select id="selectStudents" resultType="com.zep.domain.Student">select * from student order by id;</select><insert id="insertStudent">insert into student values(#{id},#{name},#{email},#{age})</insert><update id="updateStudent">update student set age = #{age} where id=#{id}</update><delete id="deleteStudent">delete from student where id=#{studentId}</delete>
</mapper>
(1) 创建 Dao 接口实现类

public class StudentDaoImpl implements StudentDao

(2) 实现接口中 select 方法
@Overridepublic List<Student> selectStudents() {// 1.获取SqlSession对象SqlSession sqlSession = MybatisUtils.getSqlSession();String sqlId = "com.zep.dao.StudentDao.selectStudents";// 2.执行sql语句,使用SqlSession类的方法List<Student> students = sqlSession.selectList(sqlId);/*for (Student student : students) {System.out.println(student);}*/// 3.关闭sqlSession.close();return students;}

测试查询操作:
MyBatisTest 类中创建 StudentDaoImpl 对象

public class TestMybatis {@Testpublic void testSelectStudents() {StudentDaoImpl dao = new StudentDaoImpl();List<Student> students = dao.selectStudents();for (Student student : students) {System.out.println(student);}}
}

(3) 实现接口中 insert 方法

    @Overridepublic int insertStudent(Student student) {// 1.获取SqlSession对象SqlSession sqlSession = MybatisUtils.getSqlSession();String sqlId = "com.zep.dao.StudentDao.insertStudent";// 2.执行sql语句,使用SqlSession类的方法int nums = sqlSession.insert(sqlId,student);// 3.提交事务sqlSession.commit();// 4.关闭sqlSession.close();return nums;}

测试 insert

@Testpublic void testInsertStudent() {StudentDaoImpl dao = new StudentDaoImpl();Student student = new Student();student.setId(1003);student.setName("zep");student.setEmail("zep@qq.com");student.setAge(22);int nums = dao.insertStudent(student);System.out.println("添加对象的数量:" + nums);}

(4) 实现接口中 update 方法

 @Override
public int updateStudent(Student student) {SqlSession session = MybatisUtils.getSqlSession();int nums = session.update("com.zep.dao.StudentDao.updateStudent",student);session.commit();session.close();return nums;}

测试 update

@Test
public void testUpdateStudent() {StudentDaoImpl dao = new StudentDaoImpl();Student student = new Student();student.setId(1004);student.setAge(222);int nums = dao.updateStudent(student);System.out.println("使用Dao修改数据:" + nums);}

(5) 实现接口中 delete 方法

@Override
public int deleteStudent(int id) {SqlSession session = MybatisUtils.getSqlSession();int nums = session.delete("com.zep.dao.StudentDao.deleteStudent",id);session.commit();session.close();return nums;}

测试 delete

 @Testpublic void testDeleteStudent() {StudentDaoImpl dao = new StudentDaoImpl();int nums = dao.deleteStudent(1005);System.out.println("使用Dao删除的数据:" + nums);}

项目完整代码如下:
在这里插入图片描述
pom.xml:

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.zep</groupId><artifactId>ch02-mybatis-dao</artifactId><version>1.0-SNAPSHOT</version><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.source>1.8</maven.compiler.source><maven.compiler.target>1.8</maven.compiler.target></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.11</version><scope>test</scope></dependency><!--mybatis依赖--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.1</version></dependency><!--mysql驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.9</version></dependency></dependencies><build><resources><resource><directory>src/main/java</directory><!--所在的目录--><includes><!--包括目录下的.properties,.xml 文件都会扫描到--><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>false</filtering></resource></resources><plugins><plugin><artifactId>maven-compiler-plugin</artifactId><version>3.1</version><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins></build></project>

Student .java:

package com.zep.domain;
// 推荐和表名一样,容易记忆
public class Student {// 定义属性,目前要求是 属性名和列名保持一致private Integer id;private String name;private String email;private Integer age;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getEmail() {return email;}public void setEmail(String email) {this.email = email;}public Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"id=" + id +", name='" + name + '\'' +", email='" + email + '\'' +", age=" + age +'}';}
}

mybatis.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!--mybatis.xml 文件加入日志配置,可以在控制台输出执行的 sql 语句和参数--><settings><setting name="logImpl" value="STDOUT_LOGGING"/></settings><environments default="mysql"><environment id="mysql"><transactionManager type="JDBC"/><dataSource type="POOLED"><!--数据库的驱动类名--><property name="driver" value="com.mysql.jdbc.Driver"/><!--连接数据库的url字符串--><property name="url" value="jdbc:mysql://localhost:3306/ssm"/><!--访问数据库的用户名--><property name="username" value="root"/><!--密码--><property name="password" value="root"/></dataSource></environment></environments><mappers><mapper resource="com/zep/dao/StudentDao.xml"/></mappers>
</configuration>

MybatisUtils .java:

package com.zep.utils;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 java.io.IOException;
import java.io.InputStream;public class MybatisUtils {private static SqlSessionFactory factory = null;/*静态代码块:执行优先级高于非静态的初始化块,它会在类初始化的时候执行一次,执行完成便销毁*///使用 静态块 创建一次 SqlSessionFactorystatic {String config = "mybatis.xml"; //需要和你的项目中的文件名一样try {//读取配置文件InputStream in = Resources.getResourceAsStream(config);//创建SqlSessionFactory对象,使用SqlSessionFactoryBuilderfactory = new SqlSessionFactoryBuilder().build(in);} catch (IOException e) {e.printStackTrace();}}// 获取SqlSession对象的方法public static SqlSession getSqlSession() {SqlSession sqlSession = null;if (factory != null) {sqlSession = factory.openSession(); // 非自动提交事务}return sqlSession;}
}

StudentDao .java:

package com.zep.dao;import com.zep.domain.Student;import java.util.List;public interface StudentDao {List<Student> selectStudents();int insertStudent(Student student);int updateStudent(Student student);int deleteStudent(int id);
}

StudentDao.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zep.dao.StudentDao"><select id="selectStudents" resultType="com.zep.domain.Student">select * from student order by id;</select><insert id="insertStudent">insert into student values(#{id},#{name},#{email},#{age})</insert><update id="updateStudent">update student set age = #{age} where id=#{id}</update><delete id="deleteStudent">delete from student where id=#{studentId}</delete>
</mapper>

StudentDaoImpl .java:

package com.zep.dao.Impl;import com.zep.dao.StudentDao;
import com.zep.domain.Student;
import com.zep.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;import java.util.List;public class StudentDaoImpl implements StudentDao {@Overridepublic List<Student> selectStudents() {// 1.获取SqlSession对象SqlSession sqlSession = MybatisUtils.getSqlSession();String sqlId = "com.zep.dao.StudentDao.selectStudents";// 2.执行sql语句,使用SqlSession类的方法List<Student> students = sqlSession.selectList(sqlId);/*for (Student student : students) {System.out.println(student);}*/// 3.关闭sqlSession.close();return students;}@Overridepublic int insertStudent(Student student) {// 1.获取SqlSession对象SqlSession sqlSession = MybatisUtils.getSqlSession();String sqlId = "com.zep.dao.StudentDao.insertStudent";// 2.执行sql语句,使用SqlSession类的方法int nums = sqlSession.insert(sqlId,student);// 3.提交事务sqlSession.commit();// 4.关闭sqlSession.close();return nums;}public int updateStudent(Student student) {SqlSession session = MybatisUtils.getSqlSession();int nums = session.update("com.zep.dao.StudentDao.updateStudent",student);session.commit();session.close();return nums;}@Overridepublic int deleteStudent(int id) {SqlSession session = MybatisUtils.getSqlSession();int nums = session.delete("com.zep.dao.StudentDao.deleteStudent",id);session.commit();session.close();return nums;}
}

TestMybatis .java:

package com.zep;import com.zep.dao.Impl.StudentDaoImpl;
import com.zep.domain.Student;
import org.junit.Test;import java.util.List;public class TestMybatis {@Testpublic void testSelectStudents() {//com.zep.dao.StudentDaoStudentDaoImpl dao = new StudentDaoImpl();/*** 调用List<Student> students = dao.selectStudents();*  1.dao对象,类型是StudentDao,可以获取到它的全限定类名为:com.zep.dao.StudentDao*  这个全限定名称和StudentDao.xml文件中mapper的namespace的值是一样的**  2.方法名称,selectStudents,这个方法就是StudentDao.xml文件中mapper标签下的子标签中id的值selectStudents**  3.通过dao中方法的返回值也可以确定Mybatis要调用的SqlSession的方法*      如果返回值是List,调用的是SqlSession.selectList()方法。*      如果返回值是int,或者是非List的,看mapper文件中的标签是<insert>,<update>*          就会调用SqlSession的insert(),update()等方法**  mybatis的动态代理:mybatis根据dao的方法调用,获取执行sql语句的信息。*      mybatis根据你的dao接口,创建出一个dao接口的实现类,并创建这个类的对象来完成*      SqlSession调用方法,访问数据库。*/List<Student> students = dao.selectStudents();for (Student student : students) {System.out.println(student);}}@Testpublic void testInsertStudent() {StudentDaoImpl dao = new StudentDaoImpl();Student student = new Student();student.setId(1005);student.setName("zep");student.setEmail("zep@qq.com");student.setAge(22);int nums = dao.insertStudent(student);System.out.println("添加对象的数量:" + nums);}@Testpublic void testUpdateStudent() {StudentDaoImpl dao = new StudentDaoImpl();Student student = new Student();student.setId(1004);student.setAge(222);int nums = dao.updateStudent(student);System.out.println("使用Dao修改数据:" + nums);}@Testpublic void testDeleteStudent() {StudentDaoImpl dao = new StudentDaoImpl();int nums = dao.deleteStudent(1005);System.out.println("使用Dao删除的数据:" + nums);}}

在这里插入图片描述

1.0.2 传统 Dao 开发方式的分析

在前面例子中自定义 Dao 接口实现类时发现一个问题:Dao 的实现类其实并没有干什么实质性的工作,它仅仅就是通过 SqlSession 的相关 API 定位到映射文件 mapper (StudentDao.xml)中相应 id 的 SQL 语句,真正对 DB 进行操作的工作其实是由框架通过 mapper 中的 SQL 完成的。

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

Mapper 动态代理方式无需程序员实现 Dao 接口,不需要我们自己编写Dao接口的实现类。接口是由 MyBatis 结合映射文件自动生成的动态代理实现的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/470890.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode 2347. 最好的扑克手牌

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 ranks 和一个字符数组 suit 。你有 5 张扑克牌&#xff0c;第 i 张牌大小为 ranks[i] &#xff0c;花色为 suits[i] 。 下述是从好到坏你可能持有的 手牌类型 &#xff1a; "Flush"&#xff1a;同花&#xff0c;五…

四、MyBatis 框架 Dao 动态代理

1.1 步骤 &#xff08;1&#xff09; 去掉 之前编写的Dao 接口实现类 &#xff08;2&#xff09; getMapper 获取代理对象 只需调用 SqlSession 的 getMapper()方法&#xff0c;即可获取指定接口的实现类对象。该方法的参数为指定 Dao接口类的 class 值。 不使用工具类&…

五、深入理解Mybatis中的参数parameterType (传递一个简单参数,传递多个参数:@Param、使用自定义对象、按位置、使用Map)

1.1 parameterType parameterType: 接口中方法参数的类型&#xff0c; 类型的完全限定名或别名。这个属性是可选的&#xff0c;因为 MyBatis可以推断出具体传入语句的参数&#xff0c;默认值为未设置&#xff08;unset&#xff09;。接口中方法的参数从 java 代码传入到mapper…

六、封装 MyBatis 输出结果resultType、resultMap 以及 数据库表中列名和返回对象属性名不一致的2种解决方案(详解)

1.1 resultType resultType: 执行 sql 得到 ResultSet 转换的类型&#xff0c;使用类型的完全限定名或别名。 注意&#xff1a;如果返回的是集合&#xff0c;那应该设置为集合包含的类型&#xff0c;而不是集合本身。resultType 和 resultMap&#xff0c;不能同时使用。 A、…

API 接口批量测试

ApiPost 创建接口 导入要测试的数据 测试结果 ApiFox 创建接口 导入接口 导入测试数据&#xff0c;可以直接编辑&#xff0c;粘贴进来 测试结果

LeetCode 2342. 数位和相等数对的最大和

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始的数组 nums &#xff0c;数组中的元素都是 正 整数。请你选出两个下标 i 和 j&#xff08;i ! j&#xff09;&#xff0c;且 nums[i] 的数位和 与 nums[j] 的数位和相等。 请你找出所有满足条件的下标 i 和 j &#xff…

软件项目管理-构建之法-四周总结

写在前面 课程名&#xff1a;软件项目管理 授课人&#xff1a;东北师范大学 杨贵福&#xff08; http://www.cnblogs.com/younggift/&#xff09; 教材&#xff1a;《构建之法 - 现代软件工程》 作者&#xff1a;邹欣老师 &#xff08;博客&#xff1a;http://www.cnblogs.com…

一、Vue基础语法学习笔记系列——插值操作(Mustache语法、v-once、v-html、v-text、v-pre、v-cloak)、绑定属性v-bind(绑定class、style)、计算属性

一、插值操作 1. Mustache 如何将data中的文本数据&#xff0c;插入到HTML中呢&#xff1f; 我们已经学习过了&#xff0c;可以通过Mustache语法(也就是双大括号)。 Mustache: 胡子/胡须. 我们可以像下面这样来使用&#xff0c;并且数据是响应式的 2. v-once 但是&#xff0…

LeetCode 2348. 全 0 子数组的数目

文章目录1. 题目2. 解题1. 题目 给你一个整数数组 nums &#xff0c;返回全部为 0 的 子数组 数目。 子数组 是一个数组中一段连续非空元素组成的序列。 示例 1&#xff1a; 输入&#xff1a;nums [1,3,0,0,2,0,0,4] 输出&#xff1a;6 解释&#xff1a; 子数组 [0] 出现了…

二、Vue基础语法学习笔记——事件监听v-on、条件判断(v-if、v-else-if、v-else、v-show)、循环遍历(v-for遍历数组对象,key属性、检测数组更新)、图书案例、双向绑定

四、事件监听 在前端开发中&#xff0c;我们需要经常和用于交互。 这个时候&#xff0c;我们就必须监听用户发生的时间&#xff0c;比如点击、拖拽、键盘事件等等 在Vue中如何监听事件呢&#xff1f;使用v-on指令 v-on介绍 作用&#xff1a;绑定事件监听器 缩写&#xff1a; 预…

LeetCode 2352. 相等行列对

文章目录1. 题目2. 解题1. 题目 给你一个下标从 0 开始、大小为 n x n 的整数矩阵 grid &#xff0c;返回满足 Ri 行和 Cj 列相等的行列对 (Ri, Cj) 的数目。 如果行和列以相同的顺序包含相同的元素&#xff08;即相等的数组&#xff09;&#xff0c;则认为二者是相等的。 示…

三、Vue组件化开发学习笔记——组件化的基本步骤、全局组件和局部组件、父组件和子组件、注册组件的语法糖、模板分离写法、组件的数据存放

一、什么是组件化&#xff1f; 人面对复杂问题的处理方式&#xff1a; 任何一个人处理信息的逻辑能力都是有限的 所以&#xff0c;当面对一个非常复杂的问题时&#xff0c;我们不太可能一次性搞定一大堆的内容。 但是&#xff0c;我们人有一种天生的能力&#xff0c;就是将问题…

LeetCode 2353. 设计食物评分系统(sortedcontainers)

文章目录1. 题目2. 解题1. 题目 设计一个支持下述操作的食物评分系统&#xff1a; 修改 系统中列出的某种食物的评分。返回系统中某一类烹饪方式下评分最高的食物。 实现 FoodRatings 类&#xff1a; FoodRatings(String[] foods, String[] cuisines, int[] ratings) 初始化…

四、Vue组件化开发学习笔记——父子组件通信,父级向子级传值(props),子级向父级传值(自定义事件),slot插槽

一、父子组件的通信 在上一篇博文中&#xff0c;我们提到了子组件是不能引用父组件或者Vue实例的数据的。 但是&#xff0c;在开发中&#xff0c;往往一些数据确实需要从上层传递到下层&#xff1a; 比如在一个页面中&#xff0c;我们从服务器请求到了很多的数据。其中一部分数…

LeetCode 2336. 无限集中的最小数字(SortedSet)

文章目录1. 题目2. 解题1. 题目 现有一个包含所有正整数的集合 [1, 2, 3, 4, 5, …] 。 实现 SmallestInfiniteSet 类&#xff1a; SmallestInfiniteSet() 初始化 SmallestInfiniteSet 对象以包含 所有 正整数。int popSmallest() 移除 并返回该无限集中的最小整数。void ad…

C# - 类_使用新成员隐藏基类成员

1 using System;2 3 namespace 类_使用新成员隐藏基类成员4 {5 // 基类 : Animal6 public class Animal7 {8 // 基类的普通方法Eat(), 并未用Virtual修饰9 public void Eat() 10 { 11 Console.WriteLine("动物吃的方法: …

五、Vue模块化开发学习笔记——JavaScript原始功能、匿名函数的解决方案、使用模块作为出口、CommonJS、ES6 export和import的使用

一、JavaScript原始功能 -在网页开发的早期&#xff0c;js制作作为一种脚本语言&#xff0c;做一些简单的表单验证或动画实现等&#xff0c;那个时候代码还是很少的。 那个时候的代码是怎么写的呢&#xff1f; 直接将代码写在<script>标签中即可 随着ajax异步请求的出现&…

LeetCode 2333. 最小差值平方和(贪心)

文章目录1. 题目2. 解题1. 题目 给你两个下标从 0 开始的整数数组 nums1 和 nums2 &#xff0c;长度为 n 。 数组 nums1 和 nums2 的 差值平方和 定义为所有满足 0 < i < n 的 (nums1[i] - nums2[i])^2 之和。 同时给你两个正整数 k1 和 k2 。你可以将 nums1 中的任意…

[na][tools]快速ping网段工具-QuickPing

一款神器 quickping 能够很快的探测出该网断分出去哪些地址. 在线的会显示绿色 在线的有主机名的显示为亮绿色 转载于:https://www.cnblogs.com/iiiiher/p/5362403.html

六、Webpack详解学习笔记——webpack的安装、起步、配置、loader的使用、webpack中配置Vue、plugin的使用、搭建本地服务器、webpack配置的分离

一、认识webpack 什么是webpack&#xff1f; 这个webpack还真不是一两句话可以说清楚的。我们先看看官方的解释&#xff1a; At its core, webpack is a static module bundler for modern JavaScript applications.从本质上来讲&#xff0c;webpack是一个现代的JavaScript应用…