1.先说一下传统JDBC的劣势:
- 1.数据库连接创建、释放频繁会造成系统资源浪费,从而影响系统性能。
- 2.SQL语句在代码中硬编码,造成代码不易维护。在实际应用的开发中,SQL变化的可能性较大。在传统JDBC编程中,SQL变动需要改变Java代码,违反了开闭原则。
- 3.用PreparedStatement向占有位符号传参数存在硬编码,因为SQL语句的where条件不一定,可能多也可能少,修改SQL需要修改代码,造成系统不易维护。
- 4.JDBC对结果集解析存在硬编码(查询列名),SQL变化导致解析代码变化,造成系统不易维护。
2.MyBatis框架解决JDBC编程劣势的对应方案如下:
- 1.在SqlMapConfig.xml中配置数据链接池,使用连接池管理数据库链接。
- 2.MyBatis将SQL语句配置在MyBatis的映射文件中,实现了与Java代码的分离。
- 3.MyBatis自动将Java对象映射至SQL语句,通过Statement中的parameterType定义输入参数的类型。
- 4.MyBatis自动将SQL执行结果映射至Java对象,通过Statement中的resultType定义输出结果的类型。
3.Mybatis入门程序编写(实现根据id查询用户信息的操作)
1.创建好maven工程
2.引入MySQL驱动包,Junit测试包,MyBatis的核心包等相关依赖
pom.xml如下配置:
<?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>org.example</groupId>
<artifactId>_20230328_2</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.3.RELEASE</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
</dependencies>
</project>
3.创建数据库db_test1;
4. 在resources目录下创建db.properties
mysql.driver=com.mysql.jdbc.Driver
mysql.url=jdbc:mysql://localhost:3306/db_test1?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false
mysql.username=root
mysql.password=666666
5.在resources目录下创建mybatis-config.xml(把db.properties给配置到mybatis-config.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"/>
<!-- 数据库连接相关配置 ,db.properties文件中的内容-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<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>
</configuration>
6.在数据库db_test1中创建user表并插入数据
7.根据user表结构创建实体类User(生成get,set,toString方法)
package cn.hdc.pojo;
public class User {
private int id;
private String username;
private String password;
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
8.根据User实体类在resources路径下创建mapper,mapper文件夹下在创建UserMapper.xml(用来放sql语句)
<?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="cn.hdc.pojo.User">
<select id="findById" parameterType="int" resultType="cn.hdc.pojo.User">
select * from user where id = #{id}
</select>
</mapper>
9.UserMapper.xml我们已经写好了,现在配置一下mybatis-config.xml(让mybatis-config.xml获取一下mapper文件夹下的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"/>
<!-- 数据库连接相关配置 ,db.properties文件中的内容-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<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>
<!-- 配置xxxMapper.xml文件的位置-->
<mapper resource="mapper/UserMapper.xml"></mapper>
</mappers>
</configuration>
10.利用junit创建一个测试类
package cn.hdc.test;
import cn.hdc.pojo.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.Test;
import java.io.IOException;
import java.io.InputStream;
public class UserTest {
@Test
public void findById() throws IOException {
//1.获取核心配置文件
InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
//2.创建sqlSessionFactory工厂对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//3.创建sqlSession对象
SqlSession session = sqlSessionFactory.openSession();
//4.执行sql语句,sql语句的唯一标识:namespace.statementId
User user = session.selectOne("cn.hdc.pojo.User.findById", 1);
System.out.println(user);
//5.释放资源
session.close();
}
}
11.项目路径如下:
12.运行结果:
MyBatis工作原理
MyBatis框架在操作数据库时,大体经过了8个步骤。下面结合MyBatis工作原理图对每一步流程进行详细讲解,具体如下。
- ( 1 ) MyBatis读取核心配置文件mybatis-config.xml : mybatis-config.xml核心配置文件主要配置了MyBatis的运行环境等信息。
- ( 2)加载映射文件Mapper.xml : Mapper.xml文件即SQL映射文件,该文件配置了操作数据库的SQL语句,需要在mybatis-config.xml中加载才能执行。
- ( 3)构造会话工厂:通过MyBatis的环境等配置信息构建会话工厂SqlSessionFactory,用于创建SqlSession。
- (4)创建会话对象︰由会话工厂SqlSessionFactory创建SqlSession对象,该对象中包含了执行SQL语句的所有方法。
- ( 5)创建执行器︰会话对象本身不能直接操作数据库,MyBatis底层定义了一个Executor接口用于操作数据库,执行器会根据SqlSession传递的参数动态的生成需要执行的SQL语句,同时负责查询缓存地维护。
- (6)封装SQL信息:SqlSession内部通过执行器Executor操作数据库,执行器将待处理的SQL信息封装到MappedStatement对象中。
- (7)操作数据库∶根据动态生成的SQL操作数据库。
- (8 )输出结果映射∶执行SQL语句之后,通过MappedStatement对象将输出结果映射至Java对象中。