首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MyBatis入门笔记

MyBatis入门笔记

作者头像
Breeze.
发布于 2022-06-08 10:34:19
发布于 2022-06-08 10:34:19
56300
代码可运行
举报
运行总次数:0
代码可运行

MyBatis介绍

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

框架优点
  • 提高开发效率
  • 统一的编码规则,利于团队管理
  • 灵活配置的应用,拥有更好的维护性
SSM开发框架
MyBatis开发流程
单元测试与JUnit 4

单元测试

  1. 单元测试是指对软件中的最小可测试单元进行检查和验证
  2. 测试用例是指编写一段代码对已有功能(方法)进行校验
  3. JUnit 4是Java中最著名的单元测试工具,主流IDE内置支持

JUnit 4使用方法:

  1. 引入JUnit Jar包或增加Maven依赖
  2. 编写测试用例验证目标方法是否正确运行
  3. 在测试用例上增加@Test注解开始单元测试

MyBatis基本使用

MyBatis配置

  • MyBatis采用XML格式配置数据库环境信息
  • MyBaits环境配置标签
  • environment包含数据库驱动、URL、用户名与密码

(47条消息) Mybatis连接池介绍与分类 Mybatis使用POOLED UNPOOLED配置连接池的原理分析_韦恩少爷的背的博客-CSDN博客_pooled

SqlSessionFactory
  • SqlSessionFactory是MyBatis的核心对象
  • 用于初始化MyBatis,创建SqlSession对象
  • 保证SqlSessionFactory在应用中全局唯一
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//利用Reader加载classpath下的mybatis-config.xml核心文件
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
//初始化SqlSessionFactory对象,同时解析mybatis-config.xml文件
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
System.out.println("sqlSessionFactory加载成功");
SqlSession sqlSession = null;
try {
    //创建SqlSession对象,SqlSession是JDBC的扩展类,用于数据库交互
    sqlSession = sqlSessionFactory.openSession();
    //创建数据库连接(测试用)
    Connection connection = sqlSession.getConnection();
    System.out.println(connection);
} catch (Exception e) {
    e.printStackTrace();
} finally {
    if (sqlSession != null) {
        // 如果type="POOLED",代表使用连接池,close则是将连接回收至连接池中
        // 如果type="UNPOOLED",代表直连,close则会调用Connection.close()方法关闭连接
        sqlSession.close();
    }
}
MyBatisUtils工具类
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * MyBatisUtils工具类,创建全局唯一的SqlSessionFactory对象
 */
public class MyBatisUtils {
    // 利用static(静态)属于类不属于对象,且全局唯一
    private static SqlSessionFactory sqlSessionFactory = null;

    //利用静态块在初始化类时实例化SqlSessionFactory
    static {
        try {
            Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        } catch (IOException e) {
            e.printStackTrace();
            //初始化错误时,通同抛出异常 ExceptionInInitializerError 通知调用者
            throw new ExceptionInInitializerError(e);
        }
    }

    /**
     * openSession 创建一个新的SqlSession对象
     *
     * @return SqlSession对象
     */
    public static SqlSession openSession() {
        return sqlSessionFactory.openSession();
    }

    /**
     * 释放一个SqlSession对象
     *
     * @param session 准备释放SqlSession对象
     */
    public static void closeSession(SqlSession session) {
        if (session != null) {
            session.close();
        }
    }
}

MyBatis数据查询

SQL传参

  1. 但参数传递:使用parameterType指定参数的数据类型即可,SQL中#{value}提取参数
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void testSelectById() {
    SqlSession sqlSession = null;
    try {
        sqlSession = MyBatisUtils.openSession();
        Goods goods = sqlSession.selectOne("goods.selectById", 1520);
        System.out.println(goods.getTitle());
    } catch (Exception e) {
        throw e;
    } finally {
        MyBatisUtils.closeSession(sqlSession);
    }
}
  1. 多参数传递:使用parameterType指定Map接口,SQL中#{Key}提取参数
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void testSelectByPriceRange() {
    SqlSession sqlSession = null;
    try {
        sqlSession = MyBatisUtils.openSession();
        Map param = new HashMap();
        param.put("min", 100);
        param.put("max", 500);
        param.put("limt", 10);
        List<Goods> list = sqlSession.selectList("selectByPriceRange", param);
        for (Goods g : list) {
            System.out.println(g.getTitle() + " 价格:" + g.getCurrentPrice());
        }
    } catch (Exception e) {
        e.printStackTrace();
    } finally {
        MyBatisUtils.closeSession(sqlSession);
    }
}

多表关联查询

利用LinkedHashMap保存多表关联结果

MyBatis会将每一条记录包装为LinkedHashMap对象

key是字段名value是字段对应的值,字段类型根据表结构进行自动判断优点:易于扩展,易于使用

缺点:太过灵活,无法进行编译时检查

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!--利用LinkedHashMap保存多表关联结果
    MyBatis会将每一条记录包装为LinkedHashMap对象
    key是字段名value是字段对应的值,字段类型根据表结构进行自动判断
    优点:易于扩展,易于使用
    缺点:太过灵活,无法进行编译时检查-->
