「Mybatis实战八」:Mybatis的dao层开发使用 - 传统开发方式

一、传统开发方式

1、基础工程代码

  1. 数据库环境

    CREATE DATABASE `mybatis_db`;
    USE `mybatis_db`;
    CREATE TABLE `user` (
    `id` INT(11) NOT NULL AUTO_INCREMENT,
    `username` VARCHAR(32) NOT NULL COMMENT '用户名称',
    `birthday` DATETIME DEFAULT NULL COMMENT '生日',
    `sex` CHAR(1) DEFAULT NULL COMMENT '性别',
    `address` VARCHAR(256) DEFAULT NULL COMMENT '地址',PRIMARY KEY (`id`)
    ) ENGINE=INNODB DEFAULT CHARSET=utf8;-- insert.... 
    INSERT INTO USER(id,username,birthday,sex,address) VALUES (1,'张三','2024-01-01 00:00:00','男','北京'),(2,'李四','2023-01-01 00:00:00','男','上海');
    

在这里插入图片描述

  1. pom依赖

    <?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>org.example</groupId><artifactId>mybatis-dao</artifactId><version>1.0-SNAPSHOT</version><!--指定编码及版本--><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><maven.compiler.encoding>UTF-8</maven.compiler.encoding><java.version>1.11</java.version><maven.compiler.source>1.11</maven.compiler.source><maven.compiler.target>1.11</maven.compiler.target></properties><!--引入相关依赖--><dependencies><!--引入mybatis依赖--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.3</version></dependency><!--引入mysql驱动--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency><!--引入junit--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version></dependency></dependencies></project>
    
  2. jdbc.properties

    jdbc.driver=com.mysql.jdbc.Driver
    jdbc.url=jdbc:mysql:///mybatis_db?useSSL=false&amp;characterEncoding=UTF-8
    jdbc.username=root
    jdbc.password=root
    
  3. SqlMapConfig.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><properties resource="jdbc.properties"></properties><typeAliases><!--方式一:给单个实体起别名-->
    <!--        <typeAlias type="domain.User" alias="user"></typeAlias>--><!--方式二:批量起别名 别名就是类名,且不区分大小写--><package name="domain"/></typeAliases><!--环境配置--><environments default="mysql"><!--使用mysql环境--><environment id="mysql"><!--使用jdbc事务管理亲--><transactionManager type="JDBC"></transactionManager><!-- 使用连接池--><dataSource type="POOLED"><property name="driver" value="${jdbc.driver}"/><property name="url" value="${jdbc.url}"/><property name="username" value="${jdbc.username}"/><property name="password" value="${jdbc.password}"/></dataSource></environment></environments><!--加载映射配置--><mappers><mapper resource="UserMapper.xml"></mapper></mappers></configuration>
    
  4. UserMapper.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="user"><!--  查询所有用户  --><select id="findAll" resultType="user">select *from user</select><!--根据id查找用户--><select id="selectById" parameterType="int" resultType="user">select * from user where id=#{id}</select><!--新增用户--><!--#{} : mybatis中的占位符,等同于JDBC中的parameterType :指定接收到的参数类型 --><insert id="save" parameterType="domain.User">insert into user(username, birthday, sex, address)values (#{username}, #{birthday}, #{sex}, #{address})</insert><!--  更新用户  --><update id="update" parameterType="domain.User">update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}</update><!--删除用户 java.lang.Integer--><delete id="delete" parameterType="int">delete from user where id = #{id}</delete></mapper>
    
  5. User类

    package domain;import java.util.Date;public class User {private Integer id;private String username;private Date birthday;private String sex;private String address;@Overridepublic String toString() {return "User{" +"id=" + id +", username='" + username + '\'' +", birthday=" + birthday +", sex='" + sex + '\'' +", address='" + address + '\'' +'}';}public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public Date getBirthday() {return birthday;}public void setBirthday(Date birthday) {this.birthday = birthday;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public String getAddress() {return address;}public void setAddress(String address) {this.address = address;}
    }

2、基于dao层的代码修改

  1. 编写UserMapper接口
package mapper;import domain.User;public interface UserMapper {public User findUserById(int id) throws Exception;
}
  1. 编写UserMapper实现
package mapper.impl;import domain.User;
import mapper.UserMapper;
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.InputStream;public class UserMapperImpl implements UserMapper {@Overridepublic User findUserById(int id) throws Exception {InputStream resourceAsStream = Resources.getResourceAsStream("SqlMapConfig.xml");SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);SqlSession sqlSession = sqlSessionFactory.openSession();//执行sqlUser user = sqlSession.selectOne("user.selectById", id);sqlSession.close();return user;}
}
  1. 测试代码

    package test;import domain.User;
    import mapper.UserMapper;
    import mapper.impl.UserMapperImpl;
    import org.junit.Test;public class MybatisTest {@Testpublic void testFindUserById() throws Exception {UserMapper mapper = new UserMapperImpl();User user = mapper.findUserById(1);System.out.println(user);}
    }
  2. 测试结果

    在这里插入图片描述

二、传统方式有哪些问题?

  1. 模板代码重复
    实现类(即DAO层的具体实现)中通常需要编写大量模板化的代码来与MyBatis的SqlSession进行交互,如打开会话、执行SQL、处理结果集以及关闭会话等。这些操作在每个DAO方法中都会出现,造成代码冗余。

  2. SQL硬编码耦合
    在Java实现类的方法中直接调用XML映射文件中的SQL statement时,往往需要硬编码具体的statement ID到Java代码中,导致了SQL语句和业务逻辑的紧密耦合,不便于维护和管理。

  3. 设计复杂性增加
    每个数据访问对象(DAO)都需要对应的接口和实现类,增加了项目的复杂性和工作量,并且使得项目架构不够简洁和易于扩展。

针对上述问题,MyBatis通过动态代理机制提供了优化方案:
MyBatis利用Java的动态代理技术,允许开发者只定义接口而不需编写其实现类。只需在接口方法上添加注解或在Mapper XML文件中配置SQL语句,MyBatis会在运行时自动生成接口的代理对象,该代理对象能够自动处理与数据库的交互过程,包括获取SqlSession、执行映射的SQL、处理结果并关闭会话等操作。这样不仅消除了模板代码重复的问题,同时也降低了SQL与Java代码之间的耦合度,使开发更加模块化和易维护。

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

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

相关文章

【2024】利用python爬取csdn的博客用于迁移到hexo,hugo,wordpress...

前言 博主根据前两篇博客进行改进和升级 利用python爬取本站的所有博客链接-CSDN博客文章浏览阅读955次&#xff0c;点赞6次&#xff0c;收藏19次。定义一个json配置文件方便管理现在文件只有用户名称,后续可加配置读取用户名称&#xff0c;并且将其拼接成csdn个人博客链接ty…

Gitlab 安装部署

目录 1、Jenkins 结合 Gitlab 构建 CI/CD 环境 CI/CD 介绍 CI/CD 流程 Jenkins 简介 GitLab 简介 项目部署方式 CI系统的工作流程 2、搭建 GitLab 安装 GitLab 配置 GitLab 修改root密码 访问 GitLab 开机自启 3、使用 GitLab 管理 GitLab 关闭 GitLab 注册功能…

Git问题处理汇总

问题1&#xff1a; 出现&#xff1a;Permission denied (publickey).fatal: Could not read from remote repository. 原因&#xff1a;服务器公钥&#xff08;publickey&#xff09;未添加至github, 所以无法识别。因而需要获取本地电脑公钥&#xff0c;然后登录github账号&a…

基于SpringBoot+Apache POI的前后端分离外卖项目-苍穹外卖(十九)

数据导出 1. 工作台1.1 需求分析和设计1.1.1 产品原型1.1.2 接口设计1.2.1 Controller层1.2.2 Service层接口1.2.3 Service层实现类1.2.4 Mapper层 1.3 功能测试 2. Apache POI2.1 介绍2.2 入门案例2.2.1 将数据写入Excel文件2.2.2 读取Excel文件中的数据 3. 导出运营数据Excel…

交友盲盒系统PHP开源的盲盒源码

源码介绍&#xff1a; 交友盲盒系统是一款基于PHP开发的开源免费盲盒系统&#xff0c;旨在为用户提供一个充满乐趣和惊喜的社交体验。该系统具有丰富的功能和灵活的扩展性&#xff0c;可以轻松地满足各种线上交友、抽奖活动等场景的需求。 安装说明&#xff1a; PHP版本&…

iptables中的SNAT、DNAT与Firewalld

目录 引言 一、SNAT与DNAT简介 &#xff08;一&#xff09;SNAT 1.SNAT的工作原理 2.SNAT的应用 &#xff08;二&#xff09;DNAT 1.DNAT的工作原理 2.DNAT的应用 二、实现NAT转换 &#xff08;一&#xff09;实现SNAT 1.配置网关服务器 2.修改网关 3.设置SNAT规则…

【leetcode】删除链接的倒数第N个节点

/*** Definition for singly-linked list.* function ListNode(val, next) {* this.val (valundefined ? 0 : val)* this.next (nextundefined ? null : next)* }*/ /*** param {ListNode} head* param {number} n* return {ListNode}*/ var removeNthFromEnd fun…

Java面试题总结8:springboot

Spring Boot自动配置原理 importConfigurationSpring spi 自动配置类由各个starter提供&#xff0c;使用ConfigurationBean定义配置类&#xff0c;放到META-INF/spring.factories下 使用Spring spi扫描META-INF/Spring.factories下的配置类 如何理解Spring Boot中Starter …

04-JNI函数

上一篇&#xff1a;03-JNI 类型和数据结构 本章是 JNI 函数的参考章节。它提供了所有 JNI 函数的完整列表。它还介绍了 JNI 函数表的具体布局。 注意&#xff1a;使用 "必须 "一词来描述对 JNI 程序员的限制。例如&#xff0c;当你看到某个 JNI 函数必须接收一个非 N…

7款炫酷的前端动画特效分享(三)(附效果图及在线演示)

分享7款好玩的前端动画特效 其中有CSS动画、SVG动画、js小游戏等等 下方效果图可能不是特别的生动 那么你可以点击在线预览进行查看相应的动画特效 同时也是可以下载该资源的 CSS3模仿四季交替动画 基于HTML5CSS3实现的卡通风格一年四季交替动画特效 以下效果图只能体现框架的…

超全Chat GPT论文修改指令

文献综述指令润色修改指令论文选题指令论文大指令研究理论指令论文致谢指令参考文献指令论文润色整体逻辑论文整体优化提问指令 1&#xff0e;文献综述指令 请你帮我写一份关于&#xff08;研究主题&#xff09;的文献综述。我的论文选题方向是 XXXX &#xff0c;我已经找到了…

Shell编程——条件测试(五)

在shell编程中&#xff0c;if语句本身不执行任何判断&#xff0c;它实际上接受一个程序作为参数&#xff0c;然后执行这个程序&#xff0c;并依据这个程序的返回值来判断是否执行相应的语句。 程序的返回值是0&#xff0c;则为真&#xff0c;反之则为假。 目录 test命令&…

YOLOv8-Openvino-ByteTrack【CPU】

YOLOv5-Openvino和ONNXRuntime推理【CPU】 YOLOv6-Openvino和ONNXRuntime推理【CPU】 YOLOv8-Openvino和ONNXRuntime推理【CPU】 YOLOv9-Openvino和ONNXRuntime推理【CPU】 注&#xff1a;YOLOv8和YOLOv9代码内容基本一致&#xff01; 全部代码Github&#xff1a;https://gith…

对于网络IO的理解

网络IO理解 首先服务端将本机地址和端口bind在listensock上&#xff0c;再用listen()去将listensock套接字设置为listen状态&#xff0c;然后调用accept&#xff0c;进入阻塞状态。如果此时有客户端请求连接&#xff0c;就是第一次握手的开始。 客户端会先调用connect来申请连…

BUUCTF crypto做题记录(13)新手向

一、[MRCTF2020]vigenere 这是一道维吉尼亚密码&#xff0c;但由于不知道密钥&#xff0c;所以我们需要采用爆破的方式。Vigenere Solver | guballa.de 答案&#xff1a;flag{vigenere_crypto_crack_man} 二、[MRCTF2020]keyboard 之前做过一个类似的题目&#xff0c;用九宫格…

97 spring 中的泛型类型注入

前言 呵呵 同样是 最近同事碰到的一个问题 他不太懂 英语, 看到的说明是 缺少一个 RedisTemplate 的实例, 但是找到了一个 RedisTemplate 的实例 呵呵 和我这里 spring 版本似乎是不太一样, 错误信息 有一些差异 以下环境基于 jdk8 spring-5.0.4-RELEASE 测试用例 BeanCon…

高效备考一级数据分析师考试《CDA Level I 实操训练营》3月30日开课!

曾经报名了考试&#xff0c;买了教程辅导书&#xff0c;却因为各种原因没有坚持学习&#xff0c;这样的经历可能让你感到沮丧和失望。但是&#xff0c;失败并不代表终结&#xff0c;而是迈向成功的必经之路。为了帮助大家能够快速学习考试相关知识&#xff0c;特别为CDA LEVEL …

transformer--解码器

在编码器中实现了编码器的各种组件&#xff0c;其实解码器中使用的也是这些组件&#xff0c;如下图&#xff1a; 解码器组成部分: 由N个解码器层堆叠而成每个解码器层由三个子层连接结构组成第一个子层连接结构包括一个多头自注意力子层和规范化层以及一个残差连接第二个子层连…

小巧且强大,一键批量操作谁不爱?

软件简介&#xff1a; 软件【下载地址】获取方式见文末。注&#xff1a;推荐使用&#xff0c;更贴合此安装方法&#xff01; 两款Office批量打印工具展现了优秀的人性化设计&#xff1a;其界面清晰、操作简便。这些工具支持Word、Excel、PPT等多种文档格式进行批量打印&#…

VMware虚拟机安装linux教程

CentOS7下载 下载 (centos.org)https://www.centos.org/download/新建虚拟机 选择自定义安装 这里要注意兼容性&#xff0c;如果是VMware12创建的虚拟机复制到VM11、10或者更低的版本会出现一不兼容的现象。如果是用VMware10创建的虚拟机在VMware12中打开则不会出现兼容性问题…