MyBatis学习笔记(1)—使用篇

栏目: Java · 发布时间: 6年前

内容简介:MyBatis学习笔记(1)—使用篇

MyBatis是一款优秀的持久层框架,支持定制化 SQL 、存储过程以及高级映射。避免了几乎所有的JDBC代码和手动设置参数及获取结果集。Mybatis可以通过配置XML或者注解,将接口和 Java 的POJOS 映射成数据库中的记录。

MyBatis学习笔记(1)—使用篇

第一个MyBatis应用

通过实战来上手一个知识点是一种比较快的方式,可以帮助建立全局的印象,在过程中会讲述一些必要的知识点。

最近爆火的旅行青蛙很有意思,周边好友纷纷入坑,这里我以它的商店系统作为数据库操作的对象。

MyBatis学习笔记(1)—使用篇

首先准备好数据库,这里我根据旅行青蛙商店的内容创建了Commodity表:

create database TravelFrog;
CREATE TABLE commodity
(
  id    int      NOT NULL AUTO_INCREMENT,
  name  varchar(255)     NOT NULL ,
  price decimal(8,2)  NOT NULL ,
  description  varchar(255),
  PRIMARY KEY(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO commodity(id, name, price, description)
VALUES(1001, '野葡萄烤饼', 10, '吃完还有点饿');
INSERT INTO commodity(id, name, price, description)
VALUES(1002, '巨石三明治', 20, '蔬菜、快速轻食');
INSERT INTO commodity(id, name, price, description)
VALUES(1003, '南瓜百吉饼', 50, '份大量足,可以去很远的地方');
INSERT INTO commodity(id, name, price, description)
VALUES(1004, '乳蛋饼', 80, '想快点吃到拍,身心都轻快了,快速回家');

下面正式打开IDEA新建工程,添加maven依赖:

<dependencies>
        <!-- mybatis包 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.1</version>
        </dependency>

        <!-- mysql数据库连接 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>6.0.6</version>
        </dependency>

        <!-- 日志 -->
         <dependency>
             <groupId>log4j</groupId>
             <artifactId>log4j</artifactId>
             <version>1.2.17</version>
         </dependency>

        <!-- junit测试 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
            <scope>test</scope>
        </dependency>
    </dependencies>

接下来,按以下目录结构添加文件:

MyBatis学习笔记(1)—使用篇

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 default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!-- 选择连接数据库用的驱动 -->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <!-- 数据库地址 -->
                <property name="url" value="jdbc:mysql://localhost:3306/TravelFrog?characterEncoding=UTF-8"/>
                <!-- 数据库用户名 -->
                <property name="username" value="root"/>
                <!-- 数据库密码 -->
                <property name="password" value="jenkins"/>
            </dataSource>
        </environment>
    </environments>
    <!-- 导入Mybatis数据库查询映射文件 -->
    <mappers>
        <mapper resource="mapper/CommodityMapper.xml"/>
    </mappers>
</configuration>

Mybatis配置文件里包含数据源,日志,缓存等关系到Mybatis自身行为的一些配置,上面的配置文件里包含了数据源配置,事务管理。

创建POJO类

package com.shuqing28.pojo;

public class Commodity {
    private Integer id;
    private String name;
    private Double price;
    private String description;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Double getPrice() {
        return price;
    }

    public void setPrice(Double price) {
        this.price = price;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    @Override
    public String toString() {
        return "Commodity{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", price=" + price +
                ", description='" + description + '\'' +
                '}';
    }
}

对应于数据库刚才创建的商品表,这里的POJO里的字段和商品表里的字段一一对应。

映射器

接口部分

package com.shuqing28.dao;

import com.shuqing28.pojo.Commodity;

import java.util.List;

public interface CommodityDao {
    List<Commodity> getAllCommodity();
}

这里定义一个接口,注意接口的方法和下面的XML文件的id保持一致。

XML Mapper

<?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="com.shuqing28.dao.CommodityDao">
    <select id="getAllCommodity" resultType="com.shuqing28.pojo.Commodity">
        SELECT * FROM commodity
    </select>
</mapper>

描述一下上面的XML文件做了什么:

  1. 首先,前面的配置文件里其实注册了这个Mapper:
<mappers>
        <mapper resource="mapper/CommodityMapper.xml"/>
    </mappers>

所以Mybatis会读取这个XML,生成映射器,这里其实用到了动态代理。

  1. 定义了一个命名空间为 com.shuqing28.dao.CommodityDao的SQL Mapper ,这个命名空间和我们定义的接口的全限定名是一致的。

  2. 用一个select元素定义了一个查询SQL,返回结果是我们定义过的Commodity。 这也是Mybatis最核心的部分,也是最复杂的部分,除了使用XML实现,也可以通过注解实现,比如如果没有上面的XML文件,那么也可以直接在接口里这么定义:

@Select(value="SELECT * FROM commodity")
public interface CommodityDao {
    List<Commodity> getAllCommodity();
}

这边只是浅浅的描述了使用,因为是第一篇,所以不深入,会用就行。

添加日志配置

# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
# 指定Mapper包范围的日志级别
log4j.logger.com.zju.dao=DEBUG
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m

测试类

import com.shuqing28.dao.CommodityDao;
import com.shuqing28.pojo.Commodity;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class CommodityTest {
    private SqlSessionFactory sqlSessionFactory = null;
    @Before
    public void setUp() throws IOException{
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    }

    @Test
    public void getAllCommodity(){
        SqlSession sqlSession = sqlSessionFactory.openSession();
        try {
            CommodityDao commodityDao = sqlSession.getMapper(CommodityDao.class);
            List<Commodity> commodities = commodityDao.getAllCommodity();
            System.out.println(commodities);
        } finally {
            sqlSession.close();
        }
     }
}

运行结果

[Commodity{id=1001, name='野葡萄烤饼', price=10.0, description='吃完还有点饿'}, Commodity{id=1002, name='巨石三明治', price=20.0, description='蔬菜、快速轻食'}, Commodity{id=1003, name='南瓜百吉饼', price=50.0, description='份大量足,可以去很远的地方'}, Commodity{id=1004, name='乳蛋饼', price=80.0, description='想快点吃到拍,身心都轻快了,快速回家'}]

其实测试类里面的东西非常值得我们关注,我们可以依此知道Mybatis的基本构成

Mybatis的基本构成

MyBatis学习笔记(1)—使用篇

SqlSessionFactoryBuilder

SqlSessionFactoryBuilder通常利用XML或者Java编码来构建SqlSessionFactory,一旦我们构建了SqlSessionFactory,它的作用也就完结了。上面的例子中也就是简单的读取配置文件,转化为流对象,再创建出SqlSessionFactory。因为它的主要目的是创建SqlSessionFactory,所以它一般也只存活在创建的那个方法里,声明周期很短。

SqlSessionFactory

SqlSessionFactory是一个工厂类,它的作用就是生产SqlSession,而SqlSession你可以想象成JDBC里的一个Connection,每次访问数据库都需要一个SqlSession,所以SqlSessionFactory通常伴随整个Mybatis的生命周期,我们通常为一个数据库创建一个SqlSessionFactory,因为如果创建多个,那么每次创建新的,它都会附带着打开一堆Connection资源,所以通常我们使用单例模式管理SqlSessionFactory。

SqlSession

SqlSession就是一个对话,类比Connection,所以每次使用完都要记得关闭它。同时,它也是一个线程不安全对象,所以在涉及多线程时要额外注意,我们在上面的代码中,在finally语句里确保关闭它。它存活于一个应用的请求和操作,可以执行多条sql,保证事务一致性。

Mapper

Mapper也就是上面我们写的 CommodityDao commodityDao = sqlSession.getMapper(CommodityDao.class); ,我们仅仅使用Java接口和一个XML文件(或者注解)去实现Mapper而不用实现类,其实这里运用到了动态代理,Mybatis会为接口生成代理类对象,代理对象会根据“接口路径+方法名”去匹配,找到对应的XML文件(或注解)去完成它所需要的任务,返回我们需要的结果。Mapper是一个方法级别的东西,它的最大生命周期应该和SqlSession是相同的。

照着上面的代码敲一遍便可以实现第一个Mybatis应用了,本系列第一篇,未完待续。。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

支付革命

支付革命

马梅、朱晓明、周金黄、季家友、陈宇 / 中信出版社 / 2014-2-1 / 49.00元

本书是中国首部深入探讨第三方支付的著作。 本书以电子交易方式、电子货币及电子认证技术演变的“三重奏”将决定电子支付中介的发展为主线,分析了中国第三方支付从“小支付”走向“大金融”的历史逻辑、技术逻辑和商业逻辑,揭示了第三方支付特别是创新型第三方支付机构发展对提升中国经济运行效率的作用,分析了第三方支付的未来发展趋向,并提出了相应的政策建议。 本书旨在以小见大,立足于揭示互联网与移动互联......一起来看看 《支付革命》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

MD5 加密
MD5 加密

MD5 加密工具

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具