文章目录
- Mybatis
- 基础
- 概念
- 持久层框架比较
- 环境搭建及工程创建
- 核心配置文件
- xxxMapper.xml文件
- mybatis实现过程
- junit测试mybatis及优化
- 查询sql语句
- Mybatis-plus
- 基础
- 概述
- 组成及实现过程
- Springboot+MybatisPlus使用过程
- 实战
- 插入操作默认id
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容器中,实现对应的功能;
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>
整体过程:
1. 依赖包导入:
2. 创建数据对象:
public class object{}
3. 项目启动类添加扫描包
在springboot的启动类上添加注解;
@MapperScan("具体包的位置")
4. 配置文件添加语句,了解mapper具体执行过程,在console打出
在mybatis-config.xml文件中,配置:
<setting name="logImpl" value="STDOUT_LOGGING" />
日志实现方式为输出到控制台(STDOUT_LOGGING) // stdout_logging
5. 创建xxxMapper接口
//在对应Mapper上面继承基本接口BaseMapper
@Repository //代表持久层
public interface xxxMapper extends BaseMapper<User> {
//继承之后就是所有东西已经把连接mybatis,配置mapper.xml文件,service-controller层都搞定
}
6. 创建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="xxx.dao.mapper.MsRiskInfoMapper">
<select id="selectBlog" resultType="Blog">
# 其中id的值与mapper接口中调用的方法名一致;
select *from Blog where id = #{id}
# 具体的sql语句
</select>
</mapper>
7. 创建service服务类文件
@Autowired
private xxxMapper xxxmapper;
# 自动装载xxxMapper接口,调用其中的方法,实现sql语句执行
实战
插入操作默认id
如果采用Mybatisplus实现数据插入,对应自增长id而言,会默认采用雪花算法生成,它的长度较长,所以id字段的类型一般采用bigint(20)实现。