04-Java框架-MyBatis

2023-11-01

一、MyBatis的介绍

1.1 回顾一下JDBC

下面这个代码是使用JDBC实现基于id查询员工信息,我们来分析分析有什么弊端。

public Employee selectById(Long id) {
   
    Connection conn = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    try {
   
        conn = JDBCUtils.getConnection();
        ps = conn.prepareStatement("select * from employee where id = ?");
        ps.setLong(1,id);
        rs = ps.executeQuery();
        if (rs.next()){
   
            Employee employee = new Employee();
            employee.setId(rs.getLong("id"));
            employee.setName(rs.getString("name"));
            employee.setAge(rs.getInt("age"));
            employee.setSex(rs.getInt("sex"));
            employee.setPhone(rs.getString("phone"));
            employee.setAddress(rs.getString("address"));
            employee.setCreatedate(rs.getTimestamp("createdate"));
            return employee;
        }
    } catch (SQLException e) {
   
        e.printStackTrace();
    } finally {
   
        JDBCUtils.close(conn,ps,rs);
    }
    return null;
}

弊端如下:
1、SQL代码耦合在Java代码中。
2、SQL中的参数需要自己手动设置,获得结果集后需要自己进行结果的封装。
3、每次需要自己获取连接,用完以后关闭连接。(需要Spring帮助解决)

而这些问题,都可以使用mybatis框架来解决。

2.1 MyBatis的介绍

MyBatis官网英文版:https://mybatis.org/mybatis-3
MyBatis官网中文版:https://mybatis.org/mybatis-3/zh/index.html
MyBatis整合Spring:http://mybatis.org/spring/zh/index.html

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

同时MyBatis也是一款半ORM映射的框架。

2.2 ORM介绍

ORM 是 Object Relational Mapping 的缩写,译为“对象关系映射”,它解决了对象和关系型数据库之间的数据交互问题。

在操作数据库的过程中,我们一般会为表创建一个与之对应的实体类,该类中的属性和表中的字段对应。查询一行记录时会转换为一个对象,查询多条记录时会转换为List集合。就如下图:
在这里插入图片描述
按照传统思路,比如在JDBC中,我们就得手动编写 SQL 语句,并且传递参数和结果集的封装都需要自己手动完成,而有了ORM,编程人员只要提前配置好对象和数据库表之间的映射关系,ORM 就可以自动生成 SQL 语句,并将对象中的数据自动存储到数据库中,查询的结果集也会自动封装为对象返回,无需我们进行相关的操作。

早先的Hibernate框架就是一种全自动的 ORM 框架。他能做到一行SQL都不用我们写,仅需进行表和对象关系的配置,就可以完成数据库操作。如下图:
在这里插入图片描述

而MyBatis是一个半ORM框架,因为SQL需要我们自己写。

二、MyBatis基础入门

提前准备数据库表
库名:mytest
表名:user

CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `password` varchar(100) DEFAULT NULL,
  `username` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;

2.1 导入依赖

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.6</version>
</dependency>
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.21</version>
</dependency>

2.2 创建SqlSessionFactory

咱们使用从 XML 中构建 SqlSessionFactory对象的方式。
① 准备配置文件:在resources目录中新建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>
    <!--environments:MyBatis可以配置多种连接环境(开发,测试,线上)
    default属性关联具体配置的id-->
    <environments default="development">
        <!--具体的环境配置,id必须唯一 -->
        <environment id="development">
            <!--配置事务管理器,MyBatis中有两种类型的事务管理器:JDBC和MANAGED
                JDBC: 使用了JDBC的提交和回滚功能
                MANAGED:不使用事务
            -->
            <transactionManager type="JDBC"/>
            <!--数据源相关配置
            type="POOLED" 使用mybatis自己带连接池
            type="UNPOOLED" 不使用连接池,每次都新建连接,用完关闭连接
            type="JNDI"  采用服务器提供的JNDI技术实现,获取DataSource
            -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mytest?useUnicode=true&amp;useSSL=false&amp;characterEncoding=utf8&amp;serverTimezone=Asia/Shanghai"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

② 读取配置文件,创建SqlSessionFactory对象

//1.读取配置文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//2.创建Sql会话工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);

③ 还可以将数据库连接参数(driver,url,username,password)抽离出去,职责单一化。

resources目录中新建db.propertis内容如下:

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mytest?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username=root
password=123456

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>
    <!--引入配置文件-->
    <properties resource="db.properties"></properties>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!--使用: ${key}的方式取值即可-->
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

