Mybatis实现员工管理系统

文章目录

    • 1.案例需求
    • 2.编程思路
    • 3.案例源码
    • 4.小结

1.案例需求

在上次做的父子模块的maven以及Ajax实现人工管理系统的基础上使用Mybatis实现员工管理系统的增删改查,具体运行效果如下:
在这里插入图片描述

2.编程思路

Mybatis框架的一般执行流程:

  1. 创建MyBatis 配置文件mybatis-config.xml在里面加载数据源、事务等,管理映射文件
  2. 创建需要的映射文件mapper.xml,用于映射表中列和实体属性的关系
  3. 定义SQL语句,在上一步的文件中加载。或者使用注解直接在Dao层写SQL语句
  4. 创建会话工厂。(SqlSessionFactory),数据库连接池
  5. 创建会话(SqlSession),连接对象
  6. 通过Executor 操作数据库
  7. 输入参数和输出结果

3.案例源码

因为其他的代码都没有改变,所以这里只展示一下使用Mybatis改变部分的源码:
mybatis-config.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><!-- 1.配置数据源的环境 development:开发环境 transactionManager:事务管 dataSource:配置数据库连接信息--><!-- 加载db.properties资源文件 --><properties resource="db.properties"></properties><settings><!-- 标准的日志工厂实现类,打印sql日志 --><setting name="logImpl" value="STDOUT_LOGGING"/></settings><typeAliases><!-- package:指定类型限定包路径 --><package name="com.fs.model"/></typeAliases><environments default="development"><environment id="development"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="${driver}"/><property name="url" value="${url}"/><property name="username" value="${user}"/><property name="password" value="${password}"/></dataSource></environment></environments><!-- 2、管理映射文件 --><mappers><mapper class="com.fs.dao.EmpDao"></mapper><mapper resource="mapper/EmpAndDeptMapper.xml"></mapper><mapper class="com.fs.dao.DeptDao"></mapper></mappers>
</configuration>

Dao层代码:
DeptDao

public interface DeptDao {@Select("select * from dept")List<Dept> queryAllDept();
}

EmpDao

public interface EmpDao {@Select("select * from emp where ename=#{ename} and  password=#{password}")Emp queryEmp(@Param("ename") String ename, @Param("password") String password);@Select("select * from emp where ename=#{ename} ")Emp queryEmpByName(String ename) ;@Insert("insert into emp values(#{empno},#{ename}, #{job}, #{mgr},#{hiredate}, #{sal},#{sal},#{deptno}, #{password})")int addEmp(Emp emp);@Delete("delete from emp where empno=#{empno}")int deleteEmpById(String empno);@Select("select * from emp where empno=#{empno}")Emp queryEmpById(Integer empno);@Update("update emp set  ename=#{ename},job=#{job},mgr=#{mgr},hiredate=#{hiredate},sal=#{sal},comm=#{comm},deptno=#{deptno} where empno=#{empno}")int updateEmp(Emp emp);
}

EmpAndDeptDao(这个没使用注解开发,而是写在了mapper.xml里面)

public interface EmpAndDeptDao {List<EmpAndDept> queryAllEmps(EmpVo empVo);
}

对应的mapper.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.fs.dao.EmpAndDeptDao"><!-- 映射文件:通过sql语句来映射表中的列和模型中的属性关系 namespace:映射文件的命名空间id:sql功能名称,不能重复,类似于类中的方法定义 resultType:返回类型 如果表中列名和属性名不一致 列名 as 属性名: 映射关系 --><select id="queryAllEmps" resultType="EmpAndDept" parameterType="com.fs.vo.EmpVo">select emp.*,dept.dname from emp INNER JOIN dept on emp.deptno=dept.deptno<where><if test="dname!=null">and dname like '%${dname}%'</if><if test="job!=null">and job like '%${job}%'</if><if test="sal!=0">and sal > #{sal};</if></where></select>
</mapper>

对应service实现类的代码如下:
DeptServiceImpl:

