目录
4.1 构建数据库,数据表。(我这里使用的是MySQL数据库)
4.3 使用spring-Initializr 创建的项目集成MyBatis
1.Mybatis 简介
概念参考至:Mybatis中文网
1.1 什么是Mybatis
官方介绍:Mybatis 是一款优秀的持久层框架,它支持自定义SQL,存储过程以及高级映射。MyBatis免除了几乎所有的JDBC代码,以及设置参数和获取结果集的工作。MyBatis可以通过简单的XML或注解来配置和映射原始类型。接口和 java POJO(Plain Old Java Objects,普通老式Java对象)为数据库中的记录。
简单理解:MyBatis是Apache的一个Java开源项目,是一个支持动态SQL语句的持久层框架。MyBatis通过使用XML或注解的方式来定义数据库的操作,并通过原生的SQL查询语句与数据库进行交互。
总结:MyBatis是一个轻量级易于学习且功能强大的持久化框架,适用于各种规模的java程序。它通过简化数据库访问的过程,提高了开发效率和可维护性。
2.MyBatis 用途
对于后端开发来说。程序是由后端程序和数据库这两个重要的部分组成,而这两个重要部分要通讯,需要依靠数据库连接工具
2.1 连接工具(常用)
JDBC 连接工具
但是JABC连接工具比较繁琐。
关于JDBC 的操作步骤可参考至:http://t.csdnimg.cn/EYu5u
2.2 MyBatis与JDBC相比,好处在哪 ?
- MyBatis通过参数映射的方式,可以将参数灵活的写在SQL语句中的配置文件中,避免在Java类中配置参数。
- MyBatis通过输出映射机制,将结果集的检索自动映射成相应的Java对象,避免对结果集手动检索。
- MyBatis可以通过Xml配置文件对数据库的连接进行管理
3.MyBatis 基本构成
- SqlSession:是MyBatis的关键对象,通过这个接口可以操作命令,管理事务等
是用于操作数据库的对象。
- SqlSessionFactory(SqlSession工厂):用于生成SqlSession
- SqlSessionFactoryBuilder:根据配置信息生成SqlSessionFactory(SqlSession工厂)
- SqlMapper:MyBatis 的设计组件,有Java接口和xml文件构成,需要个对应的Sql映射和映射规则
4. MyBatis 使用
我使用的是idea对mybatis进行使用的
MyBatis 的使用分为两部分,分别为:MyBatis 开发环境的配置,使用MyBatis模式和语法操作数据库。
4.1 构建数据库,数据表。(我这里使用的是MySQL数据库)
示例语句:
创建数据库 :
CREATE DATABASE `test` ;
创建表:
CREATE TABLE `t_news` (
`news_id` int(11) NOT NULL AUTO_INCREMENT,
`title` varchar(50) NOT NULL,
PRIMARY KEY (`news_id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4;插入数据:
insert into `t_news`(`news_id`,`title`) values (1,'110'),(2,'111'),(3,'112'),(4,'113'),(5,'114'),(6,'115'),(7,'116'),(8,'117'),(9,'118');
4.2 MyBatis开发环境配置
提示:我的idea是2023.2.5 版本的
4.3 使用spring-Initializr 创建的项目集成MyBatis
可参考文章:http://t.csdnimg.cn/Ek1Xk
4.4 普遍使用的mybatis的项目:Maven项目
4.4.1 点击文件,新建项目
4.1.2 选择项目的一些配置信息
注:此处我使用的是web开发
webapp的选项可能要根据你们自己的项目而定
项目创建成功后图示
注:项目中的src目录可能不会显示完全,可根据下面步骤显示:
然后直接回车,目录就会自动加进去。
4.1.3 配置pom文件
pom.xml文件是Maven项目的核心文件,mybatis的使用需要添加一些依赖,也就是外部库,这些依赖就是在pom.xml文件添加。
注:依赖的添加需要网络,且网速不能太慢,否则你的外部库下载的时候可能会出现空包的现象,而外部库的下载是通过在国外的库下过来的,所以要提升速度需要换源。
需要换源的可以参考文章:http://t.csdnimg.cn/HprQZ
对于依赖的获取可以使用此官方网站(比较齐全不用担心版本不一致的问题):Maven Repository: spring (mvnrepository.com)
1)在网站里获取增加想要的依赖之后复制到 pom.xml 文件里
图示:
idea图示:
spring都是使用不同的依赖组件。
2)MyBatis相关的依赖(还没有与spring做集成):
<!-- 添加 MyBatis 框架 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.6</version> </dependency><!-- 添加MySQL数据库的依赖 -->
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.16</version> </dependency>
4.1.4 其他文件的配置
1)将mybatis的核心配置文件(mybatis.cfg.xml)配置好;
可参考文章:http://t.csdnimg.cn/WGiPS
注意:所有的文件都在resources目录下。
mybatis.cfg.xml 详解:
2) 配置数据库连接的文件:jdbc.properties
写入连接语句
jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/test02?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC jdbc.username=root jdbc.password=123456
图示:
3)设置数据库连接的相关信息,配置好 applicationContext-base.xml文件,可能你们有自己的配置文件,也可忽略这一步。
- applicationContext-base.xml 是配置数据库的连接池以及Mybatis的相关配置(比如:SqlSessionFactory:生成SqlSession的(操作数据库的核心对象) )
applicationContext-base.xml详解
注:XXXMapper.xml 文件是写SQL语句的文件,MyBatis 操作数据库主要通过文件的方式来定义SQL语句,避免了SQL语句写在具体的类当中,松散耦合,易于修改。
4.1.5 创建项目的基本结构
1)创建包的目录结构,如下图所示:
2)编写MybatisSessionFactoryUtil (生成SqlSession的)
代码示例:注意看注释
package com.zking.mbdemo.util;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
public class MybatisSessionFactoryUtils {
//定义SqlSession工厂
public static SqlSessionFactory sqlSessionFactory;
//定义线程绑定变量(线程本地变量)
private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
//静态的代码块:被优先调用
static {
try {
InputStream is = MybatisSessionFactoryUtils.class
.getResourceAsStream("/mybatis.cfg.xml");//MyBatls的核心文件位置
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();//创建SqlSessionFactory的父类
sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
//构造方法:简单防止被new出来
private MybatisSessionFactoryUtils() {
}
//创建SqlSession的方法
public static SqlSession openSession() {
//首先判断线程本地变量里有没有SqlSession
SqlSession sqlSession = threadLocal.get();
if (null == sqlSession) {//如果没有则创建
sqlSession = sqlSessionFactory.openSession();
threadLocal.set(sqlSession);
}
return sqlSession;//有则直接返回SqlSession
}
//关闭SqlSession的方法:为了不浪费资源
public static void closeSession() {
//直接在线程绑定变量里获取SqlSession
SqlSession sqlSession = threadLocal.get();
//如果不为空则代表本地变量里有SqlSession
if (null != sqlSession) {
//threadLocal.set(null);
threadLocal.remove(); //在本地移除
sqlSession.close();//关闭
}
}
//一个简单的测试
public static void main(String[] args) {
SqlSession sqlSession = MybatisSessionFactoryUtils.openSession();
System.out.println(sqlSession);
System.out.println(sqlSession.getConnection());
MybatisSessionFactoryUtils.closeSession();
}
}
注:ThreadLocal -> 线程本地变量(线程绑定变量)
- 它只是一个线程的局部变量(其实就是一个Map用于存储每一个线程的变量副本,Map中元素的Key为线程对象,而Value对应线程的变量副本),ThreadLocal会为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。
- 简单理解:这个是对于线程来说就是:在本次线程里会用到的变量,参数,数据等等线程会 用的,都可以放到线程本地变量里,
- 示例理解: 你的钱包,可以放你自己会用的东西,比如身份证。
详细的解释可参考:http://t.csdnimg.cn/z8P84
3) 编写实体类Model,即存放数据的对象;在ssh2里叫entity
示例:
注:@Data 是使用了一个插件来辅助的
需要的可以参考下面教程获取:
4)编写mapper层(相当于dao)
5)编写相关的xml文件(写SQL语句的),这个文件是根据mapper层接口生成的
注:1. 在此之间先加入一些依赖:都是关于spring的一些依赖,为了避免写的时候报一些错误
主要是我的这个项目使用了spring框架,如果你们的项目没有使用可以直接跳过:
2. 还有就是需要在resource创建mapper目录,用来保存xml文件,我的这个路径是已经在applicationContext-base.xml文件配置好的路径,你们的也可依情况而定
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-web</artifactId> <version>5.3.18</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.3.18</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-orm</artifactId> <version>5.3.18</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.3.18</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aspects</artifactId> <version>5.3.18</version> </dependency> <!--分页依赖--> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.2</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>4.0.1</version> <scope>provided</scope> </dependency>dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-dbcp2</artifactId> <version>2.1.1</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.4.3</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-test</artifactId> <version>5.3.18</version> </dependency> <!--日志 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.36</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.10</version> </dependency>
回车之后resource会生成出来一个以你的接口为名创建的xml文件
之后点击你的mapper层的接口图示:
生成sql语句快捷方式依据创建xml文件的方法:1.鼠标放到爆红的名字上,按住Alt+Enter键
图示:
注: 可能会出现一个选框让你生成语句的类型,这个框是在你写的方法有很多的情况下会出现;
xml文件图示:
之后就可以写sql语句了
注:#{} 与 ${} 的区别
#{ }是预编译处理,MyBatis在处理#{ }时,它会将sql中的#{ }替换为?,然后调用PreparedStatement的set方法来赋值,传入字符串后,会在值两边加上单引号,如上面的值 “4,44,514”就会变成“ ‘4,44,514’ ”
${ }是字符串替换, MyBatis在处理${ }时,它会将sql中的${ }替换为变量的值,传入的数据不会加两边加上单引号。
使用${ }会导致sql注入,不利于系统的安全性!
SQL注入:就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到欺骗服务器执行恶意的SQL命令。常见的有匿名登录(在登录框输入恶意的字符串)、借助异常获取数据库信息等
6) service 层的编写:处理业务的;
7)在mybatis的核心文件中加入mapper
<!-- 与spring集成后删除 --> <mappers> <mapper resource="mapper/StudentMapper.xml"/> </mappers>
如果没有加入该配置,会报绑定异常:BindingException
8) 测试service
在输入光标到需要创建测试类的名字上,也就是StudentIServiceImpl按住alt+entity可以快速创建测试类
本篇分享就到这了,后续会出Mybatis的其他博客,感谢你的观看与支持!