2.3 获取SqlSession并执行SQL

① 创建User实体类

package cn.mybatis.domain;
public class User {
   
    private Integer id;
    private String password;
    private String username;
    //省略 get  set  toString
}

② 编写映射文件Mapper.xml,将SQL语句抽离到映射文件中。
resources目录新建mapper目录,在其中创建UserMapper.xml
即:resources/mapper/UserMapper.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">
<!-- namespace:命名空间,可以任意取名,但必须唯一 -->
<mapper namespace="cn.mybatis.mapper.UserMapper">
    <!-- id:用于区分sql,在当前命名空间下必须唯一,与命名空间配合定位sql。语法:命名空间.id
         parameterType:参数类型
         resultType:返回值类型
    -->
    <select id="selectById" parameterType="int" resultType="cn.mybatis.domain.User">
        select * from user where id = #{id}
    </select>
</mapper>

<!--
	说明:
	#{id}  是参数的占位符,调用时会替换为真实的id值。
-->

③ 加载UserMapper.xml文件
mybatis-config.xml 中添加配置,加载mapper映射文件

<mappers>
    <mapper resource="mapper/UserMapper.xml"></mapper>
</mappers>

④ 使用SqlSession执行sql

//1.读取mybatis配置文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//2.创建sql会话工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//3.创建sql会话对象
SqlSession session = sqlSessionFactory.openSession();
//4.执行sql
// 参数1:定位sql,命名空间.id
// 参数2:执行sql时的参数
User user = session.selectOne("cn.mybatis.mapper.UserMapper.selectById", 1);
System.out.println(user);
//5.关闭会话
session.close();

三、MyBatis实现CRUD

3.1 新增User

① 映射文件编写sql