<select id="selectGoodsMap" resultType="java.util.LinkedHashMap">
    select g.*, c.category_name
    from t_goods g,
         t_category c
    where g.category_id = c.category_id;
</select>
ResultMap结果映射
  • ResultMap可以将查询结果映射为复杂类型的Java对象
  • ResultMap适用于Java对象保存多表关联结果
  • ResultMap支持对象关联查询等高级特性
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!--结果映射,id:一般为rm+单词-->
<resultMap id="rmGoods" type="pers.hua.mybatis.dto.GoodsDTO">
    <!--设置主键字段与属性映射-->
    <id property="goods.goodsId" column="goods_id"></id>
    <!--设置非主键字段与属性映射-->
    <result property="goods.title" column="title"></result>
    <result property="goods.originalCost" column="original_cost"></result>
    <result property="goods.currentPrice" column="current_price"></result>
    <result property="goods.discount" column="discount"></result>
    <result property="goods.isFreeDelivery" column="is_free_delivery"></result>
    <result property="goods.categoryId" column="category_id"></result>
    <result property="categoryName" column="category_name"/>
</resultMap>
<select id="selectGoodsDTO" resultMap="rmGoods">
    select g.*, c.category_name
    from t_goods g,
         t_category c
    where g.category_id = c.category_id;
</select>

MyBatis的数据插入、修改与删除

插入数据
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!--1. parameterType:要指向实体类,
    2. 同时在传入的时候要新增传入的数据
    3. 对于主键自动生成的情况,获取每次新产生数据ID(selectKey)-->
