目录
1、简介
1.1、持久层
1.2、框架
2、JDBC->Mybais
3、使用Mybatis
3.1、步骤概述
3.2、步骤详述
3.3、注意事项
3.3.1、⭐MybatisDemo步骤
3.3.2、bug
3.3.3、映射文件警告信息
4、代理开发
4.1、简介
4.2、使用要求
4.3、代理代码实现
4.3.1、注意事项
4.4、mapper代理的bug
MyBatis 是一款优秀的持久层框架,用于简化 JDBC 开发。
MyBatis 本是 Apache 的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github
官网:https://mybatis.org/mybatis-3
中文网:https://mybatis.org/mybatis-3/zh/index.html
介绍:
MyBatis是一款开源的持久层框架,用于Java应用程序,可以将Java对象映射到数据库中。
它允许用户使用简单的XML或注解来配置和映射原生类型、接口和Java POJO(Plain Old Java Objects)到数据库表,减少了几乎所有的JDBC代码和手写设置参数的工作,它提供了一种灵活的查询机制,支持动态SQL,允许在查询期间动态生成SQL,并将其映射到Java对象。
总的来说,MyBatis是一款非常有用的工具,可以简化数据库应用程序的开发,使Java开发人员能够专注于应用程序逻辑,而不必关注数据库和SQL语句细节。
负责将数据到保存到数据库的那一层代码。
以后开发我们会将操作数据库的Java代码作为持久层。而Mybatis就是对jdbc代码进行了封装。
JavaEE三层架构:表现层、业务层、持久层
框架就是一个半成品软件,是一套可重用的、通用的、软件基础代码模型
在框架的基础之上构建软件编写更加高效、规范、通用、可扩展
JDBC缺点:
1.硬编码
1.1、注册驱动、获取连接:
JDBC的代码有很多字符串,而这些是连接数据库的四个基本信息,以后如果要将Mysql数据库换成其他的关系型数据库的话,这四个地方都需要修改,如果放在此处就意味着要修改我们的源代码。
1.2、SQL语句:如果表结构发生变化,SQL语句就要进行更改。这也不方便后期的维护。
2.操作繁琐:
2.1、手动设置参数
2.2、手动封装结果集
代码对查询到的数据进行封装,而这部分代码是没有什么技术含量,而且特别耗费时间
Mybatis优化:
持久层框架使用占比:
下面是Mybatis详细使用步骤:
①开启数据库服务,创建数据库,创建表单
②创建Maven项目:Mybatis->项目结构如下:
③配置pom.xml,导入依赖
->所需依赖为:mybatis,mysql,junit,slf4j日志,logback
4.0.0
org.example
Mybatis
1.0-SNAPSHOT
17
17
org.mybatis
mybatis
3.5.5
mysql
mysql-connector-java
5.1.48
junit
junit
4.13.2
test
org.slf4j
slf4j-api
1.7.16
ch.qos.logback
logback-classic
1.2.3
ch.qos.logback
logback-core
1.2.3
④配置logback.xml
System.out
%d{yyyy-MM-dd HH:mm:ss.SSS} [%level] %cyan([%thread]) %boldGreen(%logger{15}) : %msg %n
%d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
utf-8
C:/code/itheima-data.log
C:/code/itheima-data2-%d{yyyy-MM-dd}.log%i.gz
1MB
⑤配置Mybatis核心配置文件->mybatis-config.xml
功能:替换连接信息,解决硬编码问题。
⭐Mybatis连接数据库的方式:mybatis-config.xml文件中的
⑥配置SQL映射文件UserMapper.xml->方便统一管理SQL语句,解决硬编码问题
namespace命名空间可随意编写,但编写正确的包和类的关系作为命名空间,则在源码中可以方便查看跳转:
⑦创建User类
package com.xzl.pojo;
public class User {
private int id;
private String username;
private String password;
private String gender;
private String address;
//省略getter和setter
@Override
public String toString() {
//这里的password用PSD来代替,因为CSDN不让发,大家见谅
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", PSD='" + password + '\'' +
", gender='" + gender + '\'' +
", address='" + address + '\'' +
'}';
}
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;
}
public String getGender() {
return gender;
}
public void setGender(String gender) {
this.gender = gender;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
pojo类和Java been的区别:pojo类可以不提供全部的getter和setter方法,以及有参无参构造器等,而javaBeen的流程则更为繁琐一些。
⑧创建Mybatis的示例类:MybatisDemo
package com.xzl;
import com.xzl.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 java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class MybatisDemo {
public static void main(String[] args) throws IOException{
//1、加载mybatis核心配置文件,获取SqlSessionFactory
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//2、获取sqlSession对象,用来执行sql
SqlSession sqlSession = sqlSessionFactory.openSession();
//3、执行sql
List users = sqlSession.selectList("com.xzl.pojo.User.selectAll");
System.out.println(users);
sqlSession.close();
}
}
1.加载Mybatis核心配置文件,获取SqlSessionFactory对象
1.1、先获取字节缓存输入流
InputStream inputStream = Resources.getResourceAsStream(resource);
通过getClass可以看到,最终获取的是一个字节缓冲输入流
1.2、获取SqlSessionFactory->
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
2.获取SqlSession对象,用来执行sql->
SqlSession sqlSession = sqlSessionFactory.openSession();
3.执行sql->List
4.释放资源->sqlSession.close();
如果代码检查了并无问题,但是却报错:
可能是SQL映射文件的加载除了问题:需要检查mybatis配置文件中加载SQL映射文件的部分:
可能是resource的资源路径书写有误,可以尝试去直接复制路径看看:
还有一个可能就是,MySQL驱动包的版本较高。MySQL 8+版本的驱动包中,在mybatis核心配置文件配置MySQL连接的url时,参数部分的连接不能用"&"而要使用"&"替代
例如:
在映射配置文件中存在报红的情况。问题如下:
产生的原因:Idea和数据库没有建立连接,不识别表信息。但是它并不影响程序的执行。
解决方式:在Idea中配置MySQL数据库连接。
步骤:
点击IDEA右边框的 Database ,在展开的界面点击 + 选择 Data Source ,再选择 MySQL
在弹出的界面进行基本信息的填写,点击完成后就能看到如下界面
而此界面就和 navicat 工具一样可以进行数据库的操作。也可以编写SQL语句
之前的代码是基本使用方式,它也存在硬编码的问题,如下:
这里调用 selectList() 方法传递的参数是映射配置文件中的namespace.id值
这样写也不便于后期的维护。如果使用Mapper 代理方式则不存在硬编码问题:
通过上面的描述可以看出 Mapper 代理方式的目的:
解决原生方式中的硬编码
简化后期执行SQL
Mybatis 官网也是推荐使用 Mapper 代理的方式。下图是截止官网的图片:
使用Mapper代理方式,必须满足以下要求:
①定义 与 SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下。如下:
②设置SQL映射文件的namespace属性为Mapper接口全限定名
③在 Mapper 接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致
步骤:
①创建UserMapper接口:
②UserMapper.xml 映射配置文件
③创建MybatisDemo2类:
如果Mapper接口名称和SQL映射文件名称相同,并在同一目录下,则可以使用包扫描的方式简化SQL映射文件的加载。也就是将mybatis核心配置文件的加载映射配置文件的配置修改为:
这个部分请查看我的另一篇文章:
Mybatis之Error building SqlSession.https://blog.csdn.net/qq_60735796/article/details/128910611