目录
学习目标
- 【学习】MyBatis的快速入门
- 【实操】MyBatis的查询数据操作
- 【掌握】MyBatis核心配置文件概述
一.MyBatis框架概述
MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。
二.JDBC的编程分析
这里有两个区别:
其中第一个是 以前的 驱动包是 com.mysql.jdbc.Driver 而安装了 mysql 8.0过后要改成 com.mysql.cj.jdbc.Driver , 连接方式也不需要SSL方式了,所以要手动设置为false
Class.forName(“com.mysql.cj.jdbc.Driver”);
conn=DriverManager.getConnection
(“jdbc:mysql://localhost:3306/你的数据库名字?useSSL=false&serverTimezone=UTC”,“root”,“你的root账户下的密码”);
实际例子 (有mysql5和mysql8的连接对比
连接JDBC代码回顾
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JdbcTest {
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
// 加载数据库驱动 区别一:
//mysql5的写法: Class.forName("com.mysql.jdbc.Driver");
//mysql8 写法 如下
Class.forName("com.mysql.cj.jdbc.Driver");
// 通过驱动管理类获取数据库连接 区别二:
//mysql5: connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8", "root", "root");
// mysql8:
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?useSSL=false&serverTimezone=UTC","root","root");
// 定义sql语句 ?表示占位符
String sql = "select * from user where username = ?";
// 获取预处理statement
preparedStatement = connection.prepareStatement(sql);
// 设置参数,第一个参数为sql语句中参数的序号(从1开始),第二个参数为设置的参数值
preparedStatement.setString(1, "大马猴");
// 向数据库发出sql执行查询,查询出结果集
resultSet = preparedStatement.executeQuery();
// 遍历查询结果集
while (resultSet.next()) {
System.out.println(resultSet.getString("id") + " " + resultSet.getString("username"));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 释放资源
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
JDBC问题分析
1、数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
2、Sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变 java代码。
3、使用 preparedStatement 向占有位符号传参数存在硬编码,因为 sql 语句的 where 条件不一定,可能多也可能少,修改 sql 还要修改代码,系统不易维护。
4、对结果集解析存在硬编码(查询列名),sql 变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成 pojo 对象解析比较方便。
(Mybatis)问题解决方案:
1.使用数据库连接池初始化连接资源
2.将sql语句抽取到xml配置文件中
3.使用反射、内省等底层技术,自动将实体与表进行属性与字段的自动映射
三.Mybatis和其它持久化层技术对比
JDBCSQL 夹杂在 Java 代码中耦合度高,导致硬编码内伤维护不易且实际开发需求中 SQL 有变化,频繁修改的情况多见代码冗长,开发效率低Hibernate 和 JPA操作简便,开发效率高程序中的长难复杂 SQL 需要绕过框架内部自动生产的 SQL ,不容易做特殊优化基于全映射的全自动框架,大量字段的 POJO 进行部分映射时比较困难。反射操作太多,导致数据库性能下降MyBatis轻量级,性能出色SQL 和 Java 编码分开,功能边界清晰。 Java 代码专注业务、 SQL 语句专注数据开发效率稍逊于 HIbernate ,但是完全能够接受
四.Mybatis入门准备
Mybatis官网地址:mybatis – MyBatis 3 | Introduction
Mybatis中文官网地址:mybatis – MyBatis 3 | 简介
五.MyBatis开发步骤:
1.添加MyBatis学习的依赖
2.创建数据表
3.编写User实体类
4.编写持久层UserMapper接口
5.编写持久层接口的映射文件UserMapper.xml
6.编写核心配置文件mybatis-Config.xml
7.编写核心配置文件jdbc.properties
8.编写log4j.xml文件
9.编写测试类
1.新建maven项目
如果使用maven创建的项目,需导入相关依赖:
在pom.xml导入依赖
pom.xml :
<!-- Mybatis核心 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.7</version>
</dependency>
<!-- junit测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- MySQL驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
<!-- log4j日志 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2.创建数据表
数据库:mybatis 表:t_user
SQL文件:
/*
Navicat Premium Data Transfer
Source Server : mybatis
Source Server Type : MySQL
Source Server Version : 80013
Source Host : localhost:3306
Source Schema : mybatis
Target Server Type : MySQL
Target Server Version : 80013
File Encoding : 65001
Date: 17/09/2022 12:00:15
*/
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
-- ----------------------------
-- Table structure for t_user
-- ----------------------------
DROP TABLE IF EXISTS `t_user`;
CREATE TABLE `t_user` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`password` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`age` int(11) NULL DEFAULT NULL,
`sex` char(10) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
`email` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,
PRIMARY KEY (`id`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 37 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Dynamic;
-- ----------------------------
-- Records of t_user
-- ----------------------------
INSERT INTO `t_user` VALUES (1, 'admin', '123456', 123, '男', '1234@qq.com');
INSERT INTO `t_user` VALUES (2, 'admin', '123456', 1234, '男', '12345·12341@qq.com');
INSERT INTO `t_user` VALUES (3, 'admin', '123456', 2365, '男', '1234543@qq.com');
INSERT INTO `t_user` VALUES (4, '张三', '123456', 7654, '男', '34567@qq.com');
INSERT INTO `t_user` VALUES (36, 'admin', '123456', 54, '男', '2345678@qq.com');
INSERT INTO `t_user` VALUES (37, 'admin', '123456', 23543, '男', '1234567@qq.com');
INSERT INTO `t_user` VALUES (38, 'admin', '123456', 2332, '男', '12345678@qq.com');
INSERT INTO `t_user` VALUES (39, 'admin', '123456', 2322, '男', '1234567@qq.com');
INSERT INTO `t_user` VALUES (40, 'admin', '123456', 2322, '男', '123456@qq.com');
SET FOREIGN_KEY_CHECKS = 1;
3.编写User实体类
package com.wsay.mybatis.pojo;
public class User {
private Integer id;
private String username;
private String password;
private Integer age;
private String sex;
private String email;
public User(){
}
public User(Integer id, String username, String password, Integer age, String sex, String email) {
this.id = id;
this.username = username;
this.password = password;
this.age = age;
this.sex = sex;
this.email = email;
}
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 String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", password='" + password + '\'' +
", age=" + age +
", sex='" + sex + '\'' +
", email='" + email + '\'' +
'}';
}
}
4.编写持久层UserMapper接口
MyBatis 中的 mapper 接口相当于以前的 dao 。但是区别在于, mapper 仅仅是接口,我们不需要 提供实现类。
package com.wsay.mybatis.mapper;
import com.wsay.mybatis.pojo.User;
import java.util.List;
public interface UserMapper {
// mybatis面向接口编程的两个一致。
// 1.映射文件的namespace要和mapper接口的全类名保持一致。
// 2.映射文件中sql语句id和mapper接口中的方法名一致
//
// 表--实体类--mapper接口--映射文件
//查询所有的用户信息
List<User> getAllUser();
}
5.编写持久层接口的映射文件UserMapper.xml
相关概念: ORM ( O bject R elationship M apping )对象关系映射。对象: Java 的实体类对象关系:关系型数据库映射:二者之间的对应关系
1 、映射文件的命名规则:表所对应的实体类的类名 +Mapper.xml例如:表 t_user ,映射的实体类为 User ,所对应的映射文件为 UserMapper.xml因此一个映射文件对应一个实体类,对应一张表的操作MyBatis 映射文件用于编写 SQL ,访问以及操作表中的数据MyBatis 映射文件存放的位置是 src/main/resources/mappers 目录下2 、 MyBatis 中可以面向接口操作数据,要保证两个一致:a>mapper 接口的全类名和映射文件的命名空间( namespace )保持一致b>mapper 接口中方法的方法名和映射文件中编写 SQL 的标签的 id 属性保持一致
创建位置:必须和持久层接口在相同的包中。
名称:必须以持久层接口名称命名文件名,扩展名是.xml
UserMapper.xml
<?xml version="1.0" encoding="utf8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.wsay.mybatis.mapper.UserMapper">
<!-- List<User> getAllUser();-->
<select id="getAllUser" resultType="com.wsay.mybatis.pojo.User">
select * from t_user
</select>
</mapper>
6.编写核心配置文件mybatis-Config.xml
习惯上命名为 mybatis-config.xml ,这个文件名仅仅只是建议,并非强制要求。将来整合 Spring之后,这个配置文件可以省略,所以大家操作时可以直接复制、粘贴。核心配置文件主要用于配置连接数据库的环境以及 MyBatis 的全局配置信息
核心配置文件中的标签必须按照固定的顺序:properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?
核心配置文件的目录
注意元素节点的顺序!
mybatis-Config.xml
<?xml version="1.0" encoding="utf8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--
mybatis核心配置文件中,标签的顺序:
properties?,settings?,typeAliases?,typeHandlers?,objectFactory?
,objectWrapperFactory?,reflectorFactory?,plugins?,environments?
,databaseIdProvider?,mappers
-->
<!-- 引入properties文件-->
<properties resource="jdbc.properties"/>
<!-- 设置类型别名-->
<typeAliases>
<!--typeAlias:设置某个类型的别名
属性:
type:设置需要设置的别名的类型】
alias:设置某个类型的别名,若不设置该属性,那么该类型的拥有默认的别名,即类名且不区分大小写
-->
<!-- <typeAlias type="com.wsay.mybatis.pojo.User"></typeAlias>-->
<!-- 以包为单位,将包下所有的类型设置默认的类型别名,即类名且不区分大小写-->
<package name="com.wsay.mybatis.pojo"/>
</typeAliases>
<!--
environments:配置多个连接数据库的环境
属性:
default:设置默认使用的环境的id
-->
<environments default="development">
<!--
environment:配置某个具体的环境
属性:
id:表示连接数据库的环境的唯一标示,不能重复
-->
<environment id="development">
<!--
transactionManager:设置事务管理方式
属性;
type:"JDBC/MANAGED"
JDBC:表示当前环境中,执行SQL时,使用的是JDBC中原生的事务管理方式 事务的提交或者回滚需要手动处理
MANAGED:被管理,例如spring
-->
<transactionManager type="JDBC"/>
<!--
dataSource:配置数据源
属性:
type:配置数据源的类型
type:"POOLED/UNPOOLED/JNDI"
POOLED:表示使用数据库连接池缓存数据库连接
UNPOOLED:表示不使用数据库连接池
JNDI:表示使用上下文中的数据源
-->
<dataSource type="POOLED">
<!--设置连接数据库的驱动-->
<property name="driver" value="${jdbc.driver}"/>
<!--设置连接数据库的连接地址-->
<property name="url" value="${jdbc.url}"/>
<!--设置连接数据库的用户名-->
<property name="username" value="${jdbc.username}"/>
<!--设置连接数据库的密码-->
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!--引入映射文件-->
<mappers>
<!-- <package name="com.wsay.mybatis.mapper"/>-->
<!--
以包为单位引入映射文件
要求:
1.mapper接口所在的包要和映射文件所在的包一致
2.mapper接口要和映射文件的名字一致
-->
<package name="com.wsay.mybatis.mapper"/>
</mappers>
</configuration>
7.编写核心配置文件jdbc.properties
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC
jdbc.username=root
jdbc.password=root
8.编写log4j.xml文件
log4j 的配置文件名为 log4j.xml ,存放的位置是 src/main/resources 目录下
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">
<log4j:configuration xmlns:log4j="http://jakarta.apache.org/log4j/">
<appender name="STDOUT" class="org.apache.log4j.ConsoleAppender">
<param name="Encoding" value="UTF-8" />
<layout class="org.apache.log4j.PatternLayout">
<param name="ConversionPattern" value="%-5p %d{MM-dd HH:mm:ss,SSS} %m (%F:%L) \n" />
</layout>
</appender>
<logger name="java.sql"> <level value="debug" />
</logger>
<logger name="org.apache.ibatis"> <level value="info" />
</logger>
<root>
<level value="debug" />
<appender-ref ref="STDOUT" />
</root>
</log4j:configuration>
六.核心对象
1.MyBatis的核心对象
SqlSessionFactoryBuilder
SqlSessionFactory
SqlSession
2.MyBatis核心配置文件
3.SQL映射文件
1.核心接口与类的关系
2.SqlSessionFactoryBuilder
SqlSessionFactoryBuilder
用过即丢,其生命周期只存在于方法体内 负责构建SqlSessionFactory,并提供多个build()方法的重载
build( InputStream inputStream, String environment, Properties properties )
build( Reader reader, String environment, Properties properties )
build( Configuration config)
// 读取XML文件构造方式
String resource = "mybatis-config.xml";
InputStream is = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
3.SqlSessionFactory
SqlSessionFactory
SqlSessionFactory是每个MyBatis应用的核心
作用:创建SqlSession实例
openSession( boolean autoCommit )true :关闭事务控制(默认) false:开启事务控制
生命周期与应用的生命周期相同
单例
存在于整个应用运行时,并且同时只存在一个对象实例
4.SqlSession
SqlSession
包含了执行SQL所需的所有方法
非线程安全,不能共享
对应一次数据库会话,会话结束必须关闭
// 1. 创建SqlSession实例
SqlSession sqlSession = MyBatisUtil.createSqlSession();
try {
// 2. do work
} finally {
// 3. 关闭SqlSession
MyBatisUtil.closeSqlSession(sqlSession);
//关闭SqlSession非常重要,必须要 确保在finally方法体中正常关闭
}
SqlSession的两种使用方式
通过 namespace+id 字符串运行映射的SQL语句
基于Mapper接口方式执行SQL语句
七.编写测试类
1.运行步骤
- 读取MyBatis核心配置文件
- 创建SqlSessionFactory实例
- 创建SqlSession实例
- 创建Mapper实例执行SQL映射文件中的SQL语句
2.MyBatisTest
SqlSession :代表 Java 程序和 数据库 之间的 会话 。( HttpSession 是 Java 程序和浏览器之间的会话)SqlSessionFactory :是 “ 生产 ”SqlSession 的 “ 工厂 ” 。工厂模式:如果创建某一个对象,使用的过程基本固定,那么我们就可以把创建这个对象的相关代码封装到一个 “ 工厂类 ” 中,以后都使用这个工厂类来 “ 生产 ” 我们需要的对象。
package com.wsay.mybatis.test;
import com.wsay.mybatis.mapper.UserMapper;
import com.wsay.mybatis.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;
import java.util.List;
public class MyBatisTest {
//查询全部信息
@Test
public void testgetAllUser() throws IOException {
//加载核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//获取SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
//获取SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//获取Mapper接口对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//使用代理对象执行方法
List<User> list = mapper.getAllUser();
//释放资源
list.forEach(user -> System.out.println(user));
}
}
八.总结
以上就是MyBatis入门,下一篇博文:MyBatis-02-Mybatis增删改查
下一篇博文地址:MyBatis-02-Mybatis增删改查