<insert id="insert" parameterType="pers.hua.mybatis.entity.Goods">
    INSERT INTO t_goods(title, sub_title, original_cost, current_price, discount, is_free_delivery,
    category_id)
    VALUES (#{title}, #{subTitle}, #{originalCost}, #{currentPrice}, #{discount}, #{isFreeDelivery}, #{categoryId});
    <selectKey resultType="Integer" keyProperty="goodsId" order="AFTER">
        select last_insert_id();
    </selectKey>
</insert>
selectKey和useGeneratedKeys的区别

selectKey标签用法

useGeneratedKeys属性用法

二者区别
  • selectKey标签需要明确编写获取最新主键的SQL语句
  • useGeneratedKeys属性会自动根据驱动生成对应SQL语句
应用场景
  1. selectKey适合所有的关系型数据库
  2. useGeneratedkeys只支持"自增主键"类型的数据库
更新数据
删除数据

Sql注入攻击

MyBatis两种传值方式
  • ${}文本替换,未经任何处理对SQL文本替换
  • #{}预编译传值,使用预编译传值可以预防SQL注入

MyBatis工作流程

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Mybatis知识点全总结
MyBatis 是一款优秀的持久层框架,原名叫ibatis,后来迁移到GitHub后改名为Mybatis。它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
害恶细君
2022/11/22
1.3K0
Mybatis知识点全总结
MyBatis入门案例-注解
创建sqlSessionFactory和获取sqlSession的方式是固定的,sqlSessionFactory只需要创建一次即可,因此使用工具类MyBatisUtils来封装相关操作,简化书写,后续SSM整合之后,这些对象的创建就交给spring容器管理了,不需要我们自己管理了。
用户4870038
2021/02/05
2950
MyBatis入门案例-注解
长篇预警:MyBatis入门到入土
​ 框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种认为,框架是可被应用开发者定制的应用骨架、模板。 ​ 简单的说,框架其实是半成品软件,就是一组组件,供你使用完成你自己的系统。从另一个角度来说框架一个舞台,你在舞台上做表演。在框架基础上加入你要完成的功能。 ​ 框架安全的,可复用的,不断升级的软件。
上分如喝水
2021/08/16
5550
长篇预警:MyBatis入门到入土
MyBatis进阶
日志输出级别(优先级 高到低) error: 错误 - 系统的故障日志 warn: 警告 - 存在风险或使用不当的日志 info: 一般性消息 debug: 程序内部用于调用信息 trace: 程序运行的跟踪信息
Breeze.
2022/06/13
2730
MyBatis进阶
MyBatis之Hello world(Mybatis入门)
别先生
2018/01/02
9330
开发常用MyBatis的核心配置,你能看懂几个?
注意:这些子元素必须按照由上到下的顺序进行配置,否则MyBatis在解析XML配置文件的时候会报错。
千羽
2021/12/29
6770
开发常用MyBatis的核心配置,你能看懂几个?
MyBatis入门案例-XMl
在resource目录下新建mapper目录,存放BrandMapperInterFace.xml、ProductMapperInterFace.xml
用户4870038
2021/02/05
3410
MyBatis入门案例-XMl
MyBatis官方文档-Java API
既然你已经知道如何配置 MyBatis 和创建映射文件,你就已经准备好来提升技能了。MyBatis 的 Java API 就是你收获你所做的努力的地方。正如你即将看到的,和 JDBC 相比,MyBatis 很大程度简化了你的代码并保持代码简洁,容易理解并维护。MyBatis 3 已经引入了很多重要的改进来使得 SQL 映射更加优秀。
Java架构师必看
2020/04/10
1.7K0
Mybatis | Mybatis学习笔记(上)
Maven没有在build中配置resource,导致资源读取不到,因为正常情况下,xml配置文件应该放在resources目录下,而Maven约定大于配置,所以可能读取不到
啵啵鱼
2022/11/23
9380
Mybatis | Mybatis学习笔记(上)
MyBatis-4.Java API
MyBatis 的主要 Java 接口就是 SqlSession。可以通过这个接口来执行命令,获取映射器和管理事务。 SqlSessions 是由 SqlSessionFactory 实例创建的。SqlSessionFactory 对象包含创建 SqlSession 实例的所有方法。而 SqlSessionFactory 本身是由 SqlSessionFactoryBuilder 创建的,它可以从 XML、注解或手动配置 Java 代码来创建 SqlSessionFactory。
悠扬前奏
2019/05/30
9280
Data Access 之 MyBatis(三) - SQL Mapping XML(Part C)
当实体类属性和数据库字段的差异仅仅是 "_" 时,可以通过驼峰转换或者SQL语句中起别名的方式,如果属性和字段不一致,驼峰命名法就无法使用了,而起别名的方式较为繁琐,这时候就可以使用resultMap自定义封装规则
RiemannHypothesis
2022/08/19
4090
Data Access 之 MyBatis(三) - SQL Mapping XML(Part C)
Mybatis学习笔记
单个参数:不会做特殊处理,不管写什么直接映射进去,可用基本类型,也可传pojo 多个参数时:会特殊处理,将多参数处理成map,#{}就是从map集合中获取指定的key,所以获取的时候会有提示 `Parameter 'id' not found. Available parameters are [arg1, arg0, param1, param2]` 默认--即参数可写arg1,arg2,arg3.....,或者param1,param2,param3....,现在的版本已经不用索引了,看版本把 map封装--在传参的时候明确写出参数名字,因为mybatis对参数是做map封装处理的 @param注解--key:@param注解来指定的值,#{指定的key},取出参数值,注解放在接口的方法的形参中 使用TO--来封装传输对象 pojo封装--属性是在pojo内部所有的 注意:如果传参是Collection、List或者数组,则不能用arg1,param1,使用的时候需要#{list[0]}、#{array[0]},因为mybatis会自动封装,多此一举? #{}和${}, #只能用于条件参数位置中的位置,而$能用于拼接任何地方的,比如下面只能用${} SELECT * FROM ${} ;
晚上没宵夜
2020/03/10
4770
Mybatis 手撸专栏|第4章:Mapper XML的解析和注册使用
欢迎来到《Mybatis 手撸专栏》的第4章!在本章中,我们将深入探讨 Mybatis 中 Mapper XML 的解析和注册使用。Mapper XML 是 Mybatis 配置文件中负责定义 SQL 语句和结果映射的部分,它的灵活性和易用性是 Mybatis 的核心优势之一。
啵啵肠
2023/11/07
7920
Mybatis系列第7篇:各种查询详解
Mybatis系列目标:从入门开始开始掌握一个高级开发所需要的Mybatis技能。
路人甲Java
2020/02/11
7480
MyBatis(2)——MyBatis 深入学习
编写日志输出环境配置文件 在开发过程中,最重要的就是在控制台查看程序输出的日志信息,在这里我们选择使用 log4j 工具来输出: 准备工作: 将【MyBatis】文件夹下【lib】中的 log4j 开头的 jar 包都导入工程并添加依赖。 在【src】下新建一个文件 log4j.properties 资源: # Global logging configuration # 在开发环境下日志级别要设置成 DEBUG ,生产环境设为 INFO 或 ERROR log4j.rootLogger=DEBUG
我没有三颗心脏
2018/04/26
9220
MyBatis(2)——MyBatis 深入学习
MyBatis入门
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github。
Java团长
2018/08/03
4260
java架构之路-(源码)mybatis基本使用
  我们今天先来简单了解一下我们持久层框架,mybatis的使用。而且现在的注解成为趋势,我主要说一下注解方向的使用吧(配置文件也会说)
小菜的不能再菜
2019/09/18
5590
Mybatis 入门 (二)
resultMap:当查询字段名与Bean对象属性名不一致时,需要配置resultMap与Bean属性的对应关系,才能映射
晚上没宵夜
2020/03/11
3760
MyBatis笔记
概述 MyBatis是一个持久层框架,它封装了jdbc操作的很多细节,使开发者只需关注sql语句本身,而无需关注注册驱动,创建连接等繁杂过程。它使用了ORM思想实现了结果集的封装 ORM:对象关系映射,把数据库表和实体类及实体类的属性对应起来,直接操作实体类就实现操作数据库表 环境搭建 创建Maven工程并导入坐标 <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <versi
菜鸟雷
2020/10/23
4580
MyBatis入门第一部分
MyBatis注册映射文件(resource、class、package 三者区别)
大忽悠爱学习
2021/11/15
1K0
相关推荐
Mybatis知识点全总结
更多 >
LV.1
这个人很懒,什么都没有留下~
加入讨论
的问答专区 >
技术总监架构部总经理擅长3个领域
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档