MyBatis

  • 1.使用MyBatis实现CRUD操作
    • 1.1 根据id查询信息
    • 1.2 实现存入用户信息
    • 1.3 更新用户信息
    • 1.4 删除用户信息
    • 1.5 模糊查询
    • 1.6 #{}和${}的区别
    • 1.7 parameterType和resultType
      • 1.7.1 parameterType传参
      • 1.7.2 resultType配置结果类型
      • 1.7.3 resultMap结果类型
  • 2. MyBatis较JDBC的优势

1.使用MyBatis实现CRUD操作

    CRUD:CRUD是指在做计算处理时的增加(Create)、检索(Retrieve)、更新(Update)和删除(Delete)几个单词的首字母简写。

    CRUD主要被用在描述软件系统中数据库或者持久层的基本操作功能。


1.1 根据id查询信息

在UserDao.xml中添加:

    <select id="findById" resultType="domain.User" parameterType="int">select * from user where id = #{uid}</select>
  • resultType 属性: ⽤于指定结果集的类型。
  • parameterType 属性: ⽤于指定传入参数的类型。
  • sql 语句中使⽤#{}字符: 它代表占位符,相当于原来 JDBC 部分所学的 ‘?’,都是⽤于执⾏语句
    时替换实际的数据。具体的数据是由#{}⾥⾯的内容决定的。
  • #{}中内容的写法: 由于数据类型是基本类型,所以此处可以随意写。

在UserDao中添加:

 public interface UserDao {User findById(Integer userId);}

在测试类中添加:

 @Testpublic void testFindOne() {User user = userDao.findById(41);System.out.println(user);}

输出结果:

1.2 实现存入用户信息

在UserDao.xml中添加:

    <insert id="saveUser" parameterType="domain.User"><selectKey keyColumn="id" keyProperty="id" resultType="int">select last_insert_id();</selectKey>insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})</insert>
  • ognl 表达式: 它是 apache 提供的⼀种表达式语⾔,全称是: Object Graphic Navigation Language 对象图导航语⾔。它是按照⼀定的语法格式来获取数据的。
        语法格式就是使⽤ #{对象.对象} 的⽅式#{user.username} 它会先去找 user 对象,然后在 user 对象中找到username 属性,并调⽤ getUsername()⽅法把值取出来。但是我们在 parameterType 属性上指定了实体类名称,所以可以省略 user.⽽直接写 username。

在UserDao中添加:

 public interface UserDao {int saveUser(User user);}

在测试类中添加:

    @Testpublic void testSaveUser() {User user = new User();user.setUsername("new User");user.setAddress("杭州");user.setSex("男");user.setBirthday(new Date());System.out.println("保存操作之前:" + user);userDao.saveUser(user);System.out.println("保存操作之后:" + user);}

输出结果:

1.3 更新用户信息

在UserDao.xml中添加:

    <update id="updateUser" parameterType="domain.User">update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}where id=#{id}</update>

在UserDao中添加:

 public interface UserDao {int updateUser(User user);}

在测试类中添加:

   @Testpublic void testUpdateUser() throws Exception {User user = userDao.findById(41);user.setAddress("杭州");int res = userDao.updateUser(user);System.out.println(user);}

输出结果:

1.4 删除用户信息

在UserDao.xml中添加:

    <delete id="deleteUser" parameterType="java.lang.Integer">delete from user where id = #{uid}</delete>

在UserDao中添加:

 public interface UserDao {int deleteUser(Integer userId);}

在测试类中添加:

    @Testpublic void testDeleteUser() throws Exception {int res = userDao.deleteUser(41);System.out.println(res);}

1.5 模糊查询

三种模糊查询的方式

    <select id="findByName" resultType="com.zzxx.domain.User" parameterType="com.zzxx.domain.QueryVo"><!-- select * from user where username like '%${value}%' --><!-- select * from user where username like "%"#{username}"%"; -->select * from user where username like "%"#{user.username}"%";</select>

