博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MyBatis入门——了解基本概念
阅读量:6296 次
发布时间:2019-06-22

本文共 8237 字,大约阅读时间需要 27 分钟。

1. 了解MyBatis

1.1 MyBatis是什么?

使用Java操作数据库的话,JDK给我们提供了一层对各个数据库的封装,也就是JDBC,它屏蔽了数据库之间的差异,使用JDBC可以统一操作。但是他长期以来被人诟病的就是重复代码太多。封装参数需要一个一个set,还需要你把ResultSet一个一个映射成POJO,这里面充满了重复代码,这里完全可以由模板代码来代替。当然,不仅仅是重复代码,还有其他缺点,比如,性能,安全,扩展性等等。

封装JDBC以求达到更简洁,更优雅,更安全,更高效的方案有很多,MyBatis就是其中之一,这类框架一般被叫做ORM框架(Object Relational Mapping,就是Java中的对象和关系型数据库里的数据映射的一个框架)。

MyBatis通过构造一个Mapper来消除JDBC代码,却又可以实现查询数据库的功能。Mapper是个interface,我们可以指定这个接口里每个方法对应的SQL模板,然后由MyBatis来绑定运行时传入的参数给SQL模板里的占位符,构造成一个可执行的SQL,然后执行,获得结果后再自动封装成方法返回值的类型的对象。

举个例子,Mapper

Blog selectBlog(long id);复制代码

SQL:

select * from Blog where id = #{id}复制代码

这样查询时的参数绑定,和查询结果的封装都可以由MyBatis来完成。

1.2 为什么使用MyBatis?

知道MyBatis是什么,应该就明白为什么会出现MyBatis之类的ORM框架了,还有常见的Hibernate。对于ORM框架,或者类似的东西,存在的意义就是上面所说的。那么,为什么是MyBatis?而不是其他ORM框架呢?这里我简单的说说,为什么我喜欢MyBatis胜过喜欢Hibernate吧,我更喜欢简洁。说通俗一点,ORM确实有存在的必要,但是真的有必要封装的太过深吗?Hiberante可以达到让用户完全不知道自己在使用数据库的程度,这实现起来肯定比MyBatis更复杂,说明Hibernate的技术含量要更高,可是这也带来了问题,我们真的需要这样吗?

过度的封装,会带来更多的成本,学习成本、故障解决时的成本。而相比Hibernate的高度复杂,MyBatis就显得很简小精悍了。我想这也是很多人喜欢用guice而不是spring吧。

这里随意比较一下两个框架的文档:

2. 基本概念

这里介绍一下MyBatis最核心的几个类,虽然框架帮我们隐藏了很多细节,但是如果对他不够了解,就不能应用的得心应手。这里介绍的几个类都很容易理解,名字起的好也是一种本领啊。

2.1 SqlSessionFactoryBuilder

SqlSessionFactoryBuilder是根据配置创建SqlSessionFactory的工厂类,一般来说是通过XML,当然,我们也可以直接用代码来构建。这个类一旦创建出SqlSessionFactory之后,他的意义就结束了,可以被释放了。一般推荐在方法内定义,用完就释放。当然,你可以用它创建多个不同的SqlSessionFactory

2.2 SqlSessionFactory

SqlSessionFactory一旦创建就应该一直存在,一般建议维护在应用级别(不是方法级别,也不是类级别,而是整个应用共享)。一般来说,不需要重复创建这个对象,也不要释放它。可以用单例模式来保证整个应用内的唯一性。

2.3 SqlSession

SqlSession是线程不安全的,所以每个线程应该维护一个单独的SqlSession对象。千万不要用对象的静态变量引用来指向一个SqlSession,这样会导致它泄露到其他线程中。而且,一定要记得关闭SqlSession,常见的使用方式如下:

