Mybatis DAO开发

使用Mybatis开发Dao,通常有两个方法,即

  1. 原始Dao开发方法
  2. Mapper代理开发方法

原始DAO开发方式

原始Dao开发方法需要程序员编写Dao接口和Dao实现类,无非就是在Dao实现类里面调用映射文件里面定义的sql而已。

工具类

package org.example.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;/*** Mybatis工具类*/
public class MybatisUtil {private MybatisUtil(){}/*** SqlSessionFactory的最佳使用范围是整个应用运行期间,一旦创建后可以重复使用,通常以单例模式管理*/private static SqlSessionFactory sqlSessionFactory = null;static {//1.读取Mybatis的全局配置文件try {InputStream is = Resources.getResourceAsStream("mybatis-config.xml");//2.获取SqlSessionFactory//SqlSessionFacoty一旦创建完成就不需要SqlSessionFactoryBuilder对象了sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);} catch (IOException e) {throw new RuntimeException(e);}}/*** 获取SqlSession的方法*/public static SqlSession getSession(){return sqlSessionFactory.openSession(true);} //true表示自动提交事务}

实体类

package org.example.entity;/**
* Dept实体类
*/
public class Dept {
private Integer deptno;
private String dname;
private String loc;
public Integer getDeptno() {
return deptno;
}
public void setDeptno(Integer deptno) {
this.deptno = deptno;
}public String getDname() {return dname;}public void setDname(String dname) {this.dname = dname;}public String getLoc() {return loc;}public void setLoc(String loc) {this.loc = loc;}@Overridepublic String toString() {return "Dept{" +"deptno=" + deptno +", dname='" + dname + '\'' +", loc='" + loc + '\'' +'}';}
}

接口

package org.example.dao;import org.example.entity.Dept;
import java.util.List;public interface DeptDao {/*** 查询所有部门* @return*/List<Dept> select();/*** 根据id查询部门信息* @param deptno* @return*/Dept selectById(Integer deptno);/*** 新增部门信息* @param dept* @return*/int insert(Dept dept);/*** 更新部门信息* @param dept* @return*/int update(Dept dept);/*** 根据id删除部门信息* @param deptno* @return*/int delete(Integer deptno);
}

实现类

package org.example.dao.impl;import org.apache.ibatis.session.SqlSession;
import org.example.dao.DeptDao;
import org.example.entity.Dept;
import org.example.utils.MybatisUtil;import java.util.List;public class DeptDaoImpl implements DeptDao {@Overridepublic List<Dept> select() {SqlSession sqlSession = MybatisUtil.getSession();List<Dept> depts = sqlSession.selectList("dept.select");sqlSession.close();return depts;}@Overridepublic Dept selectById(Integer deptno) {SqlSession sqlSession = MybatisUtil.getSession();Dept dept = sqlSession.selectOne("dept.selectById", 10);sqlSession.close();return dept;}@Overridepublic int insert(Dept dept) {SqlSession sqlSession = MybatisUtil.getSession();int result = sqlSession.insert("dept.insert", dept);sqlSession.close();return result;}@Overridepublic int update(Dept dept) {SqlSession sqlSession = MybatisUtil.getSession();int result = sqlSession.update("dept.update", dept);sqlSession.close();return result;}@Overridepublic int delete(Integer deptno) {SqlSession sqlSession = MybatisUtil.getSession();int result = sqlSession.delete("dept.delete", deptno);sqlSession.close();return result;}
}

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="dept"><select id="select" resultType="org.example.entity.Dept">select deptno,dname,loc from dept</select><select id="selectById" parameterType="java.lang.Integer"resultType="org.example.entity.Dept">select deptno,dname,loc from dept where deptno=#{deptno}</select><insert id="insert" parameterType="org.example.entity.Dept">insert into dept(dname,loc) values(#{dname},#{loc})</insert><update id="update" parameterType="org.example.entity.Dept">update dept set dname=#{dname},loc=#{loc} where deptno=#{deptno}</update><delete id="delete" parameterType="java.lang.Integer">delete from dept where deptno=#{deptno}</delete>
</mapper>

在核心配置文件中加载mapper文件

<?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><properties resource=""/><typeAliases><package name=""/></typeAliases><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><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="mapper/DeptMapper.xml"/></mappers>
</configuration>

测试

package org.example;import org.example.dao.DeptDao;
import org.example.dao.impl.DeptDaoImpl;
import org.example.entity.Dept;
import org.junit.Test;import java.util.List;public class DaoTest {private DeptDao deptDao = new DeptDaoImpl();@Testpublic void testSelect() {List<Dept> list = deptDao.select();for (Dept dept : list) {System.out.println(dept);}}@Testpublic void testSelectById() {Dept dept = deptDao.selectById(20);System.out.println(dept);}@Testpublic void testInsert() {Dept dept = new Dept();dept.setDname("企划部");dept.setLoc("深圳");int result = deptDao.insert(dept);System.out.println("影响数据库的条数:" + result);}@Testpublic void testUpdate() {Dept dept = new Dept();dept.setDeptno(41);dept.setDname("生产部");dept.setLoc("杭州");int result = deptDao.update(dept);System.out.println("影响数据库的条数:" + result);}@Testpublic void testDelete() {int result = deptDao.delete(41);System.out.println("影响数据库的条数:" + result);}
}

原始DAO开发问题

