从Servlet+JSP+JDBC到MyBatis:重构用户CRUD操作的高效之旅

 前言

原生的JDBC:

  • 原生的JDBC操作数据库,书写较为繁琐,降低开发效率。
  • JDBC的局限性(如代码冗余、SQL语句与Java代码紧密耦合、难以维护等)。

相比于JDBC,Mybatis的优势:

  • SQL与Java代码的分离、强大的映射能力、易于维护和扩展等。

什么是Mybatis?

MyBatis是一个用于简化数据库操作、提高开发效率的持久层框架,它允许开发者通过简单的配置和映射来直接操作数据库,而无需深入处理JDBC的繁琐细节。

简而言之,Mybatis底层是基于JDBC进行的高级别封装,在简化原生JDBC操作的基础上,提高开发效率

 重构用户的CRUD项目

使用Mybatis框架重构项目,可以提高项目的扩展性,为后续框架整合打下基础,这里我会介绍如何使用mybatis框架代替原生JDBC操作数据库的相关操作。

原来项目可以参考我的博客: 实战指南:深度剖析Servlet+JSP+JDBC技术栈下的用户CRUD操作-CSDN博客

这里我主要介绍DAO层的开发

重构步骤如下:

第一步:导入mybatis相关的依赖,和log4j依赖

pom.xml:

新增如下依赖

<!--mybatis--><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.6</version></dependency><!--log4j--><dependency><groupId>log4j</groupId><artifactId>log4j</artifactId><version>1.2.17</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-api</artifactId><version>1.7.30</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.7</version></dependency>

注意:添加log4j依赖的目的是为了在mybatis开发过程中查看sql的执行情况,以便快速定位sql的错误位置。并且添加了log4j依赖,需要导入相关的配置文件到resources

 log4j.properties

### set log levels ###log4j.rootLogger = debug,stdout 
log4j.appender.stdout = org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target = System.out
log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern =  %d %p [%c] - %m%nlog4j.logger.com.ibatis=debug
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=debug
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=debug
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=debug
log4j.logger.java.sql.Connection=debug
log4j.logger.java.sql.Statement=debug
log4j.logger.java.sql.PreparedStatement=debug,stdout

 第二步:在resources目录下创建mybatis.xml文件作为mybatis的主配置文件

mybatis.xml

(这个配置文件名称可以任意)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><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/csx_demo?serverTimezone=Asia/Shanghai&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;zeroDateTimeBehavior=convertToNull"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments></configuration>

 注意:这里的数据库名以及username和password的value值应当是自己本地mysql服务器上的数据

第三步:创建DAO层,书写与之对应的mapper.xml映射文件

UserDao:

接口和接口方法和重构之前保持差不多,目的都是定义一个实现需求的规范,无论使用JDBC还是mybatis,本质上都是对接口声明的实现。

(下面展示的接口和原本项目的接口有些不同,因为我使用mybatis时,为了保证映射关系的正确配置,将传递多个参数的情况全部封装成对象,并通过对应的对象作为参数传递)

package dao;import entity.User;
import entity.dto.UserDto;
import entity.dto.UserDtoNew;
import org.apache.ibatis.annotations.Param;import java.util.List;public interface UserDao {/*** 查看用户总条数* @return*/int selectUsersCount();/*** 分页查询用户列表* @return*/List<User> selectUserListByPage(UserDto userDto);/*** 新增用户* @param user* @return*/public int insertUser(User user);/*** 根据id查询指定用户信息* @param userId* @return*/public User selectUserByUserId(int userId);/*** 根据id删除用户信息* @param userId* @return*/public int deleteUserByUserId(int userId);/*** 修改用户数据* @param user* @return*/public int updateUser(User user);/*** 根据用户名和密码查看指定用户是否存在* @return*/public User selectUserByuserNameAndpassword(UserDtoNew userDtoNew);}

新增实体类:

UserDto:

