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

MyBatis学习笔记(2)—映射关系篇

MyBatis学习笔记(3)—高级映射之一对一映射

Mybatis学习笔记(4)-高级映射之一对多映射

Mybatis学习笔记(5)-高级映射之多对多映射

...敬请期待

Mybatis是什么?

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

第一个MyBatis应用

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

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

首先准备好数据库,这里我根据旅行青蛙商店的内容创建了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配置文件

新建mybatis-config.xml,内容如下:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//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;}@Overridepublic 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 mapperPUBLIC "-//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;@Beforepublic void setUp() throws IOException{String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);}@Testpublic 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的基本构成

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应用了,本系列第一篇,未完待续。。

MyBatis学习笔记(1)—使用篇相关推荐

  1. ant的下载与安装——mybatis学习笔记之预备篇(一)

    看到这个标题是不是觉得有点奇怪呢--不是说mybatis学习笔记吗,怎么扯到ant了?先别急,请容我慢慢道来. mybatis是另外一个优秀的ORM框架.考虑到以后可能会用到它,遂决定提前学习,以备不 ...

  2. 【应用篇】MyBatis学习笔记

    MyBatis学习笔记 一 环境配置 1 什么是MyBatis? ​ MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除了几乎所有的 JDBC 代码和参 ...

  3. MyBatis多参数传递之Map方式示例——MyBatis学习笔记之十三

    前面的文章介绍了MyBatis多参数传递的注解.参数默认命名等方式,今天介绍Map的方式.仍然以前面的分页查询教师信息的方法findTeacherByPage为例(示例源代码下载地址:http://d ...

  4. MyBatis多参数传递之混合方式——MyBatis学习笔记之十五

    在本系列文章的<MyBatis多参数传递之Map方式示例>一文中,网友mashiguang提问如下的方法如何传递参数:public List findStudents(Map condit ...

  5. MyBatis学习笔记(二)根据配置文件优化

    上一篇:MyBatis学习笔记(一)完整查询数据库流程+增删改查 mybatis_config.xml文件中可以包含以下部分 本文接下来的优化都是针对于mybatis_config.xml文件,并且每 ...

  6. OracleDesigner学习笔记1――安装篇

    OracleDesigner学习笔记1――安装篇   QQ:King MSN:qiutianwh@msn.com Email:qqking@gmail.com 一.       前言 Oracle是当 ...

  7. mybatis学习笔记(13)-延迟加载

    2019独角兽企业重金招聘Python工程师标准>>> mybatis学习笔记(13)-延迟加载 标签: mybatis [TOC] resultMap可以实现高级映射(使用asso ...

  8. mybatis学习笔记(7)-输出映射

    2019独角兽企业重金招聘Python工程师标准>>> mybatis学习笔记(7)-输出映射 标签: mybatis [TOC] 本文主要讲解mybatis的输出映射. 输出映射有 ...

  9. mybatis学习笔记(3)-入门程序一

    2019独角兽企业重金招聘Python工程师标准>>> mybatis学习笔记(3)-入门程序一 标签: mybatis [TOC] 工程结构 在IDEA中新建了一个普通的java项 ...

最新文章

  1. 在Kubernetes v1.8中使用RBAC
  2. js原生选项卡(自动播放无缝滚动轮播图)二
  3. python 条形图_Python数据可视化:基于matplotlib绘制「堆积条形图」
  4. vscode配置live-server转发代理
  5. 干旱的草原与拉大提琴的牧人
  6. 11-基于dev的bug(还没想通)
  7. js中的Array数组清空
  8. oracle授权v$lock,Oracle八大性能视图之v$lock
  9. 单链表插入、删除操作单步解析(十三)
  10. 用 Open Live Writer 来写 cnblog.com 博客
  11. FreeBSD 6.0架设管理与应用-第七章 系统安全
  12. 公司的苹果开发者账号续费问题
  13. 计算机屏幕重影红色,Win7/Win10系统玩游戏屏幕出现红蓝重影解决方法
  14. 我的Foobar2000定制版本
  15. 【win 10系统激活】
  16. python 词汇表_使用Counter构建词汇表
  17. 调查问卷的反向计分题数据如何录入?
  18. 司空见惯 - 天黑请闭眼
  19. 五大存储模型关系模型 键值存储 文档存储 列式存储 图形数据库
  20. linux grep gz文件内容,如何查询targz的压缩包文件的内容

热门文章

  1. [N9H30]在例程中使用printf导致程序无法运行
  2. css flex换行且均匀分布
  3. 使用hexo+github pages搭建博客
  4. Linux Debian11 服务器安装与SSH配置
  5. 红色作为交通信号灯颜色是因为它对脑电波有影响吗?
  6. Apache Kafka API AdminClient Scram账户的创建与删除
  7. 何有效提高香港主机的访问速度?
  8. 浅谈建筑能耗在线监测系统在天目西路街道103坊27丘项目泰禾大厦的应用—安科瑞 孙斌
  9. RecycleView实现Gallery画廊效果,中间放大两边缩小
  10. JavaScript进阶(二)