SqlSession session = sqlSessionFactory.openSession();try {  // do work} finally {  session.close();}复制代码

2.4 Mapper Instances

Mapper Instances是我们定义的Mapper接口的实例对象,他包含了SQL绑定关系,需要SqlSession创建。所以他的生命周期可以和SqlSession一致,也就是线程级别,但是为了简洁,我还是建议放在方法内部,它不需要关闭,使用方法一般如下:

SqlSession session = sqlSessionFactory.openSession();try {  BlogMapper mapper = session.getMapper(BlogMapper.class);  // do work} finally {  session.close();}复制代码

3. 基本使用

依赖:

org.mybatis
mybatis
3.2.1
mysql
mysql-connector-java
6.0.6
复制代码

3.1 XML版(经典版本)

MyBatis的经典版本就是用XML来配置,并用XML来实现SQL和Java代码的分离。

创建数据库:

CREATE TABLE `blog` (  `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT,  `title` varchar(1024) DEFAULT NULL,  `content` text,  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP,  PRIMARY KEY (`id`)) ENGINE=InnoDB  DEFAULT CHARSET=utf8mb4;复制代码

插入数据:

INSERT INTO `blog` (`id`, `title`, `content`, `create_time`)VALUES	(1, '标题1', '内容1', '2018-02-05 10:45:26');复制代码

编写主配置文件mybatis-config.xml

复制代码

编写启动类Main.java

package cn.dubby.study.mybatis.basic.xml;import cn.dubby.study.mybatis.basic.xml.entity.Blog;import cn.dubby.study.mybatis.basic.xml.mapper.BlogMapper;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 java.io.IOException;import java.io.InputStream;public class Main {    public static void main(String[] args) throws IOException {        String resource = "mybatis-config.xml";        InputStream inputStream = Resources.getResourceAsStream(resource);        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);        SqlSession session = sqlSessionFactory.openSession();        try {            Blog blog1 = session.selectOne("cn.dubby.study.mybatis.basic.xml.mapper.BlogMapper.selectBlog", 1);            System.out.println(blog1);            BlogMapper mapper = session.getMapper(BlogMapper.class);            Blog blog2 = mapper.selectBlog(1);            System.out.println(blog2);        } finally {            session.close();        }    }}复制代码

编写POJO Blog.java

package cn.dubby.study.mybatis.basic.xml.entity;import java.util.Date;public class Blog {    private Long id;    private String title;    private String content;    private Date createTime;    @Override    public String toString() {        return "Blog{" +                "id=" + id +                ", title='" + title + '\'' +                ", content='" + content + '\'' +                ", createTime=" + createTime +                '}';    }		//getter and setter ...}复制代码

编写Mapper BlogMapper.java

package cn.dubby.study.mybatis.basic.xml.mapper;import cn.dubby.study.mybatis.basic.xml.entity.Blog;public interface BlogMapper {    Blog selectBlog(long id);}复制代码

运行Main.java结果:

Blog{id=1, title='标题1', content='内容1', createTime=Mon Feb 05 18:45:26 CST 2018}Blog{id=1, title='标题1', content='内容1', createTime=Mon Feb 05 18:45:26 CST 2018}复制代码

3.2 注解版

可以做到完全没有XML,总共有三个类,Main.javaSerial.javaSerialMapper.java

先准备数据库:

CREATE TABLE `serial` (  `id` bigint(11) unsigned NOT NULL AUTO_INCREMENT,  `name` varchar(1024) DEFAULT NULL,  `description` text,  PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;复制代码
INSERT INTO `serial` (`id`, `name`, `description`)VALUES	(1, 'MyBatis教程', '这一系列文章主要是介绍MyBatis,包含入门使用,高级特性,以及实现细节。');复制代码

Main.java

package cn.dubby.study.mybatis.basic.without.xml;import cn.dubby.study.mybatis.basic.without.xml.entity.Serial;import cn.dubby.study.mybatis.basic.without.xml.mapper.SerialMapper;import org.apache.ibatis.datasource.unpooled.UnpooledDataSource;import org.apache.ibatis.mapping.Environment;import org.apache.ibatis.session.Configuration;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.apache.ibatis.transaction.TransactionFactory;import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;import javax.sql.DataSource;public class Main {    public static void main(String[] args) {        DataSource dataSource = new UnpooledDataSource("com.mysql.cj.jdbc.Driver", "jdbc:mysql://localhost:3306/mybatis_study?useUnicode=true&characterEncoding=UTF-8&useLegacyDatetimeCode=false&serverTimezone=UTC", "test", "123456");        TransactionFactory transactionFactory = new JdbcTransactionFactory();        Environment environment = new Environment("development", transactionFactory, dataSource);        Configuration configuration = new Configuration(environment);        configuration.addMapper(SerialMapper.class);        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);        SqlSession session = sqlSessionFactory.openSession();        try {            Serial serial1 = session.selectOne("cn.dubby.study.mybatis.basic.without.xml.mapper.SerialMapper.selectSerial", 1);            System.out.println(serial1);            SerialMapper mapper = session.getMapper(SerialMapper.class);            Serial serial2 = mapper.selectSerial(1);            System.out.println(serial2);        } finally {            session.close();        }    }}复制代码

Serial.java

package cn.dubby.study.mybatis.basic.without.xml.entity;public class Serial {    private Long id;    private String name;    private String description;    @Override    public String toString() {        return "Serial{" +                "id=" + id +                ", name='" + name + '\'' +                ", description='" + description + '\'' +                '}';    }		//setter and getter...}复制代码

SerialMapper.java

package cn.dubby.study.mybatis.basic.without.xml.mapper;import cn.dubby.study.mybatis.basic.without.xml.entity.Serial;import org.apache.ibatis.annotations.Select;public interface SerialMapper {    @Select("SELECT * FROM serial WHERE id = #{id}")    Serial selectSerial(long id);}复制代码

执行Main.java

Serial{id=1, name='MyBatis教程', description='这一系列文章主要是介绍MyBatis,包含入门使用,高级特性,以及实现细节。'}Serial{id=1, name='MyBatis教程', description='这一系列文章主要是介绍MyBatis,包含入门使用,高级特性,以及实现细节。'}复制代码

转载于:https://juejin.im/post/5bc6d4f8f265da0a8c6c5683

你可能感兴趣的文章
spring boot集成mongodb最简单版
查看>>
DELL EqualLogic PS存储数据恢复全过程整理
查看>>
《Node.js入门经典》一2.3 安装模块
查看>>
《Java 开发从入门到精通》—— 2.5 技术解惑
查看>>
Linux 性能诊断 perf使用指南
查看>>
实操分享:看看小白我如何第一次搭建阿里云windows服务器(Tomcat+Mysql)
查看>>
Sphinx 配置文件说明
查看>>
数据结构实践——顺序表应用
查看>>
python2.7 之centos7 安装 pip, Scrapy
查看>>
机智云开源框架初始化顺序
查看>>
Spark修炼之道(进阶篇)——Spark入门到精通:第五节 Spark编程模型(二)
查看>>
一线架构师实践指南:云时代下双活零切换的七大关键点
查看>>
ART世界探险(19) - 优化编译器的编译流程
查看>>
玩转Edas应用部署
查看>>
music-音符与常用记号
查看>>
sql操作命令
查看>>
zip 数据压缩
查看>>
Python爬虫学习系列教程
查看>>
【数据库优化专题】MySQL视图优化(二)
查看>>
【转载】每个程序员都应该学习使用Python或Ruby
查看>>