1.1 Mybatis 简介
说人话就是MyBatis是一个优秀的基于ORM的半自动轻量级持久层框架,它对jdbc的操作数据库的过程进行封装, 使开发者只需要关注 SQL 本身,而不需要花费精力去处理例如注册驱动、创建connection、创建 statement、手动设置参数、结果集检索等jdbc繁杂的过程代码。
原始的jdbc开发有一系列问题:
1、数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能
2、 sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变java 代码。
3、查询操作时,需要手动将结果集中的数据手动封装到实体中。
Mybatis的出现就是为了解决这些问题:
1、 使用数据库连接池初始化连接资源 。
2、将sql语句抽取到xml配置文件中 。
2、使用反射、内省等底层技术,自动将实体与表进行属性与字段的自动映射。
1.2 了解ORM思想
ORM(Object Relational Mapping)对象关系映射。
mybatis采用ORM思想解决了实体和数据库映射的问题,对jdbc 进行了封装,屏蔽了jdbc api 底层访问细节,使我们不用与jdbc api 打交道,就可以完成对数据库的持久化操作 。
O(对象模型): 实体对象,即我们在程序中根据数据库表结构建立的一个个实体javaBean 。
R(关系型数据库的数据结构): 关系数据库领域的Relational(建立的数据库表) 。
M(映射): 从R(数据库)到O(对象模型)的映射,可通过XML文件映。
实现:
(1)让实体类和数据库表进行一一对应关系 先让实体类和数据库表对应 再让实体类属性和表里面字段对应 。
(2)不需要直接操作数据库表,直接操作表对应的实体类对象。
1.3 步骤分析
1、创建数据库及user表
2、创建maven工程,导入依赖(MySQL驱动、mybatis、junit)
3、编写User实体类
4、编写User接口
5、 编写UserMapper.xml映射配置文件(ORM思想)
6、编写SqlMapConfig.xml核心配置文件 数据库环境配置 映射关系配置的引入(引入映射配置文件的路径)
7、编写测试代码
1.加载核心配置文件
2.获取sqlSessionFactory工厂对象
3.获取sqlSession会话对象
4.执行sql
5.打印结果
6.释放资源
2.1 代码实现
2.1.1、创建user数据表
CREATE DATABASE `mybatis_db`;
USE `mybatis_db`;
CREATE TABLE `user` (
`id` int(11) NOT NULL auto_increment,
`username` varchar(32) NOT NULL COMMENT '用户名称',
`birthday` datetime default NULL COMMENT '生日',
`sex` char(1) default NULL COMMENT '性别',
`address` varchar(256) default NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into `user`(`id`,`username`,`birthday`,`sex`,`address`) values (1,'小离
','2021-10-18 00:00:00','男','湖北武汉'),(2,'小红','2021-10-18 00:00:00','女','湖北武汉');
2.1.2 导入Maven依赖
<?xml version="1.0" encoding="UTF-8"?>
<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>cn.itxiaoli</groupId>
<artifactId>mybatis_quickstart</artifactId>
<version>1.0-SNAPSHOT</version>
<!--指定编码和版本-->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
<java.version>1.8</java.version>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<!--mybatis坐标-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<!--mysql驱动坐标-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!--单元测试坐标-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter</artifactId>
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>
</project>
2.1.3 编写User实体类
package cn.itxiaoli.domain;
import java.util.Date;
/**
* @Author XiaoLi
* @Date 2021/10/18 0:57
*/
public class User {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", birthday=" + birthday +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
}
2.1.4 编写UserDao接口
package cn.itxiaoli.dao;
import cn.itxiaoli.domain.User;
import java.util.List;
/**
* @Author XiaoLi
* @Date 2021/10/18 2:15
*/
public interface UserDao {
/**
* 查询所有信息
* @return List<User>
* */
List<User> findAll();
}
2.1.5 编写UserMapper映射文件
<?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属性:在Mybatis全局范围内找到一个具体的Mapper配置 -->
<!--namespace是用于绑定Dao接口的,即面向接口编程。当你的namespace绑定接口后,就可以不用写接口实现类,Mybatis会通过该绑定自动找到对应要执行的SQL语句-->
<mapper namespace="cn.itxiaoli.dao.UserDao">
<!-- 编写具体的SQL语句,使用id属性唯一的标记一条SQL语句 -->
<!-- resultType属性:返回结果类型(自动映射封装)指定封装查询结果的Java实体类的全限定名 -->
<select id="findAll" resultType="cn.itxiaoli.domain.User">
select * from user
</select>
</mapper>
2.1.6 编写 SqlMapConfig.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>
<!-- environments表示配置Mybatis的开发环境,可以配置多个环境,在众多具体环境中,使用default属性指定实际运行时使用的环境。default属性的取值是environment标签的id属性的值。 -->
<environments default="development">
<!-- environment表示配置Mybatis的一个具体的环境 -->
<environment id="development">
<!-- Mybatis的内置的事务管理器 -->
<transactionManager type="jdbc"/>
<!-- 使用连接池 -->
<dataSource type="POOLED">
<!-- 建立数据库连接的具体信息 -->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<!-- useSSL=false MySQL在高版本需要指明是否进行SSL连接 -->
<property name="url" value="jdbc:mysql://192.168.113.1:3306/mybatis_db?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--加载映射配置-->
<mappers>
<mapper resource="mapper/UserMapper.xml"/>
</mappers>
</configuration>
1. 其中,事务管理器(transactionManager)类型有两种:
- JDBC:
这个配置就是直接使用了JDBC 的提交和回滚设置,它依赖于从数据源得到的连接来管理事务作用域。
- MANAGED:
这个配置几乎没做什么。它从来不提交或回滚一个连接,而是让容器来管理事务的整个生命周期。
例如:mybatis与spring整合后,事务交给spring容器管理。
2. 其中,数据源(dataSource)常用类型有三种:
- UNPOOLED:
这个数据源的实现只是每次被请求时打开和关闭连接。
- POOLED:
这种数据源的实现利用“池”的概念将 JDBC 连接对象组织起来。
- JNDI :
这个数据源实现是为了能在如 EJB 或应用服务器这类容器中使用,容器可以集中或在外部配置数据
源,然后放置一个 JNDI 上下文的数据源引用
2.1.7 根据文档编写测试类(MybatisTest)
package cn.itxiaoli.test;
import cn.itxiaoli.domain.User;
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 org.junit.jupiter.api.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
/**
* @Author XiaoLi
* @Date 2021/10/18 1:33
*/
public class MybatisTest {
@Test
public void test() throws IOException {
// 加载核心配置文件
InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
// 获取SqlSessionFactory工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
// 获取SqlSession会话对象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 执行sql sqlSession.selectList()方法的参数为 sqlSession.selectList("namespace.id")
List<User> users = sqlSession.selectList("cn.itxiaoli.dao.UserDao.findAll");
// 遍历打印
for (User u : users) {
System.out.println(u);
}
// 释放资源
sqlSession.close();
}
}
看不懂因为你是大聪明。
看不懂