初识 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)中的 <configuration> 元素来创建一个 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351

推荐阅读更多精彩内容

  • 1. 简介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL、存储过程以及高级映射的优秀的...
    笨鸟慢飞阅读 5,470评论 0 4
  • 人与动物的区别是思想,因为人人心想不同,所以成为乱世之源,所谓潘多拉盒子也或是指的不是什么魔而是思想之乱象。 后来...
    炎黄黄阅读 545评论 0 4
  • 周边人的眼神,笑声,对我的影响很大。 吃过早饭后,走在路上。后面一个女生突然跑到前面和另一个女生窃窃私语,当...
    吟_心阅读 277评论 0 0