• Spring、MyBatis框架和Redis数据库介绍 第2关:Mybatis框架简介


    目录

    任务描述

    相关知识

    Mybatis 简介

    MyBatis简单使用

    编程要求

    测试说明

    参考代码 


    任务描述

    本关任务:学习MyBatis框架的基础使用,通过MyBatis框架向MySQL数据库中插入和删除数据。

    相关知识

    Mybatis 简介

    MyBatis的前身是 Apache 的开源项目iBatisiBatis一词来源于internetabatis的组合,是一个基于Java的持久层框架。2010 年这个项目由Apache software foundation 迁移到 Google code,并更名为MyBatis。 2013 年 11 月, MyBatis源代码迁移到GitHub网站上,目前由GitHub提供维护。

    MyBatis的优势在于灵活,它几乎可以代替JDBC,避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。同时提供了接口编程。目前MyBatis的数据访问层 DAO (Data Access Objects))是不需要实现类的,它只需要一个接口和XML(或者注解)。MyBatis提供自动映射、动态SQL、级联、缓存、注解、代码和SQL分离等特性,使用方便,同时也可以对SQL进行优化。因为其具有封装少、映射多样化、支持存储过程、可以进行SQL优化等特点,使得它成为了国内Java 互联网中首选的持久框架。

    MyBatis简单使用

    MyBatis作为持久层框架,会涉及数据库。我们首先定义一个数据库表一一角色表(role),其结构如图示。

    图1 角色表

    根据这个角色表,我们可以定义一个POJO(Plan Ordinary Java Object),使它的字段和这张表定义的字段一一对应起来,如下面代码所示。

    1. //对应数据库中表role的Role类
    2. public class Role
    3. {
    4. private Integer id;
    5. private String roleName;
    6. private String remark;
    7. /** setter and getter 方法忽略**/
    8. }

    Mybatis和其他持久层框架都是依靠某种方法,将数据库的表和POJO映射起来的,这样我们就可以通过操作POJO 来完成相关的数据库操作逻辑,同时我们把POJO对象和数据库表相互映射的框架称为对象关系映射(Object Relational Mapping,ORM)框架。要将POJO和数据库映射起来需要给这些框架提供映射规则,所以下一步要提供映射的规则,如下图所示。

    图2 映射规则

    MyBatis支持XML和注解两种方式提供映射规则,这里采用XML方式。下面的XML配置文件指定了数据库表rolePOJO对象Role对应起来的规则。

    1. update role
    2. set roleName = #{roleName,jdbcType=VARCHAR},
    3. remark = #{remark,jdbcType=VARCHAR}
    4. where id = #{id,jdbcType=INTEGER}

    这里resultMap元素用于定义映射规则,指定POJO中的属性和数据库表中的对应关系,而增、删、查、改对应着insertdeleteselectupdate四个元素。要注意的是,mapper元素中的namespace属性要和一个接口的全限定名保持一致,这里的接口是RoleMapper,而里面SQL元素的id要和接口定义的方法名完全保持一致,定义MyBatis映射文件RoleMapper,代码如下。

    1. public interface RoleMapper {
    2. Role selectByPrimaryKey(Integer id);
    3. int updateByPrimaryKey(Role record);
    4. }

    selectByPrimaryKey中,我们传递的参数是Integer类型的id,这与 XML 文件中parameterType的值是对应起来的。把传递给selectByPrimaryKey的参数赋值给SQL语句,采用的方式是#{列名,列的数据类型}Mybatis框架会自动完成参数的赋值工作。

    我们可以看到,定义的MyBatis映射文件是一个接口,那要不要创建一个接口的实现类呢?答案是不需要。定义了映射规则(XML文件)和映射文件(Java接口),接下来就可以完成对角色类的增、删、改和查,如下代码片段所示。

    1. public class MybatisTest {
    2. public static void main(String[] args) {
    3. SqlSessionFactory sqlSessionFactory = null;
    4. SqlSession sqlSession = null;
    5. try {
    6. //mybatis-config.xml里指定所使用的MySQL地址和数据库信息
    7. Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
    8. sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
    9. sqlSession = sqlSessionFactory.openSession();
    10. // 上面代码是获取MyBatis操作数据库的session对象
    11. //操作数据库开始
    12. //先获取对应的RoleMapper对象
    13. RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
    14. //查询表role中id为1的记录
    15. Role role = roleMapper.selectByPrimaryKey(1);
    16. //输出查询结果
    17. System.out.println(role);
    18. } catch (Exception e) {
    19. e.printStackTrace();
    20. } finally {
    21. //关闭session对象,释放数据库连接
    22. if (null != sqlSession) {
    23. sqlSession.commit();
    24. sqlSession.close();
    25. }
    26. }
    27. }
    28. }

    可以看到,在获取了表role对应的RoleMapper类的对象后,操作数据库就只需要调用RoleMapper的方法即可。

    编程要求

    框架的相关依赖已经配置好,请根据提示,在右侧编辑器补充 Begin-End 区间代码,完成通过 MyBatis 对role表插入和删除功能。

    • RoleMapper.java中声明两个方法,插入数据的方法int insertRole(Role record)和通过主键id删除表role中记录的方法int deleteById(int id)
    • XML映射文件中补全insertRoledeleteById两个方法对应的映射规则。

    测试说明

    测试代码首先会调用insertRole方法插入数据,然后调用selectByPrimaryKey方法查询插入的数据,最后调用deleteById方法删除: 预期输出:

    1. Role{id=1001, RoleName='RoleName1001', remark='remark1001'}
    2. 测试通过

    测试框架主要代码如下:

    1. RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
    2. //定义一个role对象
    3. Role insertRole=new Role();
    4. insertRole.setId(1001);
    5. insertRole.setRoleName("RoleName1001");
    6. insertRole.setRemark("remark1001");
    7. //插入role对象
    8. roleMapper.insertRole(insertRole);
    9. //通过id查询,是否插入成功
    10. Role role = roleMapper.selectByPrimaryKey(1001);
    11. System.out.println(role);
    12. //删除操作
    13. roleMapper.deleteById(1001);
    14. //查询是否删除成功
    15. role = roleMapper.selectByPrimaryKey(1001);
    16. if(role==null){
    17. System.out.println("测试通过");
    18. }

    参考代码 

    RoleMapper.java

    1. package net.educoder.mapper;
    2. import net.educoder.pojo.Role;
    3. public interface RoleMapper {
    4. /********** Begin *********/
    5. //插入数据
    6. int insertRole(Role record);
    7. //通过id删除
    8. int deleteById(Integer id);
    9. /********** End *********/
    10. //查询
    11. Role selectByPrimaryKey(Integer id);
    12. //更新
    13. int updateByPrimaryKey(Role record);
    14. }

    RoleMapper.xml

    1. <?xml version="1.0" encoding="UTF-8"?>
    2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    3. <mapper namespace="net.educoder.mapper.RoleMapper">
    4. <resultMap id="BaseResultMap" type="net.educoder.pojo.Role">
    5. <id column="id" jdbcType="INTEGER" property="id" />
    6. <result column="roleName" jdbcType="VARCHAR" property="roleName" />
    7. <result column="remark" jdbcType="VARCHAR" property="remark" />
    8. </resultMap>
    9. <!--在Begin和End之间补充代码-->
    10. <!-- ********** Begin ********* -->
    11. <!--删除元素,id对应RoleMapper中的insertRole方法-->
    12. <insert id="insertRole" parameterType="net.educoder.pojo.Role">
    13. insert into role
    14. values (#{id,jdbcType=INTEGER},#{roleName,jdbcType=VARCHAR},#{remark,jdbcType=VARCHAR})
    15. </insert>
    16. <!--删除元素,id对应RoleMapper中的deleteById方法-->
    17. <delete id="deleteById" parameterType="java.lang.Integer">
    18. delete from role where id = #{id, jdbcType=INTEGER}
    19. </delete>
    20. <!-- ********** End ********* -->
    21. <!-- 通过select元素声明一个查询语句-->
    22. <select id="selectByPrimaryKey" parameterType="java.lang.Integer" resultMap="BaseResultMap">
    23. select
    24. id, roleName, remark
    25. from role
    26. where id = #{id,jdbcType=INTEGER}
    27. </select>
    28. <!-- 通过update元素声明一个更新语句-->
    29. <update id="updateByPrimaryKey" parameterType="net.educoder.pojo.Role">
    30. update role
    31. set roleName = #{roleName,jdbcType=VARCHAR},
    32. remark = #{remark,jdbcType=VARCHAR}
    33. where id = #{id,jdbcType=INTEGER}
    34. </update>
    35. </mapper>

     

  • 相关阅读:
    [附源码]计算机毕业设计JAVAjsp在线购物商城
    新南威尔士大学研究团队延长量子相干时间实现基准增长100倍
    安装GCC教程
    向npm发包
    我终于体会到了:代码竟然不可以运行,为什么呢?代码竟然可以运行,为什么呢?
    SpringBoot项目中使用Logback输出json格式日志
    二十九.国民技术MCU开发之ADC应用案例 --可天士红外PSD测距获取
    (2023|CVPR,中文,扩散,知识增强,去噪专家组合)ERNIE-ViLG 2.0:利用知识增强的去噪专家组合改进文本到图像扩散模型
    华为设备配置RSVP认证
    Encrypt 加密/解密
  • 原文地址:https://blog.csdn.net/ycq0_9/article/details/127798969