文章目录
Mybatis
基础
概念
历史:
MyBatis前身是iBatis,源自于Apache公司,现属于Google Code;
定义:
MyBatis是支持定制化、存储过程以及高级映射的持久层框架;
定制化--》指的是sql语句需要用户自己编写;
高级映射 --》 低级映射是数据库表字段与java对象属性名一一对应才行,高级映射可以通过某种手段实现不对应也可以操作;
避免所有的JDBC代码和手动设置参数以及获取结果集;
是对JDBC的封装;结果通过映射成对应的对象实现获取;
可以使用简单XML或者注解用于配置和构建映射,将接口和java的POJO映射成数据库中的记录;
是一个半自动的ORM(Object Relation Mapping)框架;
纯手动=jdbc,半自动=大部分jdbc都已经封装了,但有sql语句需要自己编写,全自动=Hibernate 只需要配置就可生成sql语句以及数据库表
ORM--》对象关系映射,对象=java的实例类对象 关系=数据库中的关系型数据 将两者建立一个映射,操作数据通过操作对应的对象来实现。
下载及安装:
https://blog.csdn.net/weixin_44719263/article/details/126111884
持久层框架比较
主要含有:JDBC、Hibernate、JPA、MyBatis
JDBC
sql语句写在java代码中,导致硬编码内伤;
频繁修改,不宜维护
代码冗长,效率低
Hibernate,JPA
不需要写sql语句,操作简单,开发效率高
sql如果复杂,则需要绕过框架
内部生成sql,不容易优化
基于全映射的自动框架,大量字段的POJO进行部分映射时比较困难;当某个表的字段超级多,且某次查询只需要某几个字段时,会较为困难;
反射操作太多,导致数据库性能下降
MyBatis
轻量级、性能出色
sql与java编码分开,涉及到配置文件、sql文件,功能边界清晰;
开发效率稍逊于Hibernate;
环境搭建及工程创建
运行以及编辑环境:idea
需要配置jdk:一般采用1.8版本
配置maven:
在setting中设置;
idea中有默认maven,版本是3.6.1
maven的配置文件setting.xml
依赖库是repository文件夹;
打包方式:pom中写成jar包
创建工程:导入依赖junit、mysql-connector-java、mybatis
mysql:
mybatis:
配置文件:核心配置文件和映射文件;
核心配置文件:默认名字是mybatis-config.xml 在项目/src/resourse
核心配置文件
<?xml version="1.0"encoding="UTF-8"?>
<!-- xml配置文件的声明 -->
<!-- -->
<!DOCTYPE configuration
PUBLIC"-//mybatis.org//DTD config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
# mybatis配置文件的约束,其中doctype后面的是根标签
# 根标签
<configuration>
# 配置连接数据库的环境
<environments default="development">
<environment id="development">
# 事务管理方式,类型type设置
<transactionManager type="JDBC"/>
# 数据源
<datasource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password"value="${password}"/>
</datasource>
</environment>
</environments>
# 引入映射文件
<mappers>
<mapper resource="org/mybatis/example/BlogMapper.xml"/>
</mappers>
</configuration>
xxxMapper.xml文件
<?xml version="1.0"encoding="UTF-8”?>
# xml文件的声明
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
# mybatis配置文件的约束,其中doctype后面的是根标签
<mapper namespace="org.mybatis.example.BlogMapper">
# 命名空间 namespace与mapper接口的全限定类名保持一致;
<select id="selectBlog" resultType="Blog">
# 其中id的值与mapper接口中调用的方法名一致;
select *from Blog where id = #{id}
</select>
</mapper>
mybatis实现过程
1. mybatis-config.xml核心配置文件;
2. 数据库表 t_user;
3. 实体类,字段与表t_user属性名相同;如果不想一致,则需要采用tableFile注解;(该内容是mybatis-plus中的)
4. mapper接口;
mbatis有面向接口编程,当调用接口中的方法,会自动匹配一个sql语句执行;
创建mapper接口,不需要具体实现类;
5. mybatis映射文件,xxx.xml文件;
java与数据库之间的对应关系:类-表,属性-字段,对象-记录;
文件命名:实体类+Mapper.xml 与mapper接口名字相同,只有后缀不同;
映射文件的namespace要和mapper接口的全类名一致;
映射文件中sql语句的id要和mapper接口中方法名一致;
6. 将xxx.xml文件配置到mybatis-config.xml文件的mappers中
junit测试mybatis及优化
代码位于:项目/src/test中;
执行过程:
//加载核心配置文件:
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
// Resources 是 org.apache.ibatis.io
// getResourceAsStream 获取当前文件的字节输入流;
//获取SqlSessionFactoryBuilder对象:
SqlSessionFactoryBuilder sqlSessionFactoryBuiler = new SqlSessionFactoryBuilder();
//获取SqlSessionFactory对象:
SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
//获取SqlSession对象:
SqlSession sqlSession = sqlSessionFactory.openSession();
// SqlSession是java程序与数据库之间的会话;
//获取mapper接口对象:
xxxMapper xxxmapper = sqlSession.getMapper(xxxMappper.class);
// getMapper底层使用的是代理模式获取mapper接口对象;
//测试功能:
int result = xxxmapper.function();
// 提交事务
// 保证操作的实现,因为mybatis-config.xml配置文件中,操作都采用JDBC方式;
sqlSession.commit();
优化:
1. 是否可以将提交改成自动提交;
//获取SqlSession对象:
SqlSession sqlSession = sqlSessionFactory.openSession();
// 该方法openSession中的参数,autoCommit参数,默认是false 不进行自动提交;
// 设置为true,则自动提交;
2. 通过日志功能检测当前sql执行情况
通过log4j实现;
依赖导入,pom文件中引入log4j依赖;
创建log4j.xml
级别:fatal致命》error错误》warn警告》info信息》debug调试
级别越低,记录信息越多;
log4j.xml文件
<xml version="1.0"encoding="UTF-8"?>
<!DOCTYPE 1og4j:configuration SYSTEM "1og4j.dtd">
<log4j:configuration xmlns:1og4j="http://jakarta.apache.org/1og4j/">
<appender name="sTDouT" class="org.apache.1og4j.consoleAppender">
<param name="Encoding" value="UTF-8"/>
<layout class="org.apache.1og4j.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 valuee= "debug"/>
<appender-ref ref="STDOUT" />
</root>
</log4j:configuration>
查询sql语句
查询结果类型: 一行数据;多行数据;单行单列数据;
对应的java类型为:java对象、集合类型、普通变量类型
当查询结果是一行数据、多行数据时,必须xml中添加resultType或resultMap;
添加的返回值,都设置为对象的类的全限定类名;
resultType:设置的默认的映射关系;
resultMap:设置自定义的映射关系;
需要xxxMapper.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="org.mybatis.example.BlogMapper">
<select id="selectBlog" resultType="Blog">
select *from Blog where id = #{id}
</select>
</mapper>
Mybatis-plus
基础
概述
定义:
是mybatis的增强工具,只做增强不做改变,为简化开发、提高效率而生;
并提供了通用的mapper和service;
官网:https://baomidou.com/
说明文档:https://baomidou.com/introduce/
特点:
润物无声(只增强不做改变)、效率至上、丰富功能(代码生成、自动分页、逻辑删除、自动填充);
特性:
组成及实现过程
MybatisPlus组成:
启动器:mybatis-plus-boot-start
注解部分annotation、扩展部分extension、核心部分core、代码生成部分generator;
实现工程:
扫描实体 Scan Entity;
不需要书写sql命令,都是框架写好的;
访问的表由访问的实体类对象决定;
反射技术:
实现实体类中属性的抽取,分析表与实体类之间的关系,以及当前字段与属性的关系;
调用方法:
根据调用的方法,生成sql语句;
容器:
将生成的sql语句,注入到mybatis容器中,实现对应的功能;
配置文件properties yml
spring:
# 配置数据源
datasource:
# 配置数据源类型
type: com.zaxxer.hikari.HikariDataSource
# 配置连接数据库的各个信息
driver-class-name: com.mysql.cj.jdbc.Driver
# 数据库驱动信息,jdbc不同的版本需要不同的驱动类信息;jdbc5 和 jdbc8 不同
url: xxx
# 数据库url也根据mysql版本的不同而不同,mysql5.7 和 mysql8.0 不同
username: xxx
password: xxx
Lombok介绍
用于简化实体类的开发;
通常情况下,构建与数据库表对应的实体类,是需要手动添加get、set、构造方法等内容;
但是Lombok是可以通过注解实现自动创建的;
@NoArgsConstructor 无参构造
@AllArgsConstructor 有参构造
@Getter get方法
@Setter set方法
@EqualsAndHashCode 重写equal和hashcode方法
@Data 将上述所有内容都自动写出;
Springboot+MybatisPlus使用过程
- pom依赖
<!--springboot默认依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!--mybatisPlus启动器-->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.0.5</version>
</dependency>
<!-- lombok 简化实体类开发,需要在idea下载插件 -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!-- mysql驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependncy>
整体过程:
2. 依赖包导入:
3. mybaits-config.xml文件
配置文件添加语句,了解mapper具体执行过程,在console输出
配置:
<setting name="logImpl" value="STDOUT_LOGGING" />
// 日志实现方式为输出到控制台(STDOUT_LOGGING) // stdout_logging
4. 创建实体类:
public class object{}
5. 创建xxxMapper接口
//在对应Mapper上面继承基本接口BaseMapper 该接口是由mybatis-plus提供
@Repository //代表持久层
public interface xxxMapper extends BaseMapper<User> {
//继承之后就是所有东西已经把连接mybatis,配置mapper.xml文件,service-controller层都搞定
}
6. 项目启动类添加扫描包
在springboot的启动类上添加注解;
@MapperScan("具体包的位置") // 用于扫描指定包下的mapper接口
// 具体包的位置 = 在mapper文件夹右键,选择copy reference 复制路径/引用
7. 创建xxxMapper.xml文件 (可有可无)
// 没有则使用baseMapper中的方法,如有则使用其中的方法;
<?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="xxx.dao.mapper.MsRiskInfoMapper">
<select id="selectBlog" resultType="Blog">
// 其中id的值与mapper接口中调用的方法名一致;
select *from Blog where id = #{id}
// 具体的sql语句
</select>
</mapper>
9. 创建service服务类文件
@Autowired
private xxxMapper xxxmapper;
// 自动装载xxxMapper接口,调用其中的方法,实现sql语句执行
xxxmapper.function();
// 调用xxxMapper.xml文件中的function
实战
插入操作默认id
如果采用Mybatisplus实现数据插入,对应自增长id而言,会默认采用雪花算法生成,它的长度较长,所以id字段的类型一般采用bigint(20)实现。
直接创建xxxMapper对象爆红
描述:
直接在测试类或者服务中编写如下内容
@Autowired
private xxxMapper xxxmapper;
xxxmapper会报红;
分析: