MyBatis学习与使用

Posted bityinjd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis学习与使用相关的知识,希望对你有一定的参考价值。

写在前面——

用 MyBatis 也做过几个项目了,但是一直没有很深入的去理解这个框架,最近决定从头开始学习和整理MyBatis。

之前开发的项目并不是我先创建的,等我介入的时候发现他们已经稍稍封装了一下对MyBatis的使用,反正不是那种官方文档上代码的样子,所以我之前用得就糊里糊涂的,今天就从官方文档中展示的用法开始学习。

 

正文如下——

Mybatis核心类

1. SqlSessionFactory

用来生成SqlSession的实例。
这个类一旦被创建就应该在应用的运行期间一直存在,没有任何理由对它进行清除或重建。使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqlSessionFactory 被视为一种代码“坏味道(bad smell)”。因此 SqlSessionFactory 的最佳作用域是应用作用域。有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。

2. SqlSession

包含了面向数据库执行SQL所需的所有方法。你可以通过SqlSession的实例来执行已经映射的SQL语句。
这个类的实例不是线程安全的,因此是不能被共享的。如果你现在正在使用一种 Web 框架,要考虑 SqlSession 放在一个和 HTTP 请求对象相似的作用域中。换句话说,每次收到的 HTTP 请求,就可以打开一个 SqlSession,返回一个响应,就关闭它。这个关闭操作是很重要的,你应该把这个关闭操作放到 finally 块中以确保每次都能执行关闭。 

3. SqlSessionFactoryBuilder

用来生成SqlSessionFactory。
这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。你可以重用 SqlSessionFactoryBuilder 来创建多个 SqlSessionFactory 实例,但是最好还是不要让其一直存在以保证所有的 XML 解析资源开放给更重要的事情。

4. Mapper接口

映射器是一个你创建来绑定你映射的语句的接口。映射器接口的实例是从 SqlSession 中获得的,其作用域最好也是方法内。
 

MyBatis的基本用法

 

1. 传统用法(XML配置映射文件)

 
首先有整个MyBatis的配置文件一般命名为mybatis-config.xml,可以按顺序(具体顺序可以查看表头链接指向的dtd文件)配置别名、环境数据源、映射器等。
技术分享图片
 1 <?xml version="1.0" encoding="UTF-8" ?>
 2 <!DOCTYPE configuration
 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
 4 "http://mybatis.org/dtd/mybatis-3-config.dtd">
 5 <configuration>
 6 <typeAliases>
 7 <typeAlias alias="Book" type="tech.ipush.model.Book" />
 8 </typeAliases>
 9 <environments default="development">
10 <environment id="development">
11 <transactionManager type="JDBC"/>
12 <dataSource type="POOLED">
13 <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
14 <property name="url" value="jdbc:mysql://localhost:3306/webpractice?autoReconect=true&amp;useUnicode=true&amp;characterEncoding=utf-8&amp;useSSL=false&amp;serverTimezone=GMT%2B8"/>
15 <property name="username" value="root"/>
16 <property name="password" value="root"/>
17 </dataSource>
18 </environment>
19 </environments>
20 <mappers>
21 <mapper resource="tech/ipush/mapper/BookMapper.xml" />
22 </mappers>
23 </configuration>
mybatis-config.xml 
 
基本上一个表需要对应一个mapper.xml文件,每写好一个文件就要写入到mybatis-config.xml配置文件的mappers中。
技术分享图片
1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE mapper
3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
5 <mapper namespace="tech.ipush.mapper.BookMapper">
6 <select id="getBook" resultType="Book">
7 select * from book where id=#{id}
8 </select>
9 </mapper>
BookMapper.xml
如上所示,这里配置了一个名为getBook的查询语句。返回值是一个Book,这里用的是mybatis-config.xml中的别名。
 
那么到底如何使用这里的配置呢?下边给出了第一种用法。
 
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
try {
  Book book1 = (Book) session.selectOne("tech.ipush.mapper.BookMapper.getBook", 2);
  System.out.println("book1Name: " + book1.getName());
} finally {
session.close();
}

 

 
2. 跟第一种类似,只不过session使用mapper的方式不同。
 
第二种比第一种多一个显示的接口文件,接口全名需要跟mapper.xml中的命名空间完全一致,如下:
public interface BookMapper {
  Book getBook(int id);
} 
调用方式如下:
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session2 = sqlSessionFactory.openSession();
try {
  BookMapper mapper = session2.getMapper(BookMapper.class);
  Book book = mapper.getBook(2);
  System.out.println("bookName: " + book.getName());
} catch (Exception e) {
  e.printStackTrace();
} finally {
  session.close();
}
3. 使用注解的方式
 
这一种方式不需要xml配置文件,但是需要跟代码耦合度高一些。
package tech.ipush.mapper;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;
import tech.ipush.model.Bill;
@Repository
@Mapper
public interface BillMapper {
  @Select("select * from bill where id = #{id}")
  Bill selectBill(int id);
}

 




以上是关于MyBatis学习与使用的主要内容,如果未能解决你的问题,请参考以下文章

mybatis学习日志二

Spring+SpringMVC+MyBatis+Maven框架整合

MyBatis学习 之 一MyBatis简介与配置MyBatis+Spring+MySql

#yyds干货盘点#mybatis-plus学习与实践逻辑删除

markdown [mybatis参考]关于mybatis #mybatis的一些片段

MYBATIS05_ifwherechoosewhentrimsetforEach标签sql片段