1.6 #{}和${}的区别

  • #{}表示⼀个占位符号
    通过#{}可以实现 preparedStatement 向占位符中设置值,⾃动进⾏ java 类型和 jdbc 类型转换, #{}可以有效防⽌ sql 注⼊。 #{}可以接收简单类型值或 pojo 属性值。 如果parameterType 传输单个简单类型值, #{}括号中可以是 value 或其它名称。
  • ${}表示拼接 sql 串
    通过${}可以将 parameterType 传⼊的内容拼接在 sql 中且不进⾏ jdbc 类型转换, ${}可以接收简单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值, ${}括号中只能是 value。

1.7 parameterType和resultType

1.7.1 parameterType传参

    SQL语句传参,使⽤标签的parameterType 属性来设定。

    该属性的取值可以是基本类型引⽤类型(例如: String 类型),还可以是实体类类型(POJO 类)。同时也可以使⽤实体类的包装类


1.7.2 resultType配置结果类型

   resultType 属性可以指定结果集的类型,它⽀持基本类型实体类类型。


1.7.3 resultMap结果类型

   resultMap 标签可以建立查询的列名和实体类的属性名称不⼀致时建立对应关系。从而实现封装。

   在 select 标签中使⽤ resultMap 属性指定引⽤即可。同时 resultMap 可以实现将查询结果映射为复杂类型的 pojo,⽐如在查询结果映射对象中包括 pojo 和 list 实现⼀对⼀查询和⼀对多查询。

   <resultMap id="userMap" type="domain.User">   <id column="id" property="userId"/><result column="username" property="userName"/><result column="sex" property="userSex"/><result column="address" property="userAddress"/><result column="birthday" property="userBirthday"/></resultMap>
  • type 属性: 指定实体类的全限定类名

  • id 属性: 给定⼀个唯⼀标识,是给查询 select 标签引⽤⽤的。

  • id 标签:⽤于指定主键字段

  • result 标签:⽤于指定⾮主键字段

  • column 属性:⽤于指定数据库列名

  • property 属性:⽤于指定实体类属性名称

2. MyBatis较JDBC的优势

  1. 数据库链接创建、释放频繁造成系统资源浪费从⽽影响系统性能,如果使⽤数据库链接池可解决此问题。
    解决:在 SqlMapConfig.xml 中配置数据链接池,使⽤连接池管理数据库链接。
  2. Sql 语句写在代码中造成代码不易维护,实际应⽤ sql 变化的可能较⼤, sql 变动需要改变java 代码。
    解决:将 Sql 语句配置在 XXXXmapper.xml ⽂件中与 java 代码分离。
  3. 向 sql 语句传参数麻烦,因为 sql 语句的 where 条件不⼀定,可能多也可能少,占位符需要和参数对应。
    解决:Mybatis ⾃动将 java 对象映射⾄ sql 语句,通过 statement 中的 parameterType 定义输⼊参数的类型。
  4. 对结果集解析麻烦, sql 变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成 pojo 对象解析⽐较⽅便。
    解决:Mybatis ⾃动将 sql 执⾏结果映射⾄ java 对象,通过 statement 中的 resultType 定义输出结果的类型。

