一、Mybatis简介
MyBatis 是一款优秀的半自动的ORC持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
二、框架搭建(3板斧)
只需要通过如下几个步骤,即可基于Mybatis框架快速开发
- 添加
maven依赖
- 添加
全局配置文件
- 添加
dao层接口
和对应的xml映射
文件
1板斧. 添加Maven依赖
mybatis和mysql的jar包
代码语言:javascript复制 <dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.3</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
2板斧. 添加全局配置文件
配置文件惯例放在resources
目录下,包括获取数据库连接实例的数据源(DataSource)以及决定事务作用域和控制方式的事务管理器(TransactionManager)。数据库名my-test
替换成你的.
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/my-test?useSSL=false&useUnicode=true&characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/tiangang/dao/mapper/UserMapper.xml"/>
</mappers>
</configuration>
3板斧. 添加dao层代码和xml映射文件
1). java*daomapper 放dao层对外提供的方法
2). resources*daomapper 放dao层提供的方法的xml映身文件, 与1)对应
3). java*daopo 放dao层的数据实体类
编写接口
Mapper接口,就是我们在dao层提供增删改查的接口,注意是接口
,为什么是接口?就是因为实现类我们是通过xml实现的动态代理类, 后面会详细说明.
public interface UserMapper {
User selectById(@Param("id") int id);
}
编写接口映射文件UserMapper.xml
Mapper接口对应的xml映射文件,注意是放在resources目录下
,与UserMapper.java
的package包路径相同
,从而实现代码和sql语句分离。注意id="selectById
与接口的方法名selectById
一一对应
<?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="com.tiangang.dao.mapper.UserMapper">
<select id="selectById" resultType="com.tiangang.dao.po.User" >
select * from user where id = #{id}
</select>
</mapper>
PO数据对象
PO对象是指与mysql数据库表对应的数据库对象。
代码语言:javascript复制public class User {
private Long id;
private String name;
private Integer age;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User{"
"id=" id
", name='" name '''
", age=" age
'}';
}
}
三. 调用4步走
非常细的4步来阐述一次查询的流程
代码语言:javascript复制public class MybatisApplication {
public static void main(String[] args) throws IOException {
// 1. 得到SqlSessionFactory
String resource = "mybatis-config.xml";
Reader reader = Resources.getResourceAsReader(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
// 2. 得到SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
try {
// 3. 得到具体Mapper
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
// 4. 执行业务代码:各种的增删改查
User user = mapper.selectById(1);
System.out.println(user);
} catch (Exception e) {
e.printStackTrace();
} finally {
sqlSession.close();
}
}
}
四、解读
1. 关键词说明(重点)
在代码中出现3个Mybatis的关键类,分别是:SqlSession、SqlSessionFactory、SqlSessionFactoryBuilder,这几个类中有个关键词我的理解如下:
Session
是指一次会话,即一个线程一个会话- 以
Factory
结尾 设计模式中的工厂模式,说明SqlSessionFactory是生产SqlSession的工厂 - 以
Builder
结尾 设计模式中的构造者模式,说明SqlSessionFactoryBuilder是用来构造SqlSessionFactory的
2. 作用域(Scope)和生命周期(重点)
SqlSessionFactoryBuilder
这个类可以被实例化、使用和丢弃,一旦创建了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。SqlSessionFactory
SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。 因此 SqlSessionFactory 的最佳作用域是应用作用域(比如使用单例模式)。- *
SqlSession
每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。每次收到 HTTP 请求,就可以打开一个 SqlSession,返回一个响应后,就关闭它。 这个关闭操作很重要,为了确保每次都能执行关闭操作,你应该把这个关闭操作放到 finally 块中。
五. 程序运行结果
运行MybatisApplication.main,输出以下结果,大功告成!
六、使用环境
本文基于
- JDK:1.8
- Maven: 3.6.3
- Mysql: 5.7 安装教程
mysql测试表
代码语言:javascript复制CREATE TABLE `user` (
`id` bigint(20) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` varchar(50) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL,
`age` tinyint(1) UNSIGNED NOT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 2 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
insert into `user` VALUES (1,'天罡gg',18);
七. 完整源码下载
https://download.csdn.net/download/scm_2008/86502771