package entity.dto;import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;import java.io.Serializable;@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class UserDto implements Serializable {private String keyword;private Integer pageIndex;private Integer pageSize;}

UserDtoNew:

package entity.dto;import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;import java.io.Serializable;@Getter
@NoArgsConstructor
@AllArgsConstructor
@Setter
public class UserDtoNew implements Serializable {private String userName;private String password;
}

新增实体类的目的是当DAO接口中方法的形参为多个时,将形参封装成对象进行传参,从而可以方便的进行Java的属性和数据库中的字段(列)进行映射。

mapper.xml:

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为映射的根节点,用来管理DAO接口 namespace指定DAO接口的完整类名,表示mapper配置文件管理哪个DAO接口(包.接口名)mybatis会依据这个接口动态创建一个实现类去实现这个接口,而这个实现类是一个Mapper对象-->
<mapper namespace="dao.UserDao"><resultMap id="userMap" type="entity.User"><id property="userId" column="user_id"/><result property="userName" column="user_name"/><result property="userPic" column="user_pic"/></resultMap><insert id="insertUser">insert into t_user (user_name,password,user_pic) values (#{userName},#{password},#{userPic})</insert><update id="updateUser">update t_user set user_name=#{userName},password=#{password},user_pic=#{userPic} where user_id=#{userId}</update><delete id="deleteUserByUserId">delete from t_user where user_id=#{userId}</delete><select id="selectUsersCount" resultType="java.lang.Integer">select count(user_id) from t_user</select><select id="selectUserListByPage" resultMap="userMap" parameterType="entity.dto.UserDto">select * from t_user where user_name like concat('%',#{keyword},'%') order by user_id desc limit #{pageIndex},#{pageSize}</select><select id="selectUserByUserId" resultMap="userMap">select * from t_user where user_id = #{userId}</select><select id="selectUserByuserNameAndpassword" resultMap="userMap">select * from t_user where user_name=#{userName} and password=#{password}</select><!--id = "接口中的方法名"parameterType = "接口中传入方法的参数类型"resultType = "返回实体类对象:包.类名"  处理结果集 自动封装注意:sql语句后不要出现";"号查询:select标签增加:insert标签修改:update标签删除:delete标签-->
</mapper>

注意:

  • 因为我使用select * 查询字段,需要配置属性和字段的映射关系,使用<resultMap>标签
  • #{}表示的是占位符的含义,这里使用它的含义和使用原生JDBC的preparedstatement预编译sql是一样的
  • 当传入的参数为一个时,#{名字可以任意},如果传入的参数是多个,#{对应类的属性名}

 第四步:将mapper.xml的配置添加到主配置文件mybatis.xml配置中

mybatis.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><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/csx_demo?serverTimezone=Asia/Shanghai&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;zeroDateTimeBehavior=convertToNull"/><property name="username" value="root"/><property name="password" value="root"/></dataSource></environment></environments><mappers><mapper resource="mapper/UserMapper.xml"></mapper></mappers></configuration>

第五步:修改servlet类,使用mybatis获取sql支持

  • 在doPost方法中通过SqlSessionfactory创建SqlSession对象,在根据SqlSession对象获取对应的Dao实现类对象(代理对象)。
  • 调用Dao接口获取sql支持
 @Overrideprotected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {SqlSession session= SqlSessionFactoryUtil.getSessionSql();UserDao userDao= session.getMapper(UserDao.class);
//...
}

获取到Dao层的对象之后,获取到对应的数据之后。剩余处理就和未重构之前的操作一样了(细节处有点差异)。

简而言之,就是JSP发送请求到Servlet,Servlet调用DAO获取数据并处理响应。 

 总结

以上就是使用mybatis替代原生JDBC重构用户CRUD项目的实现步骤,源代码我会上传到资源中

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

性能测试工具——JMeter

目录 一、JMeter介绍 1、下载安装JMeter 2、打开JMeter 方式一&#xff1a; 方式二&#xff1a; 3、JMeter基础设置 4、JMeter基本使用流程 &#xff08;1&#xff09;启动JMeter &#xff08;2&#xff09;在测试计划下添加线程组 &#xff08;3&#xff09;在 “线…

Linux权限修改及管理员权限获取

在网上看到的&#xff0c;自己当作字典记录下来 修改文件权限&#xff1a;chmod 使用 chmod 可以修改文件权限。 两种方式&#xff1a;字母法与数字法 一&#xff0c;字母法修改文件权限 例如&#xff1a;文件名为 test.x 给文件 test.x 添加所有用户都能执行的权限&#x…

CSS简明通俗教程

CSS简明通俗教程 1. CSS简介 CSS&#xff08;Cascading Style Sheets&#xff0c;层叠样式表&#xff09;是一种样式表语言。CSS用于描述HTML或XML&#xff08;包括SVG或XHTML等XML方言&#xff09;文档的呈现方式&#xff0c;它有自己的语法规则和逻辑&#xff0c;用于控制网…

年薪40W!转AI产品经理后,我明白了有人带的意义在哪!

如果你正想转岗/入行产品经理&#xff0c;我的故事或许能给你一些启示&#x1f447; 初识产品 目标有了&#xff0c;问题也有了 和很多人一样&#xff0c;毕业的时候比较迷茫&#xff0c;不知道自己喜欢什么行业、岗位… 就按照专业找了一个对口且擅长的算法工作&#xff0…

学习C#,视频、书籍、在线文档哪种是你喜欢的方式,80%的人竟然选择这个方式!

大家好&#xff0c;我是编程乐趣。 每一个人学习编程&#xff0c;选择的方式、习惯的方式可能都不一样&#xff0c;有些人喜欢买书、有些人喜欢看官方文档、有些人喜欢看视频。 哪一种方式&#xff0c;我个人认为都没问题&#xff0c;只要能获取知识就行。 下面一起看看Stac…

一带一路区块链样题解析(上)

一带一路区块链赛项样题解析 模块一 任务一:按要求完成 FISCO BCOS 区块链系统部署 (1)编写配置文档 1.根据题目设置各项要求,使用build_chain.sh离线搭建匹配的区块链,并通过命令配置各群组节点的MySQL数据库;(1分) cat >> ipconf <<EOF 127.0.0.1:3 …

基于C#+SQL Server2008实现(CS界面)学生宿舍管理系统

1 概述 本次课程设计是数据库课程设计&#xff0c;我选的是学生宿舍管理系统&#xff0c;功能块主要是宿舍管理、学生管理、出入登记和来访登记&#xff0c;目的在于将学生宿舍的管理实现信息化&#xff0c;监控学生宿舍的情况防止意外发生。 课程设计任务的需求分析 2.1设计…

中航资本:交易港股通,为什么刚买入就显示亏损?

经过港股通生意港股&#xff0c;刚买入就闪现亏本是因为买入港股时会有一个汇率差。 港股通生意选用的是港币报价、人民币结算的方式&#xff0c;港股通的参看本钱价是以港币核算的&#xff0c;触及买入时将港币换成人民币&#xff0c;卖出时将人民币换成港币的进程&#xff0…

Java语言程序设计基础篇_编程练习题18.36 (思瑞平斯基三角形)

目录 题目&#xff1a;18.36 (思瑞平斯基三角形) 代码示例 代码逻辑 1. 应用程序入口 2. GUI设置 3. 事件处理 4. 绘制逻辑 5. 递归绘制 输出结果 题目&#xff1a;18.36 (思瑞平斯基三角形) 编写一个程序&#xff0c;让用户输入一个阶数&#xff0c;然后显示填充的…

送书!一大波LLM大模型学习教程书籍

最近整理了日前市面上一大波大模型的书&#xff0c;已经打包成pdf了&#xff0c;大家有需要的&#xff0c;可以自行添加获取&#xff0c;纯福利&#xff0c;无套路&#xff0c;添加后说明是哪本书&#xff0c;会直接给大家&#xff01; &#x1f449;CSDN大礼包&#x1f381;&a…

国产SSL证书品牌怎么选择?

有人在歪曲大型央国企“信创化”与数字化转型建设思路&#xff0c;为了自身的利益开始造谣一些虚假传播信息国外SSL证书不安全问题&#xff0c;然而国外的SSL证书每个上网用户都在使用&#xff0c;然而发布虚假广告的一些人实际上是换了个马甲贴个名字就叫国产SSL证书了&#x…

等保测评误区与应对:企业常见问题解析

标题&#xff1a;等保测评误区与应对&#xff1a;企业常见问题解析 信息安全等级保护&#xff08;等保&#xff09;测评是企业信息安全建设的重要组成部分&#xff0c;但在实际操作中&#xff0c;企业常会陷入一些误区。本文将解析企业等保测评中常见的误区&#xff0c;并提出…

【Python报错已解决】IndexError: list index out of range

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 专栏介绍 在软件开发和日常使用中&#xff0c;BUG是不可避免的。本专栏致力于为广大开发者和技术爱好者提供一个关于BUG解决的经…

Flutter 之 ftcon24usa 大会,创始人分享 Flutter 十年发展史,一闪而过的鸿蒙身影

之前一直关注 Fluttercon 的相关活动&#xff0c;正如 Flutter 3.24 发布时所说&#xff0c;继 Fluttercon 欧洲之后&#xff0c;近日 Fluttercon 2024 USA 在纽约如期举行&#xff0c;大会带来了一些有趣消息和 Flutter 发展历程&#xff0c;本次也是通过 X 和 OpenWebF 创始人…

免费ppt模板哪里找?职场必备这些利器

一眨眼&#xff0c;9月份的尾声渐近&#xff0c;无论是学生还是职场人士&#xff0c;都开始准备着新一轮的演讲和报告。在这个忙碌的时期&#xff0c;一份精美的PPT模板能够大幅提升你的工作效率&#xff0c;让你的演示更加引人入胜。 不用担心高昂的版权费用&#xff0c;市场…

什么是反射,反射用途,spring哪些地方用到了反射,我们项目中哪些地方用到了反射

3分钟搞懂Java反射 一、反射是什么 在Java中&#xff0c;反射&#xff08;Reflection&#xff09;是一种强大的工具&#xff0c;它允许程序在运行时获取和操作类、接口、构造器、方法和字段等。反射是Java语言的一个重要特性&#xff0c;它为开发人员提供了许多灵活性&#xf…

单片机项目合集列表与专栏说明——Excel合集列表目录查阅(持续更新)

阿齐Archie《单片机项目合集》专栏项目 为方便查找本专栏的项目&#xff0c;特整理Excel合集列表供查阅&#xff08;可搜索或按系列查找&#xff09; 持续更新链接如下&#xff1a; 阿齐单片机项目合集 (kdocs.cn)https://www.kdocs.cn/l/cmrxCxJN05YN 打开链接如下Exce表所…

使用API有效率地管理Dynadot域名,注册域名服务器(NS)信息

前言 Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮箱&…

视频去水印 —— 释放创意,让学习与创作更自由!

&#x1f31f; 视频去水印 —— 释放创意&#xff0c;让学习与创作更自由&#xff01; 在这个短视频盛行的时代&#xff0c;抖音、快手、小红书等平台成为了创意与灵感的聚集地。你是否曾遇到过想要学习或进行二次创作&#xff0c;却被视频中的水印所困扰&#xff1f;现在&…

fo-dicom开发之DICOM数据解析:常见数据类型及处理方法详解

前言 前面的文章&#xff0c;我们介绍了fo-dicom是一个怎样的开源库&#xff1a;fo-dicom&#xff0c;第一个基于.NET Standard 2.0 开发的DICOM开源库&#xff0c;以及 学会使用fo-dicom前&#xff0c;了解其非常重要的基本概念&#xff0c;本次我们将了解&#xff0c;当进行…