使用MyBatis实现CRUD操作相关推荐

  1. 2021年3月8日:MyBatis框架学习笔记02:利用MyBatis实现CRUD操作

    MyBatis框架学习笔记02:利用MyBatis实现CRUD操作 在第一节课中我们在UserMapper.xml里定义了两个查询语句:findById和findAll,对应的在UserMapper接 ...

  2. MyBatis教程– CRUD操作和映射关系–第1部分

    CRUD操作 MyBatis是一个SQL Mapper工具,与直接使用JDBC相比,它极大地简化了数据库编程. 步骤1:创建一个Maven项目并配置MyBatis依赖项. <project xm ...

  3. mybatis进行CRUD操作时返回值不为影响的条数,为null

    对应自己的情况多试试看,总有一种方法可以解决吧! 1.如果报期望的返回值为null而原始返回值类型为int的错误 则将Dao/mapper接口中的函数的返回值类型改为Integer,在方法调用时使用. ...

  4. 利用MyBatis实现CRUD操作

    文章目录 一.打开MyBatisDemo项目 二.查询表记录 (一)在映射器配置文件里引入结果映射元素 (二)添加按姓名查询用户记录功能 1.在UserMapper.xml里添加映射语句 - find ...

  5. MyBatis框架学习笔记02:使用MyBatis实现CRUD操作

    文章目录 Ⅰ.查询表记录 (Ⅰ).在映射器配置文件里引入结果映射元素 (Ⅱ).添加按姓名查询用户记录功能 1).在UserMapper.xml里添加映射语句 - findByName 2).在User ...

  6. MyBatis教程– CRUD操作和映射关系–第2部分

    为了说明这一点,我们正在考虑以下示例域模型: 会有用户,每个用户可能都有一个博客,每个博客可以包含零个或多个帖子. 这三个表的数据库结构如下: CREATE TABLE user (user_id i ...

  7. Mybatis实现CRUD操作

    项目实现的功能 查询所有用户信息 通过Id查询用户信息 添加用户(回显主键) 修改用户信息 删除用户信息 通过用户名字模糊查询 一.引入依赖和工程结构 <?xml version="1 ...

  8. MyBatis的CRUD操作

    MyBatis的两个主要配置文件 mytatis.xml:放在src目录下,常见的配置如下 <?xml version="1.0" encoding="UTF-8& ...

  9. 封装mybatis简化CRUD操作增强包mybatis-plugs

    mybatis非常方便我们进行数据库的增删改查,sql语句可以方便的写在xml文件里面,减少代码的耦合性,方便解耦,但是简单的增删改查都要写,当我们的业务量比较大,表字段比较多的时候写起来比较费劲,这 ...

最新文章

  1. boost::pfr::detail::offset_based_getter相关的测试程序
  2. Oracle触发器详细介绍
  3. 计算机桌面堆,桌面堆 Desktop heap设置
  4. Entity Framework Core 懒加载
  5. Java包装类和基本数据类型的对照
  6. navicat无法连接远程mysql数据库_navicat无法远程连接mysql的解决方法
  7. 局域网打印机反应慢_为什么你的Excel这么慢,这些原因必须要知道!
  8. python找到文件夹下指定文件_python实现在目录中查找指定文件的方法
  9. OSGI的远程服务管理服务
  10. layui怎样将响应数据展示在页面_layui-table对返回的数据进行转变显示的实例
  11. sap服务器安装双系统教程,Ghost安装双系统安装使用图文教程
  12. (亲测)使用cmd结束进程的3种方法
  13. Python面向对象加强4.iter与next的用法,枚举器enumerate
  14. 办公室计算机打印机共享,办公室共享连接打印机全攻略,办公人必会操作技能...
  15. win10自带看图工具找不到了怎么办?
  16. 【Windows】谷歌浏览器独立多开
  17. php获取图片rgb值,判断图片是否纯黑纯白
  18. 烂笔头笔记:favicon配置不是所有浏览器都兼容
  19. ai水墨晕染效果_AI可能是一位优秀的西方画家,但它在中国水墨画中表现良好吗?...
  20. python操作word详细操作_Python操作Word的入门教程

热门文章

  1. Tab组件【cube-ui】
  2. cmi编码实验_CMI码型变换试验
  3. 我见过有你的盛世繁华,那是毕生可遇不可求的海市蜃楼
  4. ldap 配置过程详解
  5. 【Android】Kotlin学习(一)
  6. 查询商品案例(按价格或名称查询)
  7. 习题2-5 最短路径和简单路径
  8. 组装一台多媒体计算机必须,微机组装与维护维修平时作业.doc
  9. java断言--03--JUnit断言(Asserts)
  10. 一种基于μC/OS-III及STM32的多功能控制器