  • Dao接口实现类方法中存在大量模板方法,设想能否将这些代码提取出来,大大减轻程序员的工作量。
  • 调用sqlSession的数据库操作方法需要指定statement的id,这里存在硬编码,不利于开发维护。
  • 调用SqlSession方法时传入的变量,由于SqlSession方法使用泛型,即使变量类型传入错误,在编译阶段也不报错,不利于程序员开发。

注:原始Dao开发和我们Web阶段讲解的Dao开发基本类似,都是有Dao接口和Dao实现类,无非Web阶段的Dao实现类中通过DBUtils来操作SQL;现在Mybatis的原始Dao开发,把SQL分离出去了,写在的XML映射文件里面而已。

Mapper代理方式

Mapper代理开发方式只需要程序员编写Mapper接口(相当于Dao接口),由MyBatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。

程序员编写Mapper接口需要遵循一些开发规范,MyBatis可以自动生成Mapper接口实现类代理对象。

开发规范

1、Mapper.xml文件中的namespace与mapper接口的类路径相同。
2、Mapper.xml中定义的每个标签的id与Mapper接口方法名相同。
3、Mapper.xml中定义的每个sql的parameterType的类型与Mapper接口方法的参数类型相同。
4、Mapper.xml中定义的每个sql的resultType的类型与Mapper接口方法返回值类型相同。

注:Mapper.xml映射文件最好和Mapper接口名称一致。

实体类

package org.example.entity;import java.util.Date;public class Emp {private Integer empno;private String ename;private String job;private Integer mgr;private Date hiredate;private Double sal;private Double comm;private Integer deptno;public Integer getEmpno() {return empno;}public void setEmpno(Integer empno) {this.empno = empno;}public String getEname() {return ename;}public void setEname(String ename) {this.ename = ename;}public String getJob() {return job;}public void setJob(String job) {this.job = job;}public Integer getMgr() {return mgr;}public void setMgr(Integer mgr) {this.mgr = mgr;}public Date getHiredate() {return hiredate;}public void setHiredate(Date hiredate) {this.hiredate = hiredate;}public Double getSal() {return sal;}public void setSal(Double sal) {this.sal = sal;}public Double getComm() {return comm;}public void setComm(Double comm) {this.comm = comm;}public Integer getDeptno() {return deptno;}public void setDeptno(Integer deptno) {this.deptno = deptno;}@Overridepublic String toString() {return "Emp{" +"empno=" + empno +", ename='" + ename + '\'' +", job='" + job + '\'' +", mgr=" + mgr +", hiredate=" + hiredate +", sal=" + sal +", comm=" + comm +", deptno=" + deptno +'}';}
}

Mapper接口

Mapper接口相当于我们之前写的Dao接口,只是在Mybatis里面我们习惯这么写而已。

package org.example.mapper;import org.example.entity.Emp;import java.util.List;/** Mapper接口相当于我们之前写的Dao接口,只是在Mybatis里面我们习惯这么写而已。*/
public interface EmpMapper {List<Emp> select();Emp selectById(Integer empno);/*** 方法返回值为void,表示SqlSession对象中insert,update,delete方法的返回值不做任何处* 理。* @param emp*/void insert(Emp emp);/*** 方法返回值为int类型,表示SqlSession对象中insert,update,delete方法的返回值直接返* 回。* @param emp*/int update(Emp emp);/*** 方法返回值为boolean类型,表示根据SqlSession对象中的insert,update,delete方法返回* 值(影响数据库的条数)判断操作是否成功,如果影响数据库的条数大于0条,表示成功,否* 则表示失败。* @param empno* @return*/boolean delete(Integer empno);
}

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="org.example.mapper.EmpMapper"><select id="select" resultType="org.example.entity.Emp">select empno,ename,job,mgr,hiredate,sal,comm,deptno from emp</select><select id="selectById" parameterType="java.lang.Integer"resultType="org.example.entity.Emp">select empno,ename,job,hiredate,mgr,sal,comm,deptno from emp whereempno=#{empno}</select><insert id="insert" parameterType="org.example.entity.Emp">insert into emp(ename,job,mgr,hiredate,sal,comm,deptno)values(#{ename},#{job},#{mgr},#{hiredate},#{sal},#{comm},#{deptno})</insert><update id="update" parameterType="org.example.entity.Emp">update emp setename=#{ename},job=#{job},mgr=#{mgr},hiredate=#{hiredate},sal=#{sal},comm=#{comm},deptno=#{deptno}where empno=#{empno}</update><delete id="delete" parameterType="java.lang.Integer">delete from emp where empno=#{empno}</delete>
</mapper>

在核心配置文件中加载mapper文件

<?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><properties resource=""/><typeAliases><package name=""/></typeAliases><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><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="mapper/EmpMapper.xml"/></mappers>
</configuration>

测试

package org.example;import org.apache.ibatis.session.SqlSession;
import org.example.entity.Emp;
import org.example.mapper.EmpMapper;
import org.example.utils.MybatisUtil;
import org.junit.Test;import java.util.List;public class MapperTest {@Testpublic void testMapper(){SqlSession sqlSession = MybatisUtil.getSession();//获取Mapper接口的代理对象(实现类对象)//告诉mtbatis生成哪个接口的实现类对象EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);List<Emp> emps = empMapper.select();for (Emp emp:emps){System.out.println(emp);}}
}

Mybatis官方推荐使用mapper代理方式开发mapper接口,程序员不用编写mapper接口实现类,使用mapper代理方法时,输入参数可以使用pojo包装对象或map对象,保证dao的通用性。

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

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

相关文章

海康威视-AIOT的业务转型

海康威视的转型和定位为智能物联网&#xff08;AIoT&#xff09;解决方案和大数据服务的提供商。 公司不仅仅聚焦于其核心的视频监控业务&#xff0c;而且正在积极拓展到新的技术领域和市场。通过专注于物联感知、人工智能、大数据等技术的创新&#xff0c;对未来技术发展方向的…

ptx指令,抽象指令与架构

&#xff08;没用的问题&#xff1a;ptx如何抽象sass&#xff0c;它创造ir的方式和结果与mlir 创造ir有什么区别吗&#xff1f;&#xff09; PTX操作数类型&#xff1a; 寄存器操作数&#xff1a;在PTX中&#xff0c;寄存器用于存储临时数据&#xff0c;并在指令之间传递值。寄…

生产计划数据模型,实现能源企业数字化高效管理

随着市场经济的快速发展&#xff0c;能源企业在经济发展中的地位也随之提高。但由于能源企业在生产计划经济管理上存在指标不平衡、市场观念落后和环保意识欠缺等问题&#xff0c;导致企业的经济效益降低。目前&#xff0c;提高企业的生产计划管理是改善能源企业现状最有利的途…

计算机网络:物理层下的传输媒体概览

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

MySQL---视图

目录 一、介绍 二、语法 三、视图的更新 四、视图作用 一、介绍 视图&#xff08;View&#xff09;是一种虚拟存在的表。视图中的数据并不在数据库中实际存在&#xff0c;行和列数据来自定义视图的查询中使用的表&#xff0c;并且是在使用视图时动态生成的。 通俗的讲&#…

Git常用指令总结

Git常用指令总结 下载git&#xff0c;这个不需要交的&#xff01;&#xff01;&#xff01; 1、初始化自己的git仓库 git config --global user.name “Your name” 配置自己的用户名 git config --global user.email “mailexample.com” 配置邮箱 git config --global c…

blender记一下法线烘焙

这里主要记一下使用cage的方式 原理 看起来是从cage发射射线&#xff0c;打中高模了就把对应uv那个地方的rgb改成打中的点的normal的rgb 正事 那么首先需要一个高模 主要是几何要丰富 无所谓UV 然后一个低模&#xff0c;既然上面提到UV&#xff0c;那低模就要展UV, 展完之后…

Ambari——编译——解决解决windows和linux下phantomjs链接超时问题

您的支持是我继续创作与分享的动力源泉!!! 您的支持是我继续创作与分享的动力源泉!!! 您的支持是我继续创作与分享的动力源泉!!! 错误日志: [INFO] Copying extracted folder C:\Users\LENOVO\AppData\Local\Temp\phantomjs\phantomjs-2.1.1-windows.zip-extract-1786692…

『K8S 入门』三:资源调度

『K8S 入门』三&#xff1a;资源调度 一、Label 和 Selector 可以通过 Selector 基于 Label 匹配需要的资源 Label 标签 配置文件中&#xff08;metadata.labels&#xff09;配置 metadata: # Pod相关的元数据&#xff0c;用于描述Pod的数据name: nginx-demo #Pod的名称lab…

后端Jwt实现Token编码、解码以及axios的request请求头的Token传输方式

目录 一、什么是JWT&#xff1a; 二、Jwt的使用&#xff1a; 第一步&#xff1a;引入依赖&#xff1a; 第二步&#xff1a;配置拦截器&#xff1a;JwtInterceptor.java&#xff1a; 其中异常文件ServiceException配置如下&#xff1a; 全局异常文件GlobalException.java文…

利用Base64加密算法将数据加密解密

1. Base64加密算法 Base64准确来说并不像是一种加密算法&#xff0c;而更像是一种编码标准。 我们知道现在最为流行的编码标准就是ASCLL&#xff0c;它用八个二进制位&#xff08;一个char的大小&#xff09;表示了127个字符&#xff0c;任何二进制序列都可以用这127个字符表…

hbuilderX打包vue项目白屏问题以及element-ui的icon图标无法正常显示问题

附录一&#xff1a;hbuilderX打包vue项目白屏问题 将项目目录下的config文件夹里的index.js文件中,将build对象下的assetsPublicPath中的“/”&#xff0c;改为“./”后&#xff0c;再打包生成的 dist 文件 build: { // assetsPublicPath: /,//修改前 assetsPublicPa…

逻辑 | 逻辑先修营

学习到更新日期逻辑先修营-3常见逻辑连词及逻辑表达2024-3-23 1.形式逻辑基础1 2.形式逻辑基础2 3.常见逻辑连词及逻辑表述 4.OR相关考点 5.AND相关考点 6.逻辑箭头基本考点1 7.逻辑箭头基本考点2 8.代入逻辑推理事实真1 9.代入逻辑推理事实真2 10.形式逻辑四大基本考点…

C语言-指针问题-排序问题

题目描述 输入 10 个整数&#xff0c;将他们从小到大排序后输出&#xff0c;并给出每个元素在原来序列中的位置. 将程序需要的代码补全&#xff0c;只提交 begin 到 end 部分的代码。 #include <stdio.h> #define N 10int main() {int a[N], b[N], cnt 1, i, j, tmp;…

【Entity Framework】 EF中DbContext类详解

【Entity Framework】 EF中DbContext类详解 一、概述 DbContext类是实体框架的重要组成部分。它是应用域或实例类与数据库交互的桥梁。 从上图可以看出DbContext是负责与数据交互作为对象的主要类。DbContext负责以下活动&#xff1a; EntitySet&#xff1a;DbContext包含…

Web前端—事件循环

事件循环 事件循环浏览器的进程模型何为进程&#xff1f;何为线程&#xff1f;浏览器有哪些进程和线程&#xff1f; 渲染主线程是如何工作的&#xff1f;若干解释何为异步&#xff1f;面试题&#xff1a;如何理解JS的异步&#xff1f;JS会阻碍渲染任务有优先级吗&#xff1f;面…

宜搭低代码高级认证实操题2 faas连接器加密解密

密钥维护页-保证有一条数据 敏感信息提交页 存档页&#xff0c;只是用来存数据的审批的时候不用这个表提交数据不然会出两条 授权查看页 FaaS连接器先下载好他的示例代码然后按照要求配置好参数直接拷贝进去就行 然后需要在云开发环境里面先new一个terminal然后跑一下./builde…

Leetcode - 周赛389

目录 一&#xff0c;3083. 字符串及其反转中是否存在同一子字符串 二&#xff0c;3084. 统计以给定字符开头和结尾的子字符串总数 三&#xff0c;3085. 成为 K 特殊字符串需要删除的最少字符数 四&#xff0c;3086. 拾起 K 个 1 需要的最少行动次数 一&#xff0c;3083. 字符…

3月23日,每日信息差

&#x1f396; 素材来源官方媒体/网络新闻 &#x1f384; 首个国产单池万卡液冷算力集群投入运营&#xff0c;满足万亿级大模型训练需求 &#x1f30d; 快手电商正式启动兴农计划 &#x1f30b; 360AI浏览器APP即将上线&#xff0c;支持500万字长文本处理 &#x1f381; 安卓 1…

如何在没有备份的情况下恢复 Android 上已删除的照片?

丢失 Android 设备上的珍贵照片可能是一场噩梦&#xff0c;尤其是在没有备份的情况下。无论是意外删除图像还是由于Android 崩溃而丢失图像&#xff0c;一想到它们可能会永远消失就令人沮丧。幸运的是&#xff0c;有多种方法可以在 Android 上恢复已删除的照片。 如何在没有备份…