当前位置: 首页 > news >正文

初始 Mybatis(一) —— 基本配置及用法

这篇文章来自我的博客

正文之前

在使用 SSM 对之前所做的小项目重构了之后,发现需要写几篇文章来总结一下各个部件的用法,先写几篇关于 Mybatis 的文章,正好补缺补漏顺便总结一下

主要内容:

  1. Mybatis 简介
  2. 测试项目构建
  3. 配置文件
  4. 增删改查

正文

1. Mybatis 简介

引用官网的介绍:

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

总而言之,是个框架就对了

2. 测试项目构建

要使用 Mybatis,我们需要先导入两个包:

mybatis-3.4.6 mysql-connector-java-5.1.46

我们先创建所要用到的包和类:

  • Product 是实体类,对应数据库中的表

  • db.properties 是外部配置数据库信息的文件

  • SqlMapConfig 是 Mybatis 的配置文件(文件名不固定)

  • ProductMapper.xml 是对应的映射文件

  • ProductTest 是测试类

lib 包中的其他文件是日志文件和单元测试文件

使用到的数据库中的表为 product 表:

创建实体类 Product :

3. 配置文件

关于 Mybatis 的信息都在 SqlMapConfig.xml 文件中

1. 配置环境

Mybatis 可以对应多种环境,这在配置文件中定义:

<?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>
    <!-- 配置的环境,可以有多个环境来对应多种数据库,至少要有一个环境 id 与此对应 -->
    <environments default="mysql">
        <!-- 这里的环境 id,就是具体某个数据库的 id -->
        <environment id="mysql">
            <transactionManager type=""></transactionManager>
            <dataSource type=""></dataSource>
        </environment>
        <!--
        <environment id="oracle">
            <transactionManager type=""></transactionManager>
            <dataSource type=""></dataSource>
        </environment>
        -->
    </environments>
</configuration>
复制代码
2. 事务管理和数据源
<transactionManager type="JDBC"/>
<dataSource type="POOLED"></dataSource>
复制代码

事务管理有两种:JDBC 和 MANAGED,我们就关注 JDBC,它其实就是使用了 JDBC 的设置来进行管理、

数据源有三种:

  • UNPOOLED:在请求时打开和关闭连接,如果对数据库的使用较为频繁,则不适用此方式,太浪费时间

  • POOLED:连接池,最常用的方式,一开始创建一定数量的连接,即用即取,用完归还

  • JNDI:为了能在如 EJB 或应用服务器这类容器中使用

3. 数据库信息

有关数据库的信息可以直接写在配置文件里面:

不过,通常的做法是在外部创建一个 db.properties 文件:

然后用外部配置来替换这些属性的值,只是引用外部配置文件需要在配置数据源之前进行

关于 Mybatis 的系统配置就先到这,接下来是实体类相关的一个映射文件 ProductMapper.xml 的配置

4. 映射文件

在实体类的映射文件中写明了你要进行什么操作:

接下来解释这个文件:

mapper 映射器:需要定义命名空间,因为后面调用的时候要用到

select 元素:对应 SQL 中的查询操作,id 指的是这个查询操作的名称,调用它的时候需要使用这个 id, resultType 指的是返回类型,我这里查询出的每一条记录都指定为 Product 类型,相类似的还有 update、insert 和 delete 元素,对应相关的的 SQL 操作

5. 加载映射文件

把映射文件写完了之后,我们需要告诉 Mybatis 去哪里找这些 SQL 语句,所以我们在 Mybatis 配置文件里写出路径:

    <mappers>
        <mapper resource="mapper/ProductMapper.xml"/>
    </mappers>
复制代码

4. 增删改查

首先我们先说一下 Mybatis 是怎么用的:

  • Mybatis 中有一个工具类叫 Resources,使用它来加载你的配置文件

  • SqlSessionFactoryBuilder 根据配置的 XML 文件(我们这里就是指 SqlMapConfig.xml)中的 元素来创建一个 SqlSessionFactory 实例

  • Mybatis 应用是以一个 SqlSessionFactory 的实例为中心来展开工作的

        //配置文件的位置是基于我这个测试项目来写的
        String resource = "config/SqlMapConfig";
        //输入流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
复制代码

然后得到 SqlSession 的实例,就可以用来执行 SQL 语句了:

        SqlSession sqlSession = sqlSessionFactory.openSession();
复制代码
1. 增加记录

