搭建环境----->导入依赖-------->编写代码----------->测试
第一步:由于是持久层做数据交互的所以需要用到数据库
创建数据库
CREATE TABLE `user` (
`id` BIGINT UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) DEFAULT ‘‘,
`email` VARCHAR(50) NOT NULL,
`phone` VARCHAR(20) DEFAULT ‘‘,
`gender` INT(2) ,
`password` VARCHAR(100) NOT NULL DEFAULT ‘‘,
`age` TINYINT DEFAULT NULL,
`create_time` DATETIME DEFAULT CURRENT_TIMESTAMP,
`update_time` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8
第二步:搭建项目 导入依赖
为了学习方便我们一般直接创建一个父工程
导入依赖(当然导入的都是最新的,版本不适合再改)
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.5</version>
</dependency>
<!--mysql数据库驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
<!--junit测试-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
创建一个子模块(这时候的依赖已经帮我们导入好了)
在编写核心配置文件之前应该先了解从 XML 中构建 SqlSessionFactory
每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为核心的。
SqlSessionFactory 的实例可以通过 SqlSessionFactoryBuilder 获得。
而 SqlSessionFactoryBuilder 则可以从 XML 配置文件或一个预先配置的 Configuration 实例来构建出 SqlSessionFactory 实例。
从 XML 文件中构建 SqlSessionFactory 的实例非常简单,建议使用类路径下的资源文件进行配置。 但也可以使用任意的输入流(InputStream)实例,比如用文件路径字符串或 file:// URL 构造的输入流。MyBatis 包含一个名叫 Resources 的工具类,它包含一些实用方法,使得从类路径或其它位置加载资源文件更加容易。
String resource = "org/mybatis/example/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
第三步:编写mybatis核心配置文件
XML 配置文件中包含了对 MyBatis 系统的核心设置,包括获取数据库连接实例的数据源(DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager)。
后面会再探讨 XML 配置文件的详细内容,这里先给出一个简单的示例:
第四步:编写工具类获取SqlSession对象(结合前面的SqlSessionFactory的构建)
package com.xuan.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.InputStream;
?
public class MyBatisUtil {
?
//提升作用域
private static SqlSessionFactory sessionFactory;
private static InputStream inputStream;
?
//通过静态代码块加载SQLSessionFactory对象
static {
?
try {
String resource="mybatis-config.xml";
inputStream = Resources.getResourceAsStream(resource);
sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
?
//通过SqlSessionFactory的openSession方法创建SqlSession对象
public static SqlSession getSqlSession(){
return sessionFactory.openSession();
}
}
这里探究一下为什么要获取SqlSession对象
因为SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。
也就是说你selectOne固然能返回所需数据但是需要强转而getMapper方法就只需要传入字节码文件不用担心可能出错的字符串字面值以及强制类型转换。
//诚然,这种方式能够正常工作,对使用旧版本 MyBatis 的用户来说也比较熟悉。但现在有了一种更简洁的方式——使用和指定语句的参数和返回值相匹配的接口(比如 BlogMapper.class),现在你的代码不仅更清晰,更加类型安全,还不用担心可能出错的字符串字面值以及强制类型转换。
?
package org.apache.ibatis.session;
?
import java.io.Closeable;
import java.sql.Connection;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.cursor.Cursor;
import org.apache.ibatis.executor.BatchResult;
?
public interface SqlSession extends Closeable {
?
<T> T selectOne(String statement);
?
<T> T selectOne(String statement, Object parameter);
?
<E> List<E> selectList(String statement);
?
<E> List<E> selectList(String statement, Object parameter);
?
<E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds);
?
<K, V> Map<K, V> selectMap(String statement, String mapKey);
?
<K, V> Map<K, V> selectMap(String statement, Object parameter, String mapKey);
?
<K, V> Map<K, V> selectMap(String statement, Object parameter, String mapKey, RowBounds rowBounds);
?
<T> Cursor<T> selectCursor(String statement);
?
<T> Cursor<T> selectCursor(String statement, Object parameter);
?
<T> Cursor<T> selectCursor(String statement, Object parameter, RowBounds rowBounds);
?
void select(String statement, Object parameter, ResultHandler handler);
?
void select(String statement, ResultHandler handler);
?
void select(String