public class DeptServiceImpl implements DeptService {SqlSessionFactory sqlSessionFactory = BuilderSessionFactory.getSqlSessionFactory();SqlSession session = sqlSessionFactory.openSession();DeptDao mapper = session.getMapper(DeptDao.class);@Overridepublic List<Dept> queryAllDept() {return mapper.queryAllDept();}
}

EmpAndDeptServiceImpl:

public class EmpAndDeptServiceImpl implements EmpAndDeptService {SqlSessionFactory sqlSessionFactory = BuilderSessionFactory.getSqlSessionFactory();@Overridepublic List<EmpAndDept> queryAllEmps(EmpVo empVo) {SqlSession session = sqlSessionFactory.openSession();EmpAndDeptDao mapper = session.getMapper(EmpAndDeptDao.class);List<EmpAndDept> empAndDepts = mapper.queryAllEmps(empVo);for (EmpAndDept empAndDept : empAndDepts) {System.out.println(empAndDept);}session.close();return empAndDepts;}

EmpServiceImpl:

public class EmpServiceImpl implements EmpService {SqlSessionFactory sqlSessionFactory = BuilderSessionFactory.getSqlSessionFactory();SqlSession session = sqlSessionFactory.openSession(true);EmpDao mapper = session.getMapper(EmpDao.class);@Overridepublic int queryEmp(String ename, String password) {Emp emp = mapper.queryEmp(ename, password);if (emp!=null){return 0;}return 1;}@Overridepublic Emp queryEmpByName(String ename) {return mapper.queryEmpByName(ename);}@Overridepublic int addEmp(Emp emp) {return mapper.addEmp(emp);}@Overridepublic int deleteEmpById(String empno) {/*int i = mapper.deleteEmpById(empno);session.commit();*/return mapper.deleteEmpById(empno);}@Overridepublic Emp queryEmpById(Integer empno) {return mapper.queryEmpById(empno);}@Overridepublic int updateEmp(Emp emp) {return mapper.updateEmp(emp);}}

4.小结

以上就是用Mybatis在上次做的父子模块的maven以及Ajax基础上实现的员工管理系统的增删改查功能。此外补充一点Mybatis面试时常考的题:

