目录
为什么要用MyBatis ?
传统的 JDBC 七个步骤
1. 加载驱动
2. 获取数据库连接
3. 创建SQL 语句
4. 获取可执行对象
5. 执行SQL语句
6. 获取结果集
7. 释放资源
优化 JDBC 操作
对 1,2,7 进行了优化,数据库连接工具类 -> 再次优化,创建了连接池
3,4,5,6 做了通用的查询等方法,从数据库查询出来的记录封装为 POJO 对象,也就是ORM映射
优化空间
1. 因为数据库连接池是自己手写的,连接数量是固定的,这一点不好,如果访问数量太多,就会不够用,如果访问数量很少,就浪费了。解决办法:使用 C3P0 或者 Druid 数据库连接池技术
2. 查询获取结果集后,需要写遍历结果集,再通过 new 或者 反射创建POJO对象,封装结果集
3. SQL 硬编码,SQL 语句写在代码里,耦合度太高,如果项目上线后需要修改,需要重新打包上线
那怎么解决这些问题呢?
这就可以用到了 MyBatis
什么是MyBatis ?
MyBatis 是一个优秀的基于 Java 的持久层框架,也就是我们说的Dao层,它内部封装了 JDBC,使开发者只需要关注 SQL 语句本身,而不需要花费精力,去处理加载驱动、创建连接、创建statement等繁杂的过程。
使用MyBatis
新建项目
1. 引入第三方依赖
打开 pom.xml 配置文件
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.shao</groupId>
<artifactId>ecard-back</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>ecard-back Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.14</version>
</dependency>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.32</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>2.0.49</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.30</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId> <!--Spring 的ioc容器-->
<version>5.3.30</version>
</dependency>
</dependencies>
<build>
<finalName>ecard-back</finalName>
</build>
</project>
2. 修改配置
新建 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>
</configuration>
打开官网看文档怎么配置
修改配置
3. 创建Mapper 层 (Dao层)
新建一个Mapper包,创建AdminMapper接口 ,定义一个功能的名字
在 resources 包 创建一个文件夹,创建一个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.Mapper.AdminMapper">
</mapper>
下载 MyBatisX 插件
4. 写 SQL 映射文件
鼠标放在波浪线上,点击 Generate statement ,选择操作类型,例如 select ,系统会自动创建配置文件的 SELECT 标签
定义 SQL 语句
测试
创建测试类
package com.Test;
import com.Mapper.AdminMapper;
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;
public class test {
public static void main(String[] args) {
// 实现使用 MyBatis 进行数据库操作
/*
* 1. 读取配置文件
* 2. 创建SqlSessionFactoryBuild 工厂建造器(创建连接工厂用的)
* 3. 创建连接工厂
* 4.创建一个连接
* 5.通过连接获取mapper对象,调用mapper对象的方法
* */
try {
// 通过资源文件路径获取InputStream,用于构建SqlSessionFactory
InputStream rsa = Resources.getResourceAsStream("mybatis-config.xml");
// 创建SqlSessionFactoryBuilder实例
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 使用Builder模式构建SqlSessionFactory
SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(rsa);
// 创建一个数据库连接
SqlSession SqlSession = sessionFactory.openSession();
// 通过SqlSession获取AdminMapper接口的实现,用于执行SQL操作
// 通过动态代理实现AdminMapper接口
AdminMapper mapper = SqlSession.getMapper(AdminMapper.class);
// 调用GetAdminCount方法
int count = mapper.GetAdminCount();
System.out.println("记录条数:"+count);
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行报错,这是因为没有注册接口
注册 Mapper 层映射文件
在 mybatis-config.xml 配置文件注册,把 Mapper 层的映射文件注册到 mybatis
测试成功
设置带参方法
参数两个及以上需要加上 @Param 注解
参数是集合,也需要加上注解
优化 MyBatis 操作过程
在测试类中,有些代码是需要更改的,例如 调用接口里的 GetAdminCount 方法,调用其他方法怎么办?总不能修改后再调用吧
创建 mybatis 工具类,通过工具类动态的调用方法
package com.Util;
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;
public class mybatisUtil {
private static SqlSession SqlSession;
static {
// 通过资源文件路径获取InputStream,用于构建SqlSessionFactory
InputStream rsa = null;
try {
rsa = Resources.getResourceAsStream("mybatis-config.xml");
} catch (IOException e) {
e.printStackTrace();
}
// 创建SqlSessionFactoryBuilder实例
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
// 使用Builder模式构建SqlSessionFactory
SqlSessionFactory sessionFactory = sqlSessionFactoryBuilder.build(rsa);
// 创建一个数据库连接
SqlSession = sessionFactory.openSession();
}
public static <T> T getMapper(Class<T> clazz) {
return SqlSession.getMapper(clazz);
}
}
在业务层通过调用 mybatis 工具类,获取 Mapper 对象,再通过 Mapper 调用方法
Service 业务层
创建一个包,创建一个Service 接口,创建一个实现接口的包
创建 DTO 类
package com.Util;
public class responseDTO {
private int status;
private Object data;
private String message;
private int count;
public responseDTO() {
}
public responseDTO(int status, Object data, String message, int count) {
this.status = status;
this.data = data;
this.message = message;
this.count = count;
}
/**
* 获取
* @return statusCode
*/
public int getStatus() {
return status;
}
/**
* 设置
* @param status
*/
public void setStatus(int status) {
this.status = status;
}
/**
* 获取
* @return data
*/
public Object getData() {
return data;
}
/**
* 设置
* @param data
*/
public void setData(Object data) {
this.data = data;
}
/**
* 获取
* @return statusMsg
*/
public String getMessage() {
return message;
}
/**
* 设置
* @param message
*/
public void setMessage(String message) {
this.message = message;
}
/**
* 获取
* @return count
*/
public int getCount() {
return count;
}
/**
* 设置
* @param count
*/
public void setCount(int count) {
this.count = count;
}
public String toString() {
return "responseDTO{status = " + status + ", data = " + data + ", message = " + message + ", count = " + count + "}";
}
}
创建 Service 接口的实现类
Controller 控制层
1. 新建 spring.xml 配置文件
2. 修改 Tomcat 的 web.xml 配置文件
<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app>
<display-name>Archetype Created Web Application</display-name>
<servlet>
<servlet-name>dispatcherServlet</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</init-param>
<!--启动Ioc 容器-->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcherServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
3. 获取 Servcie 层实现类的 Bean,创建 Controller 类
通过 spring 工具类手动获取
1. 创建 spring 工具类
2. 创建控制层
通过 @Autowired 注解自动获取
1. 控制层
package com.Controller;
import com.Service.AdminService;
import com.Util.responseDTO;
import com.alibaba.fastjson2.JSON;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/Admin")
public class AdminController {
@Autowired
AdminService adminService; // 注解告诉Spring框架自动将 AdminService 接口的实现类的实例注入到该字段中,无需手动创建对象。
@RequestMapping("/Login")
@ResponseBody
public String Login(String account, String password){
// 调用业务层
responseDTO responseDTO = adminService.Login(account, password);
// 返回数据
return JSON.toJSONString(responseDTO);
}
}
@Autowired 注解告诉 Spring 框架自动将 AdminService 业务层接口的实现类 的实例注入到字段中,无需手动创建对象
当一个类使用 @Autowired 注解时,Spring的IoC容器会自动查找与注解的类型相匹配的bean,并将其注入到相应的字段、构造函数或方法参数中
配置 Tomcat
测试
登录成功
增删改记录注意事项
Mapper 层
定义SQL语句
Service 层
控制层
提交成功
数据库没有新增记录
开启提交事务
为什么返回成功信息,数据库却没有新增记录呢?
这是因为,增删改都会涉及到数据修改,为了安全,MyBatis 默认开启了事务,但是没有设置自动提交,所以我们需要手动提交或者开启自动提交
自动提交
在mybatis 工具类修改 openSession 的参数
手动提交
在 Service 层调用工具类获取 SqlSession 开启提交事务
成功添加
优化 MyBatis
每次新建一个 Mapper 层的映射文件都需要 在 mybatis 配置文件中注册映射文件
每次通过 工具类获取 Mapper 层的实例
那可以让它自动注册到 MyBatis 吗?
可以通过注解自动获取 Mapper 层的实例吗?
可以的,MyBatis 提供了 MyBatis 和Spring 的整合
一、引入第三方依赖
<!-- MyBatis与Spring的集成库,用于简化MyBatis在Spring环境中的使用 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.1.2</version>
</dependency>
<!-- Spring的JDBC抽象层,提供统一的数据库访问API,隐藏了数据库连接的细节 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.3.30</version>
</dependency>
<!-- Druid是一个数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.8</version>
</dependency>
<!-- Spring的事务管理器 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>5.3.30</version>
</dependency>
二、新建 mybatis-spring 配置文件
新建数据库配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:utils="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-4.3.xsd http://www.springframework.org/schema/util https://www.springframework.org/schema/util/spring-util.xsd">
<!--配置数据库连接信息-->
<utils:properties id="db" location="classpath:db.properties"/>
<!--配置数据源,druid-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="#{db.driver}"/>
<property name="url" value="#{db.url}"/>
<property name="username" value="#{db.username}"/>
<property name="password" value="#{db.password}"/>
</bean>
<!-- 配置 mybatis 的 sqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--配置数据源 -->
<property name="dataSource" ref="dataSource"/>
<!--mybatis 配置文件位置 -->
<property name="configLocation" value="classpath:mybatis-config.xml"/>
<!-- mapper 的配置文件-->
<property name="mapperLocations" value="classpath:Mapper/*.xml"/>
</bean>
<!-- mapper 的接口配置,让 spring 接管mapper的实现类-->
<bean id="mapper" class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
<property name="basePackage" value="com.Mapper"/>
</bean>
</beans>
自动注册 Mapper 层的映射文件
指向 mybatis 配置文件
三、修改 mybatis 配置文件
然后就可以把数据库连接的配置和注册映射文件的配置注销掉了
可是 mybatis-spring.xml 配置文件有被读取吗?没有,
那什么时候需要读取这个配置文件呢?Web 服务器启动时加载这个配置文件
四、修改 web.xml 配置文件
然后就可以使用注解获取 Mapper 层的实例了
标签:配置文件,笔记,学习,mybatis,org,MyBatis,import,public From: https://blog.csdn.net/LearnTech_123/article/details/140485359