文章目录
- 1.案例需求
 - 2.编程思路
 - 3.案例源码
 - 4.小结
 
1.案例需求
在上次做的父子模块的maven以及Ajax实现人工管理系统的基础上使用Mybatis实现员工管理系统的增删改查,具体运行效果如下:
 
2.编程思路
Mybatis框架的一般执行流程:
- 创建MyBatis 配置文件mybatis-config.xml在里面加载数据源、事务等,管理映射文件
 - 创建需要的映射文件mapper.xml,用于映射表中列和实体属性的关系
 - 定义SQL语句,在上一步的文件中加载。或者使用注解直接在Dao层写SQL语句
 - 创建会话工厂。(SqlSessionFactory),数据库连接池
 - 创建会话(SqlSession),连接对象
 - 通过Executor 操作数据库
 - 输入参数和输出结果
 
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面试时常考的题:
- 什么是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的过程)。 - 说说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语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。 - #{}和
${}的区别是什么? 
- #{}是预编译处理,
${}是字符串替换。 - Mybatis在处理#{}时,会将sql中的#{}替换为?号,调用PreparedStatement的set方法来赋值;
 - Mybatis在处理
${}时,就是把${}替换成变量的值。 - 使用#{}可以有效的防止SQL注入,提高系统安全性
 






![车牌号字符检测系统源码分享 # [一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]](https://i-blog.csdnimg.cn/direct/705d8c4c136744cca57e21fed340ad99.png#pic_center)