  1. 什么是MyBatis
    (1)Mybatis是一个半ORM(对象关系映射)框架,它内部封装了JDBC,开发时只需要关注SQL语句本身,不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。程序员直接编写原生态sql,可以严格控制sql执行性能,灵活度高。
    (2)MyBatis 可以使用 XML 或注解来配置和映射原生信息,将 POJO映射成数据库中的记录,避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。
    (3)通过xml 文件或注解的方式将要执行的各种 statement 配置起来,并通过java对象和
    statement中sql的动态参数进行映射生成最终执行的sql语句,最后由mybatis框架执行sql并将结果映射为java对象并返回。(从执行sql到返回result的过程)。
  2. 说说MyBatis的优点和缺点
    优点:
    (1)基于SQL语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任何影响,SQL写在XML里,解除sql与程序代码的耦合,便于统一管理;提供XML标签,支持编写动态SQL语句,并可重用。
    (2)与JDBC相比,减少了50%以上的代码量,消除了JDBC大量冗余的代码,不需要手动开关连接;
    (3)很好的与各种数据库兼容(因为MyBatis使用JDBC来连接数据库,所以只要JDBC支持的数据库MyBatis都支持)。
    (4)能够与Spring很好的集成;
    (5)提供映射标签,支持对象与数据库的ORM字段关系映射;提供对象关系映射标签,支持对象关系组件维护。
    缺点:
    (1)SQL语句的编写工作量较大,尤其当字段多、关联表多时,对开发人员编写SQL语句的功底有一定要求。
    (2)SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。
  3. #{}和${}的区别是什么?
  • #{}是预编译处理,${}是字符串替换。
  • Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
  • Mybatis在处理${}时,就是把${}替换成变量的值。
  • 使用#{}可以有效的防止SQL注入,提高系统安全性

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

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

相关文章

Java中的IO流-最全最基础的IO流概述和简介

IO流简介 IO是什么 Java中的IO流是用于处理数据输入和输出的核心机制。通过应用IO流可以使Java程序能够与外部世界&#xff08;如磁盘文件、网络、硬件设备等&#xff09;进行数据交互。IO流的全称为输入/输出流&#xff08;Input/Output Stream&#xff09;&#xff0c;它是…

探索Python性能优化的神秘力量:Line Profiler

文章目录 探索Python性能优化的神秘力量&#xff1a;Line Profiler第一部分&#xff1a;背景第二部分&#xff1a;库简介第三部分&#xff1a;安装指南第四部分&#xff1a;基本使用方法第五部分&#xff1a;实际应用场景场景1&#xff1a;数据分析场景2&#xff1a;机器学习模…

qt-16可扩展对话框--隐藏和展现

可扩展对话框 知识点extension.hextension.cppmain.cpp运行图初始化隐藏展现--点击--详细按钮 知识点 MainLayout->setSizeConstraint(QLayout::SetFixedSize);//固定窗口大小 extension.h #ifndef EXTENSION_H #define EXTENSION_H#include <QDialog>class Extens…

腾讯2025校招不需要笔试了!速来投递!付内推

速报&#xff01;互联网扛把子腾讯 开放2025全球校招 想进鹅厂的同学请注意❗❗❗ 本次校招有重要流程变化 一起来看看今年鹅厂校招的三大重要变化。 1️⃣笔面流程变化&#xff1a;取消统一笔试 本次腾讯校招最重要的变化就是取消统一笔试&#xff08;在线测试未取消&am…

如何将图片上不需要的部分裁剪掉?裁剪图片的8种方法介绍

如何将图片上不需要的部分裁剪掉&#xff1f;在现代视觉媒体中&#xff0c;图片的质量和构图直接影响到信息传达的效果和观众的视觉体验。图片裁剪的目的是将图像的某些区域去除&#xff0c;从而专注于更重要的部分。这种处理方式常用于去除背景中的干扰元素、调整画面的比例、…

车牌号字符检测系统源码分享 # [一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]

车牌号字符检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 研究背景与意义 随着智能交通系统的快速发展&#xff0c;车牌号字…

开放式耳机音质好吗?2024热门耳机选购推荐!

开放式耳机的音质是否好&#xff0c;很大程度上取决于具体的产品型号和品牌&#xff0c;以及它们所采用的声学技术和驱动单元。根据搜索结果&#xff0c;市面上一些开放式耳机提供了不错的音质体验&#xff0c;尤其是在高音和中音方面表现出色&#xff0c;同时也有几款在低音方…

电梯节能 回馈装置

1、产品介绍 PFE系列电梯能量回馈装置是加拿大技术制造的电梯专用高性能回馈制动单元。 自2004年8月&#xff0c;近20年间&#xff0c;我们的产品历经六次重大设计改进、21次细节设计改进、105次微小技术改进&#xff0c;已经是第六代产品。 电梯变频回馈行业【优秀】水平&a…

Clipper2Lib的安装使用(新手友好)

Clipper2简介 Clipper2 库执行简单和复杂多边形的交集、并集、差集 和 异或 布尔操作&#xff0c;同时也执行多边形偏移。作者在十年前编写的原始 Clipper 库的重大更新版&#xff0c;现在称之为 Clipper1。尽管 Clipper1 仍然运行得很好&#xff0c;但 Clipper2 在各个方面都…

PC6402恒频DC-DC降压开关2A输出电流SOT23-5封装

PC6402是1.0MHz的恒定频率&#xff0c;电流模式降压转换器。这是理想的适用于要求非常高的便携式设备单电池锂离子电流高达2A电池&#xff0c;同时仍达到90%以上峰值负载条件下的效率。这个PC6402还可以以100%的占空比运行低压差运行&#xff0c;延长电池寿命轻载运行时的便携式…

拼车系统开发方案

一、项目背景 随着城市化进程的加快和私家车数量的激增&#xff0c;交通拥堵和环境污染问题日益严峻。拼车作为一种绿色、经济的出行方式&#xff0c;逐渐成为缓解这些问题的重要途径。开发一个高效、安全、便捷的拼车系统不仅有助于提升出行效率&#xff0c;还能减少交通拥堵…

昇腾AI BOX强势来袭,欧拉系统加持,定义边缘计算新标准!

随着CentOS官方宣布停止维护&#xff0c;用户在系统维护方面面临严峻挑战&#xff0c;急需稳定且兼容的替代方案。在国产化浪潮中&#xff0c;华为欧拉&#xff08;openEuler&#xff09;系统凭借其开放的社区模式与全球开发者共建的多元化软件生态&#xff0c;成为国内开发者的…

找了这么久的nicovideo视频下载方式,终于被我遇到啦

各位二次元的宝子们有福啦&#xff0c;看看我发现了什么宝贝&#xff0c;一个可以保存nicovideo视频的宝藏神器。还能选择需要的分辨率&#xff0c;下载的视频都超级清晰的。终于能实现在nicovideo保存视频自由啦&#xff0c;操作也是十分简单&#xff0c;我只看了一遍就学会了…

苹果手机黑屏打不开怎么办?几个小招定位和解决问题

苹果手机有时候会遇到一些让人头疼的问题&#xff0c;比如黑屏开不了机。这种情况可能是由多种原因造成的&#xff0c;有些是软件方面的&#xff0c;有些是硬件方面的。本文将为您介绍苹果黑屏开不了机的常见原因和解决方法&#xff0c;希望能够帮助您恢复您的手机正常使用。 一…

stm32—SPI

1. SPI 是什么 SPI (Serial Peripheral Interface)&#xff1a;是由美国摩托罗拉公司(Motorala)最先推出的一种同步全双工串行传输规范&#xff0c;也是一种单片机外设芯片串行扩展接口 SPI 接口主要应用在 EEPROM&#xff0c;FLASH&#xff0c;实时时钟&#xff0c; AD转换器&…

树莓派5 笔记26:ollama大型语言模型_中文输入法_Python_espeak文字转语音

今日继续学习树莓派5 8G&#xff1a;&#xff08;Raspberry Pi&#xff0c;简称RPi或RasPi&#xff09; 本人所用树莓派4B 装载的系统与版本如下: 版本可用命令 (lsb_release -a) 查询: Opencv 与 python 版本如下&#xff1a; 下载大语言模型&#xff0c;下载中文输入法&#…

基于vue框架的比赛门票出售的系统12lh6(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;用户,赛事类型,赛事信息,比赛队伍,比赛结果 开题报告内容 基于Vue框架的比赛门票出售系统开题报告 一、研究背景与意义 随着体育产业的蓬勃发展&#xff0c;各类体育赛事如雨后春笋般涌现&#xff0c;吸引了全球亿万观众的关注与参与…

【简历】25届西南某211JAVA简历:大厂面试官一看到DDD,肯定笑崩了

注&#xff1a;为保证用户信息安全&#xff0c;姓名和学校等信息已经进行同层次变更&#xff0c;内容部分细节也进行了部分隐藏 简历说明 今天来看一份25届西南某大学211硕士的Java简历&#xff0c;学校这块就是一个正常的211&#xff0c;在大厂的话211和普通985&#xff0c;…

Java 3.1 - 计算机网络

目录 OSI 七层协议是什么&#xff1f;每一层的作用是什么&#xff1f; TCP / IP 四层模型是什么&#xff1f;每一层的作用是什么&#xff1f; 应用层&#xff08;Application Layer&#xff09; 传输层&#xff08;Transport Layer&#xff09; 网络层&#xff08;Network …

探索数据结构:图(二)之图的遍历,Kruskal与Prim算法

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;数据结构与算法 贝蒂的主页&#xff1a;Betty’s blog 1. 图的遍历 图的遍历方式一般分为两种&#xff1a;深度优先遍历与广度…