我们先在映射文件中写一个增加记录的操作:

    <insert id="insertProduct" parameterType="bean.Product">
        INSERT INTO product VALUES
        (#{id}, #{barcode}, #{name}, #{units}, #{purchasePrice}, #{salePrice}, #{inventory})
    </insert>
复制代码

这里的 #{} 是一个占位符,就相当于 SQL 中的 ? 符号,添加的参数类型是 Product 类型的

然后我们在测试类中进行添加操作:

这里的 insert 操作的第一个参数就是用来定位 SQL 语句的,它是命名方式是映射文件的命名空间.SQL语句的 ID,然后这第二个参数就是我添加进去的记录,在最后一定要进行提交,否则是无效的,进行测试:

这时候查看表中的所有记录就会发现刚才的操作是成功的:

2. 删除记录
    <delete id="deleteProduct" parameterType="String">
        DELETE FROM product
        WHERE id = #{id}
    </delete>
复制代码

根据 ID 来删除商品,这里的参数类型是 String

    @Test
    public void test() throws IOException{
        String resource = "config/SqlMapConfig";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession sqlSession = sqlSessionFactory.openSession();
        sqlSession.delete("ProductMapper.deleteProduct", "123");
        sqlSession.commit();
    }
复制代码

运行之后就能看到我们第一步添加进去的商品被删除了:

3. 修改记录

我们也是根据商品 ID 来修改记录,只不过参数类型是 Product:

    <update id="updateProduct" parameterType="bean.Product">
        UPDATE product SET 
        barcode = #{barcode},
        name = #{name},
        units = #{units},
        purchasePrice = #{purchasePrice},
        salePrice = #{salePrice},
        inventory = #{inventory}
        WHERE id = #{id}
    </update>
复制代码

在测试中,我们创建一个商品的实例,然后用这个实例来替换掉数据库中的相对应的记录:

        Product product = new Product("1F01DC70F9A64B2CBB52B92C41FBCC9E", "123", 
                                        "T-shirt", "piece", "50", "100", "10");
        sqlSession.update("ProductMapper.updateProduct", product);
        sqlSession.commit();
复制代码

然后就会发现表中的第一条记录已被更改:

4. 查询记录

我们用一个列表来存放表中的所有数据,这里没有用到参数,只要定义返回类型就可以了:

    <select id="findAllProducts"  resultType="bean.Product">
        SELECT * FROM product
    </select>
复制代码

这里不需要 commit,我们并没有提交至数据库中,只是查询:

        List<Product> list = sqlSession.selectList("ProductMapper.findAllProducts");
        for (Product p :
                list) {
            System.out.println(p);
        }
复制代码

然后就能看到 5 条记录:

总结

若想要成功地使用 Mybatis,总共有三个要点:

1. SqlMapConfig.xml(Mybatis 配置文件)

这是 Mybatis 的核心,这里面配置了数据库的基本信息以及映射文件的加载信息等

2. 实体类、接口

也就是 POJO(Plain Old Java Objects,普通的 Java对象),我们这篇文章中的 Product 实体类,关于接口,我们这一篇文章中没有说明,接口是对应映射文件存在的,接口的命名和映射文件同名,这个在之后将 Mybatis 逆向工程的时候会说到

3. 映射文件

映射文件就是我们上面写到的 ProductMapper.xml,它的作用不仅仅是带有 SQL 语句,还能将 POJO 映射成为数据库中的记录,所以我们刚才才能够使用占位符进行增删改查操作或将查询结果映射为POJO

相关文章:

  • OpenStack Newton部署官方指南
  • 小前端眼里的大前端:GMTC 2018 参会小结
  • Rails哲学三原则
  • TCPDF 如何实现首行缩进
  • https请求过程
  • 一个JS多个数组取交集算法
  • JS对象的克隆
  • 作为面试官如何从深度和广度上考察面试者
  • 沃森想通过社交网络筛出最想要优惠券的人
  • 刨根问底 | Elasticsearch 5.X集群多节点角色配置深入详解【转】
  • 在word中输入任意角度旋转图片
  • python怎么写可读性好的面向过程的长篇代码?
  • 第一节:.Net版基于WebSocket的聊天室样例
  • Leetcode 28 实现strStr()
  • 小程序开发之改变data中数组或对象的某一属性值
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • CSS居中完全指南——构建CSS居中决策树
  • Java Agent 学习笔记
  • js如何打印object对象
  • Laravel Mix运行时关于es2015报错解决方案
  • PAT A1050
  • 翻译--Thinking in React
  • 分布式熔断降级平台aegis
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 爬虫模拟登陆 SegmentFault
  • 入口文件开始,分析Vue源码实现
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 阿里云ACE认证学习知识点梳理
  • ​渐进式Web应用PWA的未来
  • #pragam once 和 #ifndef 预编译头
  • (1)bark-ml
  • (1)常见O(n^2)排序算法解析
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (2015)JS ES6 必知的十个 特性
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (动手学习深度学习)第13章 计算机视觉---微调
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (七)理解angular中的module和injector,即依赖注入
  • (四)库存超卖案例实战——优化redis分布式锁
  • (原創) 人會胖會瘦,都是自我要求的結果 (日記)
  • (转) Face-Resources
  • .gitignore文件设置了忽略但不生效
  • .NET CORE使用Redis分布式锁续命(续期)问题
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .NET中GET与SET的用法
  • /usr/bin/perl:bad interpreter:No such file or directory 的解决办法
  • :not(:first-child)和:not(:last-child)的用法
  • @在php中起什么作用?
  • [ NOI 2001 ] 食物链
  • [ 环境搭建篇 ] 安装 java 环境并配置环境变量(附 JDK1.8 安装包)
  • []我的函数库
  • [100天算法】-x 的平方根(day 61)
  • [120_移动开发Android]008_android开发之Pull操作xml文件
  • [3D游戏开发实践] Cocos Cyberpunk 源码解读-高中低端机性能适配策略
  • [BZOJ3757] 苹果树