<?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="cn.mybatis.mapper.UserMapper">
    <insert id="insert" parameterType="cn.mybatis.pojo.User">
        insert into user(username,password) values(#{username},#{password})
    </insert>
</mapper>

② 执行sql

//1.读取mybatis配置文件
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//2.创建sql会话工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//3.创建sql会话对象
SqlSession session = sqlSessionFactory.openSession();
//4.执行sql
User user = new User();
user.setUsername("张三");
user.setPassword("123456");
// 参数1:定位sql,命名空间.id
// 参数2:执行sql时的参数
session.insert("cn.mybatis.mapper.UserMapper.insert",user);
//5.提交事务(mybatis需要手动提交事务)
session.commit();
//6.关闭会话
session.close();

3.2 修改User

① 映射文件编写sql

<?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="cn.mybatis.mapper.UserMapper">
    <update id="update" parameterType="cn.mybatis.domain.User">
        update user set username=#{username},password=${password} where id = #{id}
    </update>
</mapper>

<!--
	说明:
	#{username}等占位符,取值时调用的是对象相应的get方法,#{username}就是调用getUsername()
-->

② 执行sql

//1.读取mybatis配置文件
InputStream in = Resources
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

04-Java框架-MyBatis 的相关文章

随机推荐

  • 2021-11-08

    https learnku com docs the way to go 104 tag structure 3642 https mp weixin qq com s 3sjlDFSthVK3 E54TqqUqw
  • faster-rcnn(pytorch)参数配置修改

    修改模型配置文件 train prototxt文件 input data层的num class数值由21改为类别数目 roi data层的num class数值由21改为类别数目 cls score层的num output数值由21改为类别
  • 通过Python2.7访问Oracle

    环境 Python 2 7 cx Oracle 7 3 0 instantclient basic linux x64 version zip unzip instantclient basic zip unzip d cx Oracle
  • 6.Docker Desktop 安装使用教程

    本文目录 1 前言 2 下载 Docker Desktop 3 安装 Docker Desktop 1 配置 Docker Desktop 环境 2 安装 wsl2 2 下载并安装 3 打开 Docker Desktop 的问题 1 问题一
  • 【高级CSS属性】那些年轰动一时的5个CSS高级属性(附源码)

    文章目录 写在前面 涉及知识点 1 empty选择器 1 1 应用场景及效果 1 2 代码实现 2 gap属性 2 1 应用场景及效果 2 2 代码实现 3 伪类 invalid 应用 3 1 应用场景及效果 3 2 代码实现 4 back
  • Es java分页查询列表数据

    Autowired private RestHighLevelClient client public List
  • Android 计算View的深度

    这次遇到一个需求 需要计算当前View的深度 基本上就是大学时候数据结构里求二叉树的解法 记录一下 理论上也可以用于性能优化和性能监控 private int maxDeep View view view不会有子view所以就返回0 if
  • 4.2 线性方程组有解判断

    文章目录 系数矩阵 增广系数矩阵 方程组的矩阵与向量表示形式 结论 判断方程组有无解的步骤 求线性方程组的一般思路 例题 参考 系数矩阵 增广系数矩阵 方程组的矩阵与向量表示形式 求解方程组就是对增广矩阵做初等行变换将系数矩阵化为行简化阶梯
  • Python——算法

    文章目录 算法 1 世界末日 2 马虎的算式 3 振兴中华 4 斐波那契数列 5 武功秘籍 6 切面条 7 立方变自身 8 圆的面积 9 字母图形 10 Huffuman树 算法 1 世界末日 曾有邪教称1999年12月31日是世界末日 当
  • 游戏开发unity插件DoTween:实现人物向目标方向旋转

    已知世界坐标下目标对象的朝向向量B 当前人物朝向向量A transform forward 如何用DoTween实现人物旋转动画呢 Vector3 forwardWorldVector B float duration 0 5f trans
  • 产品研发流程

    需求管理流程介绍 1 1需求管理流程 产品研发的生命周期 一般需要以下几个环节 1 2常用的调研方法 1 3如何进行访谈 访谈注意事项 1 列调研大纲 根据大纲去调研 2 调研顺序 先流程后细节 1 流程从哪里开始 由谁发起 什么事情触发的
  • 想入手抖音定制生日祝福短视频,没有创意思路怎么办?几个方面带你了解整个流程

    项目 定制派大星生日祝福视频 原理 从抖音引流到微信转为私域流量 成本 一部手机 一个微信小号 需要的资源 配音声优 视频素材 一个抖音号 剪辑工具 剪映 这是一个淘宝商品改造成抖音的玩法项目 一 需求思路 儿童喜欢看的动画片人物 比如 派
  • ubuntu16.04开起wifi热点

    1 首先保证电脑连接有线网络 2 点击电脑屏幕右上方联网图标 选择最后一个选项 编辑连接 3 进入如下页面 选中选中wifi选项 点击添加 4 进入如下页面 选择连接类型为wifi 点击新建 5 进入如下页面 填写连接名称与SSID 这两项
  • java深度克隆工具类——支持对象和对象集合

    正经学徒 佛系记录 不搞事情 第一步 创建工具类 直接使用commons beanutils实现对象拷贝 引入pom
  • mysql数据库存储逻辑_MySQL逻辑架构及存储引擎简介

    MySQL逻辑架构 并发控制 由锁实现 读锁 也叫共享锁 读锁互相不阻塞 A加锁表后A b c d都能读该表但不能写该表 写锁 也叫排他锁 写锁相互阻塞 A加排他锁后 其他线程不能读写该表 锁粒度 表锁 锁一个表 并发粒度小 代表存储引擎M
  • Blazor 模板化组件开发指南

    翻译自 Waqas Anwar 2021年4月15日的文章 A Developer s Guide To Blazor Templated Components 1 在我之前的一篇文章 Blazor 组件入门指南中 我介绍了组件参数 并向您
  • javascript 转数字:javascript数字相加

    var a 3 var b 98 c a b 想得到c 101 确变成了字符串拼接 得到了398 我该则么做呢 c parseInt a parseInt b
  • #pragma once 与 #ifndef

    在C C 中 使用 include 包含文件的时候 经常使用方法去防止重复引用 产生二义性 通常有两种方式 第一种 ifndef指令方式代码被重复引用 比如说 ifndef CODE BLOCK define CODE BLOCK code
  • 谈文本分类

    本文来自对 文本分类研究综述 汪岿的阅读 文章目录 1 为什么要进行文本分类 2 文本分类的分类 应用 3 当前文本分类面临的挑战 4 文本分类的前景 1 为什么要进行文本分类 在大数据时代 网络上的文本数据日益增长 采用文本分类技术对海量
  • 04-Java框架-MyBatis

    一 MyBatis的介绍 1 1 回顾一下JDBC 下面这个代码是使用JDBC实现基于id查询员工信息 我们来分析分析有什么弊端 public Employee selectById Long id Connection conn null