MyBatis(一)–基础使用

一 引言

MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java对象)映射成数据库中的记录。

上面是MyBatis官方的介绍,通过介绍我们知道MyBatis是持久层的框架,我们原来使用JDBC进行持久化操作,MyBatis是对JDBC的封装,那么使用JDBC的缺点是:

  • JDBC代码冗余(90%),只用SQL命令不同
  • 参数的绑定和实体类对象的封装需要手工完成
  • JDBC没有提供连接池和缓存机制

用了MyBatis框架,对于dao层的实现我们有了更好的方式。

二. 基本使用

要使用 MyBatis, 需将 mybatis-x.x.x.jar导入,引入配置文件,配置文件名随意(mybatis-config.xml)

<!-- mybatis的所有配置都必须定义在configuration标签里-->
<configuration>
   <!--配置mybatis运行环境,如果需要连接多个数据库,则需要多个environment标签-->
   <environments default="d1">
    <!-- 配置一个mybatis的运行环境,id 属性是这个环境的唯一标识-->
    <environment id="d1">
      <!--设置mybatis完成数据库操作事务的提交策略,type属性值为"JDBC",表示使用JDBC事务提交方式提交-->
      <transactionManager type="JDBC"></transactionManager>
      <!--配置数据库连接,type属性为"POOLED",表示使用mybatis内置连接池-->
      <dataSource type="POOLED">
        <property  name="driver" value="数据库驱动"/>
        <property  name="url"  value="连接地址"/>
        <property  name="username" value="账号"/>
        <property  name="password"  value="密码" />
      <dataSource>
    </environment> 
   </environments>
</configuration>

核心类:

  • SQLSessionFactoryBuilder
    是读取mybatis框架配置文件mybatis-config的工具类,
    (获取框架的运行环境) , 并将读到的内容封装成对象存储下来
  • Reader reader = Resources.getResourceAsReader(“mybatis-config.xml”) 读取配置文件
  • builder.build(reader) –>创建SqlSessionFactory 对象
  • SqlSessionFactory 当前类型的对象里封装了mybatis配置文件的信息
  • SqlSession session = factory.openSession(); 将mapper文件翻译成接口的实现类,并创建对象返回 ;

配置完后就可以写映射文件mapper.xml了

mapper.xml

将mapper映射文件注册到mybatis-config.xml配置文件中

mybatis-config.xml

MyBatis实现机制和Jdbc的对比

对比

MyBatis的DML操作

功能涉及增、删、改任一操作,都必须手动显式commit提交

三. 封装MyBatisUtil工具类

Mybatis启动时需要读取配置文件(只读取一次即可) , 需要将代码定义在静态代码块 ;SqlSessionFactory对象里封装了配置文件信息 , 是重量级组件(内存占用多, 功能强大,运行效率低 , 线程安全) ,一般应用中只会创建一个这样的对象。
SqlSession与Connection一一对应的 , 线程不安全(不能在多个线程间共享,需要为每一个线程单独分配一个session — 通过ThreadLocal 实现) 。

通过上面分析,可以封装一个MyBatis工具类,简化MyBeatis的使用:

public class MyBatisUtil {
	private static SqlSessionFactory factory = null;
	static {
		try {
			SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
			Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
			factory = builder.build(reader);
		} catch (IOException e) {
			e.printStackTrace();
		}

	}
	private static final ThreadLocal<SqlSession> tl = new ThreadLocal<SqlSession>();

	public static SqlSession openSession() {
		SqlSession session = tl.get();
		if (session == null) {
			session = factory.openSession();
			tl.set(session);
		}
		return session;
	}

	public static void close() {
		SqlSession session = openSession();
		tl.remove();
		session.close();
	}

	public static void commit() {
		SqlSession session = openSession();
		session.commit();
		close();
	}

	public static void rollback() {
		SqlSession session = openSession();
		session.rollback();
		close();
	}

	public static Object getMapper(Class a) {
		SqlSession session = openSession();
		return session.getMapper(a);
	}
}

四. Mapper映射文件的写法

1.多参查询

多个参数查询时可以省略parameterType属性,方法的形参名不能长时间保留,在编译过程中丢失,不能在映射文件中使用,可以用一下两种方式解决:

  • 通过参数的下标来获取哪一个参数
下标方式
  • 通过注解为参数定义可以长久保留的名字(至少出现在字节码文件中)推荐使用
注解方式

2.关于特殊符号的处理

1.使用特殊符号代替 大/小 于号

<  表示< 
&rt;  表示>

2.使用脚本标签 CDATA 推荐

cdata标签

大多数脚本语言都支持CDATA标签解决代码中的特殊符号

3.模糊查询

在sql语句中使用like,但是关键字需要使用通配符,所以可以:

  • 在映射文件里的sql命令上使用 || 拼接通配符
  • 在dao方法被调用时,在实参位置拼接

4.inset和updata过程中null值处理

null值处理

五. mybatis-config.xml文件

实体类全类名的简化

MyBatis允许在配置文件里为实体类entity统一定义简称,

数据库连接数据的定义

将数据库的连接信息单独定义在一个配置文件里,在mybatis配置文件中引入使用