文章目录
- 1、MyBatis框架的概述
-
- 1.1、什么是框架,框架要解决那些问题?
- 1.2、持久层技术解决方案有哪些?
- 1.3、什么是ORM?
- 2、JDBC操作数据库的问题分析
-
- 2.1、JDBC源码回顾
- 2.2、JDBC问题分析
- 3、MyBatis的环境搭建
-
- 3.1、下载MyBatis框架
- 3.2、Mybatis环境搭建
- 3.3、Mybatis环境搭建的注意事项
- 4、MyBatis入门案例
-
- 4.1、创建数据库
- 4.2、引入log4j配置文件,可省略
- 4.3、Mybatis简单的测试案例
- 4.4、Mybatis注解开发案例
- 4.5、小结
1、MyBatis框架的概述
MyBatis 是一个优秀的基于 Java 的持久层框架,它内部封装了 JDBC,使开发者只需要关注 SQL 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建 Statement 等繁杂的过程。
MyBatis 通过 XML 或注解的方式将要执行的各种 Statement 配置起来,并通过 Java 对象和 Statement 中 SQL 的动态参数进行映射生成最终执行的 SQL 语句,最后由 MyBatis 框架执行 SQL 并将结果映射为 Java 对象并返回。
采用 ORM 思想解决了实体和数据库映射的问题,对 JDBC 进行了封装,屏蔽了 JDBC API 底层访问细节,使我们不用与 JDBC API 打交道,就可以完成对数据库的持久化操作。
Mybatis框架的执行流程:
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsICM38FdsYkRGZkRG9lcvx2bjxiNx8VZ6l2cs0TV65keBRlT5VkaOVTRzwEMW1mY1RzRapnTtxkb5ckYplTeMZTTINGMShUYfRHelRHLwEzX39GZhh2css2RkBnVHFmb1clWvB3MaVnRtp1XlBXe0xyayFWbyVGdhd3LcV2Zh1Wa9M3clN2byBXLzN3btg3Pn5GcuYTO2UTOxMTM3IDMxkTMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
1.1、什么是框架,框架要解决那些问题?
框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种定义认为,框架是可被应用开发者定制的应用骨架。前者是从应用方面而后者是从目的方面给出的定义。
简而言之,框架其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。简单说就是使用别人搭好的舞台,你来做表演。而且,框架一般是成熟的,不断升级的软件。
框架要解决的最重要的一个问题是技术整合的问题,在 J2EE 的 框架中,有着各种各样的技术,不同的软件企业需要从 J2EE 中选择不同的技术,这就使得软件企业最终的应用依赖于这些技术,技术自身的复杂性和技术的风险性将会直接对应用造成冲击。
而应用是软件企业的核心,是竞争力的关键所在,因此应该将应用自身的设计和具体的实现技术解耦。这样,软件企业的研发将集中在应用的设计上,而不是具体的技术实现,技术实现是应用的底层支撑,它不应该直接对应用产生影响。
框架一般处在低层应用平台(如 J2EE )和高层业务逻辑之间的中间层。
1.2、持久层技术解决方案有哪些?
(1)JDBC(Java DataBase Connectivity,Java 数据库连接):JDBC是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。主要操作的三个对象:Connection、PreparedStatement 和 ResultSet。
(2)Spring 的 JdbcTemplate:对数据库的操作在 JDBC 上面做了深层次的封装,主要封装了PreparedStatement和ResultSet。
(3)Apache 的 DBUtils:对JDBC进行简单封装的开源工具类库,使用它能够简化JDBC应用程序的开发,同时也不会影响程序的性能。
需要知道的是,以上这些其实都不算做框架。JDBC是一种规范,而Spring 的 JdbcTemplate和Apache 的 DBUtils都只是一个工具类。
1.3、什么是ORM?
ORM(Object Relational Mappging),对象关系映射。
简单来说,就是把数据库表和实体类、数据库表中的列和实体类的属性对应起来,仅仅操作实体类就可以实现操作数据库表。
实体类的属性 | 数据库表的列 | |
---|---|---|
User实体类 | – 对应 – | user表 |
userId | – 对应 – | id |
userName | – 对应 – | user_name |
一般来说,常常将实体类中的属性和数据库表的字段名称保持一致。
实体类的属性 | 数据库表的列 | |
---|---|---|
User实体类 | – 保持一致 – | user表 |
id | – 保持一致 – | id |
user_name | – 保持一致 – | user_name |
2、JDBC操作数据库的问题分析
2.1、JDBC源码回顾
import java.sql.*;
public class JdbcTest {
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
// 加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
// 通过驱动管理类获取数据库连接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/demo?characterEncoding=utf-8", "root", "root");
// 定义Sql语句,?表示占位符
String sql = "select * from user where name = ?";
// 获取预处理statement
preparedStatement = connection.prepareStatement(sql);
// 设置参数,第一个参数为 sql 语句中参数的序号(从1开始),第二个参数为设置的参数值
preparedStatement.setString(1, "Atlantis");
// 向数据库发出sql执行查询,查询出结果集
resultSet = preparedStatement.executeQuery();
// 遍历查询结果集
while (resultSet.next()) {
String id = resultSet.getString("id");
String name = resultSet.getString("name");
System.out.println("id:" + id + " name:" + name);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 释放资源
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
2.2、JDBC问题分析
(1)数据库连接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库连接池可解决此问题。
(2)SQL 语句在代码中硬编码,造成代码不易维护,实际应用 SQL 变化的可能较大,SQL 变动需要改变 Java
代码。
(3)使用 PreparedStatement 向占有位符号传参数存在硬编码,因为 SQL 语句的 where 条件不一定,可能多也可能少,修改 SQL 还要修改代码,系统不易维护。
(4)对结果集解析存在硬编码(查询列名),SQL 变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成 pojo 对象解析比较方便。
3、MyBatis的环境搭建
3.1、下载MyBatis框架
Maven中央仓库下载:https://mvnrepository.com/artifact/org.mybatis/mybatis。
3.2、Mybatis环境搭建
(1)创建Maven工程并在 pom.xml 导入需要的 jar 包坐标。
注意,除了 Mybatis 的 jar 包外,我们还需要 Mysql 数据库连接的 jar 包。 log4j 日志和 junt 单元测试的 jar 包可以根据实际情况是否导入。
若不使用Maven构建工程,可直接将
mybatis-x.x.x.jar
以及其他相应的 jar 包导入项目即可。
<?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>com.atlantis</groupId>
<artifactId>Mybatis</artifactId>
<version>1.0-SNAPSHOT</version>
<!-- 打包方式 -->
<packaging>jar</packaging>
<!-- 设置编码 -->
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<maven.compiler.encoding>UTF-8</maven.compiler.encoding>
</properties>
<dependencies>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!-- Mysql数据库连接 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<!-- log4j日志 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- junit单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.10</version>
<scope>test</scope>
</dependency>
</dependencies>
</project>
(2)创建实体类和Dao层接口
package com.atlantis.domain;
import java.util.Date;
public class User {
private Integer id;
private String username;
private String sex;
private Date birthday;
private String address;
// 省略构造方法
// 省略get和set方法
// 省略toString方法
}
package com.atlantis.dao;
import com.atlantis.domain.User;
import java.util.List;
public interface UserDao {
/**
* 查询所有用户
* @return List<User>
*/
List<User> findAll();
}
(3)创建Mybatis的主配置文件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">
<!-- Mybatis的主配置文件 -->
<configuration>
<!-- 配置数据库环境 -->
<environments default="mysql">
<!-- Mysql的配置环境 -->
<environment id="mysql">
<!-- 配置事务的类型 -->
<transactionManager type="JDBC"/>
<!-- 配置数据源(连接池) -->
<dataSource type="POOLED">
<!-- 配置连接数据库的4个基本信息 -->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!-- 指定映射配置文件的位置,即每个Dao接口独立的配置文件 -->
<mappers>
<mapper resource="com/atlantis/dao/UserDao.xml"/>
</mappers>
</configuration>
(4)创建Dao接口的映射配置文件xxxDao.xml
<?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.atlantis.dao.UserDao">
<select id="findAll" resultType="com.atlantis.domain.User">
select * from user
</select>
</mapper>
3.3、Mybatis环境搭建的注意事项
①在 Mybatis 中,把持久层的操作接口名称和映射文件也叫做 Mapper,因此 UserDao 和 UserMapper 是一样的。
②在 IDEA 中创建目录(Directory)和包(Package)是不一样的,在创建包时
com.atlantis.dao
是三级目录,在创建目录时
com.atlantis.dao
是一级目录。
③ Mybatis 的映射配置文件位置必须和 Dao 接口的包结构相同。
④映射配置文件的 mapper 标签 namespace 属性的取值必须是 Dao 接口的全路径类名。
⑤映射配置文件的操作配置,id属性的取值必须是 Dao 接口的方法名。
当我们遵从了③④⑤点之后,在开发过程中无需再写Dao接口的实现类,因为剩下的工作都交给Mybatis完成了。
4、MyBatis入门案例
4.1、创建数据库
CREATE DATABASE mybatis CHARACTER SET utf8 COLLATE utf8_general_ci;
USE mybatis;
CREATE TABLE user (
id int(11) PRIMARY KEY NOT NULL AUTO_INCREMENT,
username varchar(32) NOT NULL COMMENT '用户名称',
sex char(1) default NULL COMMENT '性别',
birthday datetime default NULL COMMENT '生日',
address varchar(256) default NULL COMMENT '地址'
)CHARACTER SET utf8 COLLATE utf8_general_ci;
-- 插入数据
insert into user values (1,'测试名称','男','2019-10-22 17:47:08','北京');
insert into user values (2,'Atlantis','男','2018-10-22 17:47:08','武汉');
insert into user values (3,'长安','女','2017-10-22 17:47:08','杭州');
insert into user values (4,'Andersen','男','2016-10-22 17:47:08','上海');
4.2、引入log4j配置文件,可省略
### 配置根 ###
# log4j.rootCategory=INFO DEBUG, CONSOLE ,LOGFILE
log4j.rootCategory=DEBUG, CONSOLE
log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE
### 配置输出到控制台 ###
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern=[%d{YYYY-MM-dd HH:mm:ss}] %-6r [%15.15t] %-5p %30.30c %x - %m %n
4.3、Mybatis简单的测试案例
public class MybatisTest {
public static void main(String[] args) throws Exception {
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建 SqlSessionFactory 的构建者对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.使用构建者创建工厂对象 SqlSessionFactory
SqlSessionFactory factory = builder.build(in);
//4.使用 SqlSessionFactory 生产 SqlSession 对象
SqlSession session = factory.openSession();
//5.使用 SqlSession 创建 dao 接口的代理对象
UserDao userDao = session.getMapper(UserDao.class);
//6.使用代理对象执行查询所有方法
List<User> users = userDao.findAll();
for (User user : users) {
System.out.println(user);
}
//7.释放资源
session.close();
in.close();
}
}
4.4、Mybatis注解开发案例
(1)在Dao持久层接口中添加注解
public interface UserDao {
/**
* 查询所有用户
* @return List<User>
*/
@Select("select * from user")
List<User> findAll();
}
(2)修改Mybatis的主配置文件SQLMapConfig.xml
<mappers>
<mapper class="com.atlantis.dao.UserDao"/>
</mappers>
注意事项:在使用基于注解的 Mybatis 配置时,请移除 xml 的映射配置(UserDao.xml)。
4.5、小结
通过 Mybatis 入门示例,我们发现使用 Mybatis 是非常容易的一件事情,因为只需要编写 Dao 接口并且按照 Mybatis 要求编写两个配置文件,就可以实现功能。远比我们之前的 JDBC 方便多了。
使用注解之后,将变得更为简单,只需要编写一个 Mybatis 配置文件。
后面讲解一些 Mybatis 的基本使用:https://blog.csdn.net/q961250375/article/details/102766074。