Mybatis实现员工管理系统

news2024/11/16 9:29:51

文章目录

    • 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 configuration
        PUBLIC "-//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 mapper
        PUBLIC "-//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);

    @Override
    public List<Dept> queryAllDept() {
        return mapper.queryAllDept();
    }
}

EmpAndDeptServiceImpl:

public class EmpAndDeptServiceImpl implements EmpAndDeptService {
    SqlSessionFactory sqlSessionFactory = BuilderSessionFactory.getSqlSessionFactory();

    @Override
    public 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);
    @Override
    public int queryEmp(String ename, String password) {
        Emp emp = mapper.queryEmp(ename, password);
        if (emp!=null){
            return 0;
        }
        return 1;
    }

    @Override
    public Emp queryEmpByName(String ename) {
        return mapper.queryEmpByName(ename);
    }

    @Override
    public int addEmp(Emp emp) {
        return mapper.addEmp(emp);
    }

    @Override
    public int deleteEmpById(String empno) {
        /*int i = mapper.deleteEmpById(empno);
        session.commit();*/
        return mapper.deleteEmpById(empno);
    }

    @Override
    public Emp queryEmpById(Integer empno) {
        return mapper.queryEmpById(empno);
    }

    @Override
    public 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.coloradmin.cn/o/2066887.html

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

相关文章

基于改进字典的大数据多维分析加速实践

一、背景 OLAP场景是大数据应用中非常重要的一环&#xff0c;能够快速、灵活地满足业务各种分析需求&#xff0c;提供复杂的分析操作和决策支持。B站主流湖仓使用Iceberg存储&#xff0c;通过建表优化可以实现常规千万级的指标统计秒级查询&#xff0c;这样就能快速搭建可视化报…

WRF输出结果的可视化展示与分析:以风速为例

1.前言 天气研究与预报 (WRF) 模型是一种功能强大的数值天气预报系统&#xff0c;用于模拟各种尺度的大气现象。WRF 生成大量输出数据&#xff0c;可为气象和气候研究、天气预报和环境管理提供宝贵信息。 WRF 输出数据通常存储在 netCDF 文件中&#xff0c;其中包含具有不同单位…

AI生成PPT怎么用?5款AI PPT工具助你轻松制作演示文稿

当你站在山西应县木塔之下&#xff0c;仰望这座千年古塔的雄伟与震撼&#xff0c;心中不禁涌起一股对历史与建筑艺术的敬畏之情。 想象一下&#xff0c;如果将这份震撼与敬仰融入到你的演示文稿中&#xff0c;那将是多么引人入胜的体验。而这一切&#xff0c;只需借助AI生成PP…

Kubernetes 运维工程师必备:K8s 基础面试题精编(三)

Kubernetes 运维工程师必备:K8s 基础面试题精编(三) 1. 在Kubernetes集群中如何查看Pod的日志?2. 如何将一个已经部署的应用程序从一个命名空间迁移到另一个命名空间?3. 如何更新Kubernetes集群中的应用程序镜像版本?4. 如何通过Kubernetes进行自动扩容?5. 如何手动扩容…

震惊!!大模型玩转JS逆向

不知道大家有没有被JS代码混淆折磨过&#xff0c;我之前搞爬虫的时候&#xff0c;也经常被OB代码混淆搞到心态崩溃&#xff0c;但是自从接触了大模型&#xff0c;腰不疼了&#xff0c;腿不酸了&#xff0c;OB代码直接交给大模型&#xff0c;简直不要太爽 这是一段经过OB混淆之…

盘点12个国内外主流CRM系统,哪一个能免费试用?

客户关系管理&#xff08;CRM&#xff09;系统已成为企业成功的关键工具。它们不仅帮助企业改善客户关系&#xff0c;还提高了销售效率和业务分析能力。在众多选择中&#xff0c;我们特意盘点了12个国内外主流的CRM系统&#xff0c;从地位、业务应用以及特点三方面进行解析&…

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

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

代码随想录算法训练营第 50 天 |98. 所有可达路径

代码随想录算法训练营 Day50 代码随想录算法训练营第 50 天 |98. 所有可达路径 目录 代码随想录算法训练营前言LeetCode98. 所有可达路径 一、图论基础概念1、图的种类2、度3、连通性&#xff1a;节点的连通情况4、图的构造5、图的遍历方式 二、深度优先搜索1、深度优先搜索的…

