1.什么是MyBatis?
MyBatis
是orm
解决方案之一,是一个基于Java
的持久层框架。MyBatis
本是apache
的一个开源项目iBatis
, 2010apache software foundation
迁移到了google code
,并且改名为MyBatis
。MyBatis
是jdbc
和Hibernate
的一种折中选择,在MyBatis
我们可以自己控制SQL
语句,通过映射关系实现数据库表到持久化类的映射
1.1 MyBatis参考文档
2. Mybatis
之hello world
使用MyBatis
框架有几个必要的东西
MyBatis
配置文件,用于设置数据库链接信息MyBatis
映射文件,用于映射数据库表和持久化类的关系- 为了方便,定义一个
MyBatisUtil
类,用于获得数据库的SqlSession
(用于查询数据库)
2.1 创建数据库(使用MySQL
数据库)
首先我们创建我们的数据库,数据库的名称为school
,数据库中有一个表Student
DROP DATABASE IF EXISTS school;
CREATE DATABASE IF NOT EXISTS school;
USE school;
CREATE TABLE student(
id INT(5) PRIMARY KEY,
NAME VARCHAR(10),
sal DOUBLE(8,2)
);
2.2 创建项目,测试第一个MyBatis程序
- 新建一个Maven程序(
POM.XML
)
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com</groupId>
<artifactId>skd</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<name>skd</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.1</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
- 创建
Student
类
public class Student {
private Integer id;
private String name;
private Double sal;
public Student(){}
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 getSal() {
return sal;
}
public void setSal(Double sal) {
this.sal = sal;
}
}
- 创建
Student
类和student
表的映射关系
<?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="mynamespace" >
<resultMap id="studentMap" type="com.Student" >
<id column="id" property="id" jdbcType="INTEGER" />
<result column="name" property="name" jdbcType="VARCHAR" />
<result column="sal" property="sal" jdbcType="VARCHAR" />
</resultMap>
<insert id="add1">
insert into students(id,name,sal) values(1,'哈哈',7000)
</insert>
</mapper>
- 创建
mybatis
的配置文件
db.properties
mysql.driver=com.mysql.jdbc.Driver
mysql.url=jdbc:mysql://127.0.0.1:3306/school
#数据库用户名
mysql.username=root
#数据库密码
mysql.password=root
mybatis.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>
<!-- 加载类路径下的属性文件 -->
<properties resource="db.properties"/>
<!-- 设置一个默认的连接环境信息 -->
<environments default="mysql_developer">
<!-- 连接环境信息,取一个任意唯一的名字 -->
<environment id="mysql_developer">
<!-- mybatis使用jdbc事务管理方式 -->
<transactionManager type="jdbc"/>
<!-- mybatis使用连接池方式来获取连接 -->
<dataSource type="pooled">
<!-- 配置与数据库交互的4个必要属性 -->
<property name="driver" value="${mysql.driver}"/>
<property name="url" value="${mysql.url}"/>
<property name="username" value="${mysql.username}"/>
<property name="password" value="${mysql.password}"/>
</dataSource>
</environment>
</environments>
<!-- 加载映射文件-->
<mappers>
<mapper resource="com/StudentMapper.xml"/>
</mappers>
</configuration>
- 创建
MyBatisUtil
类
package utils;
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.Reader;
public class MyBatisUtil {
private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
private static SqlSessionFactory sqlSessionFactory;
static{
try {
//加载mybatis.xml配置文件
Reader reader = Resources.getResourceAsReader("mybatis.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
private MyBatisUtil(){}
public static SqlSession getSqlSession(){
SqlSession sqlSession = threadLocal.get();
if(sqlSession == null){
sqlSession = sqlSessionFactory.openSession();
threadLocal.set(sqlSession);
}
return sqlSession;
}
public static void closeSqlSession(){
SqlSession sqlSession = threadLocal.get();
if(sqlSession != null){
sqlSession.close();
threadLocal.remove();
}
}
}
- 创建测试类,向数据库插入一条数据
package com.test;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import utils.MyBatisUtil;
public class TestHelloWorld {
@Test
public void testMybatis()
{
SqlSession sqlSession = MyBatisUtil.getSqlSession();
try{
//执行mynamespace.add1的sql语句,正好我们的映射文件想对应
sqlSession.insert("mynamespace.add1");
}catch(Exception e){
e.printStackTrace();
sqlSession.rollback();
}finally{
sqlSession.commit();
}
MyBatisUtil.closeSqlSession();
}
}
- 运行结果
2.3 mybatis
工作流程
- 通过
Reader
对象读取src
目录下的mybatis.xml
配置文件(该文件的位置和名字可任意) - 通过
SqlSessionFactoryBuilder
对象创建SqlSessionFactory
对象 - 从当前线程中获取SqlSession对象
- 事务开始,在
mybatis
中默认(也就是不需要自己开启事务) - 通过
SqlSession
对象读取StudentMapper.xml
映射文件中的操作编号,从而读取sql语句 - 事务提交,必写
- 关闭
SqlSession
对象,并且分开当前线程与SqlSession
对象,让GC
尽早回收