最全诗词近10万诗词大全ACCESS\EXCEL数据库

其实破解弄到这个数据库我没有多少喜悦&#xff0c;原因是我已有的一些诗词比如全唐诗、全宋词等加起来的话也差不多这个数&#xff0c;但是因为这个数据库是完整破解的&#xff0c;比自己用已有的诗词数据库整合来说更加的好&#xff1b; 分类情况统计&#xff1a;汉代诗词&am…

v500大程序之IIC调试

虽然写的是IIC&#xff0c;但其实在system bd中并没有勾选IIC0、IIC1&#xff0c;而是根据IIC协议写了相关的函数&#xff08;不是我写的&#xff09;。 用到的RTC是DS3231芯片。 目前遇到的问题是&#xff1a; zynq调试成功&#xff1b;fmql调试失败&#xff0c;其中年、日、…

【AD24报错】原理图编译后出现Off grid ## at的解决方案

【AD24报错】原理图编译后出现Off grid ## at的解决方案 在使用AD24进行原理图设计过程中&#xff0c;编译时出现Off grid ## at…错误。 1 错误原因 &#xff08;1&#xff09;元件放置不准确 在放置元件时&#xff0c;如果没有将元件的引脚或中心点准确地放置在网格点上&…

进程的创建、终止

目录 前言1. 进程创建2. 进程终止3. exit && _exit 的异同3.1 相同点3.2 不同点 前言 紧接着进程地址空间之后&#xff0c;我们这篇文章开始谈论进程控制相关的内容&#xff0c;其中包括进程是如何创建的&#xff0c;进程终止的几种情况&#xff0c;以及进程异常终止的…

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

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

域控ntdsutil修改架构、域命名、PDC、RID、结构主机

#笔记记录# 五大操作主机角色 架构主机&#xff08;schema master&#xff09;域命名主机&#xff08;naming master&#xff09;RID主机&#xff08;RID master&#xff09;基础架构主机&#xff08;infrastructure master&#xff09;PDC仿真器主机&#xff08;PDC&#xf…

算法力扣刷题记录 八十九【332.重新安排行程】

前言 回溯章节第13篇。 记录 八十九【332.重新安排行程】 一、题目阅读 给你一份航线列表 tickets &#xff0c;其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机票都属于一个从 JFK&#xff08;肯尼迪国际机场&am…

全网最全的Fiddler抓包的详细教学-直接收藏!

一、Fiddler与其他抓包工具的区别 c 2、Wireshark是通用的抓包工具&#xff0c;能获取HTTP&#xff0c;也能获取HTTPS&#xff0c;但是不能解密HTTPS&#xff0c;所以wireshark看不懂HTTPS中的内容&#xff0c;但如果是TCP、UDP协议可以用wireshark&#xff1b; 3、Httpwatch也…

豆包大模型迎来多维升级:综合性能提升20.3% 零售、汽车等行业落地提速

2024年无疑是科技行业公认的“AI大模型落地元年”&#xff0c;大模型应用的供需关系正在经历着前所未有的变化。 与过去AI厂商单方面探索应用场景的做法不同&#xff0c;今年我们见证了更多的重要行业和头部企业&#xff0c;在降本提效、以技术驱动新发展和新升级的需求之下&a…

AI开发者大赛 | 6道算法赛题上新

2024 AI开发者大赛正在如火如荼地进行着&#xff0c;本届比赛吸引了全球范围内的众多优秀开发者参与其中&#xff0c;用代码书写未来&#xff0c;用算法改变世界。 如今&#xff0c;算法赛新一批赛题上线&#xff0c;无论是初学者还是资深开发者&#xff0c;你都可以在2024 AI…

vue3实现系统tab标签页面切换

功能&#xff1a; 支持刷新当前、关闭其他、关闭全部、关闭当前支持打开多个相同path不同路由参数的页面&#xff0c;将fullPath作为路由页面唯一值 UI组件&#xff1a; 使用的是element-plus中的el-tab组件&#xff0c;结构目录如下 代码实现&#xff1a; 下面是 TagsView…

MATLAB水果分级系统

课题介绍 现在商业行为中&#xff0c;在水果出厂前都需要进行质量检测&#xff0c;需要将不同等级的水果进行分级包装&#xff0c;以保证商业利益最大化。可是传统方法都是依靠人工进行检测&#xff0c;效率低下&#xff0c;主观成分大&#xff0c;并不能很好客观地评价出货质…