MyBatis

简介

  • MyBatis是优秀的持久层框架, 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
  • MyBatis使用XML将SQL与程序解耦,便于维护
  • MyBatis学习简单,执行高效,是JDBC的延伸

拓展:

持久化:即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。

持久层:完成持久化工作的代码块 . ----> dao层 【DAO (Data Access Object) 数据访问对象】

官方文档:https://mybatis.org/mybatis-3/zh/index.html

入门

  1. 依赖
<!-- mybatis -->
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.7</version>
</dependency>
  1. mybatis-config.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><environments default="development"><!--设置id配置不同的环境--><environment id="development"><!--采用JDBC方式,对数据库事务进行提交,回滚--><transactionManager type="JDBC"/><!--采用连接池方式,管理数据库连接--><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/learn?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=Asia/Shanghai"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment><environment id="product"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/learn?useSSL=false&amp;useUnicode=true&amp;characterEncoding=UTF-8&amp;serverTimezone=Asia/Shanghai"/><property name="username" value="root"/><property name="password" value="123456"/></dataSource></environment></environments><!--配置Mapper映射文件位置--><mappers><mapper resource="mapper/UserMapper.xml"/></mappers>
</configuration>
  1. MybatisUtils.class
package com.gan;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 MybatisUtils {private static SqlSessionFactory sqlSessionFactory = null;static {try {String resource = "mybatis-config.xml";InputStream inputStream = Resources.getResourceAsStream(resource);sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);} catch (IOException e) {e.printStackTrace();}}public static SqlSession getSqlSession() {return sqlSessionFactory.openSession();}
}
  1. 创建实体(Entity)类,Mapper映射文件
<?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=""></mapper>
  1. 进行测试

SqlSessionFactory

  • SqlSessionFactory是MyBatis的核心对象
  • 用于初始化MyBatis,创建SqlSession对象
  • 保证SqlSessionFactory在应用中全局唯一

SqlSession

  • SqlSession是MyBatis操作数据库的核心对象
  • SqlSession使用JDBC方式与数据库交互
  • SqlSession对象提供了数据表CRUD对应方法

配置

  • properties(属性)
  • settings(设置)
  • typeAliases(类型别名)
  • typeHandlers(类型处理器)
  • objectFactory(对象工厂)
  • plugins(插件)
  • environments(环境配置)
    • environment(环境变量)

      • transactionManager(事务管理器)
      • dataSource(数据源)
  • databaseIdProvider(数据库厂商标识)
  • mappers(映射器)

映射文件

顶级元素

  • cache – 该命名空间的缓存配置。
  • cache-ref – 引用其它命名空间的缓存配置。
  • resultMap – 描述如何从数据库结果集中加载对象,是最复杂也是最强大的元素。
  • parameterMap – 老式风格的参数映射。此元素已被废弃,并可能在将来被移除!请使用行内参数映射。文档中不会介绍此元素。
  • sql – 可被其它语句引用的可重用语句块。
  • insert – 映射插入语句。
  • update – 映射更新语句。
  • delete – 映射删除语句。
  • select – 映射查询语句。

Select 元素的属性

<selectid="selectPerson"parameterType="int"parameterMap="deprecated"resultType="hashmap"resultMap="personResultMap"flushCache="false"useCache="true"timeout="10"fetchSize="256"statementType="PREPARED"resultSetType="FORWARD_ONLY">

Insert, Update, Delete 元素的属性

<insertid="insertAuthor"parameterType="domain.blog.Author"flushCache="true"statementType="PREPARED"keyProperty=""keyColumn=""useGeneratedKeys=""timeout="20"><updateid="updateAuthor"parameterType="domain.blog.Author"flushCache="true"statementType="PREPARED"timeout="20"><deleteid="deleteAuthor"parameterType="domain.blog.Author"flushCache="true"statementType="PREPARED"timeout="20">

sql片段:这个元素可以用来定义可重用的 SQL 代码片段

<sql id="userColumns"> ${alias}.id,${alias}.username,${alias}.password </sql>

结果映射:给数据库属性取别名

<resultMap id="userResultMap" type="User"><id property="id" column="user_id" /><result property="username" column="user_name"/><result property="password" column="hashed_password"/>
</resultMap>
<select id="selectUsers" resultMap="userResultMap">select user_id, user_name, hashed_passwordfrom some_tablewhere id = #{id}
</select>

两种传值方式

  • ${} 文本替换,未经任何处理对SQL文本替换
  • #{} 预编译传值,使用预编译传值可以预防SQL注入

工作流程图

日志

  • 日志文件是用于记录系统操作事件的记录文件或文件集合
  • 日志保存历史数据,是诊断问题以及理解系统活动的重要依据

  1. 依赖
<dependency>    <groupId>ch.qos.logback</groupId>    <artifactId>logback-classic</artifactId>      <version>1.2.3</version>
</dependency>
  1. logback.xml
<?xml version="1.0" encoding="utf-8" ?><configuration>    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">        <encoder>            <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>        </encoder>    </appender>    <root level="debug">        <appender-ref ref="console" />    </root>    <!--        日志输出级别(优先级高到低):            error:错误-系统的故障日志            warn:警告-存在风险或使用不当的日志            info:一般性消息            debug:程序内部用于调试信息            trace:程序运行的跟踪信息    --></configuration>

动态 SQL

动态 SQL 是 MyBatis 的强大特性之一。

  • if
  • choose (when, otherwise)
  • trim (where, set)
  • foreach
<select id="findActiveBlogLike" resultType="Blog">  SELECT * FROM BLOG  <where>    <if test="state != null">state = #{state}</if>  </where></select><trim prefix="SET" suffixOverrides=",">  ...</trim><update id="updateAuthorIfNecessary">  update Author    <set>      <if test="username != null">username=#{username},</if>      <if test="password != null">password=#{password},</if>      <if test="email != null">email=#{email},</if>      <if test="bio != null">bio=#{bio}</if>    </set>  where id=#{id}</update>

缓存

  • —级缓存默认开启,缓存范围SqISession会话
  • 二级缓存手动开启,属于范围Mapper Namespace

二级缓存运行规则:

  • 二级开启后默认所有查询操作均使用缓存
  • 写操作commit提交时对该namespace缓存强制清空
  • 配置useCache=false可以不用缓存
  • 配置flushCache=true代表强制清空缓存

开启二级缓存:

<cache  eviction="FIFO"  flushInterval="60000"  size="512"  readOnly="true"/>

ResultMap

一对多对象关联查询

<resultMap id="rm" type="User"><id column="id" property="id"></id><!-- collection说明 :property 为User下的一对多对象, select 调用接口的方法进行查询,column="id" 是传入查询的参数--><collection property="dogs" select="dogDao.getDog" column="id"></collection>
</resultMap>
<select id="oneToMany" resultMap="rm">select * from user
</select>

多对一对象关联查询

<resultMap id="rm" type="Dog"><id column="uid" property="uid"></id><!-- association :property 为Dog下的多对一对象 --><association property="user" select="userDao.queryUser" column="uid"></association>
</resultMap>
<select id="manyToOne" resultMap="rm">select * from dog
</select>

PageHelper

  • maven引入PageHelper与jsqlparser
  • mybatis-config.xml增加Plugin配置
  • 代码中使用PageHelper.startPage() 自动分页
  1. 依赖
<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.2.0</version>
</dependency>
  1. 使用
public void test() {SqlSession sqlSession = MybatisUtils.getSqlSession();PageHelper.startPage(0, 3);List<User> users = sqlSession.selectList("userDao.oneToMany");PageInfo pageInfo = new PageInfo(users);List<User> list = pageInfo.getList();for (User u:list) {System.out.println(u.toString());}
}

常用注解

  • @lnsert
  • @Update
  • @Delete
  • @Select
  • @Result,对应<id> <result>,字段映射
  • @Results, 对应<resultMap>,结果映射
  • @Param,参数映射

Mybatis-plus

  • MyBatis-Plus(简称MP)是一个MyBatis的增强工具
  • 自动实现Mapper CRUD操作,极致提高数据库开发效率
  • MP在MyBatis的基础上只做增强不做改变

整合三部曲:

  1. pom引入mybatis-plus依赖
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus</artifactId><version>3.4.3</version>
</dependency>
  1. Spring XML更改配置SqlSessionFactory实现类
<!-- SqlSessionFactory Config -->
<bean id="sqlSessionFactory" class="com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean"><property name="dataSource" ref="dataSource"/><property name="mapperLocations" value="classpath:mapper/*.xml"/><property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>
  1. mybatis-config.xml增加MP分页插件
<plugins><plugin interceptor="com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor"></plugin>
</plugins>

核心注解

  • @TableName -将实体类与表名映射
  • @Tableld -说明对应属性是表的主键
  • @TableField -设置属性与列名的对应关系

MyBatis【钢镚核恒】相关推荐

  1. Spring MVC【钢镚核恒】

    Spring MVC 简介 Spring MVC是Spring体系的轻量级Web MVC框架 Spring MVC的核心Controller控制器,用于处理请求,产生响应 Spring MVC基于Sp ...

  2. Spring 【钢镚核恒】

    Spring 简介 Spring框架是企业开发复杂性的一站式解决方案 Spring框架的核心是loC容器与AOP面向切面编程 Spring loC负责创建与管理系统对象,并在此基础上扩展功能 使用 导 ...

  3. Mybatis 一对多查询【钢镚核恒】

    实体类内部方式 实体类 @Data @TableName(value = "TTRD_DEPARTMENT", resultMap = "resultMap") ...

  4. IntelliJ IDEA 常用的配置 【钢镚核恒】

    IntelliJ IDEA 配置 字符集,File Encodings 自动导入,Auto Import 忽视大小写,编译器 - 常规 注释不在第一列 启动时不打开项目 导入.导出配置 快捷键 # 窗 ...

  5. Java 探究集合List、Map、Set底层的数据结构【钢镚核恒】

    Java 集合 简介 集合 (collection)是存储对象的容器.例如:6个人一个团队(集合) 集合与数组类通,数组是存储具体数据的容器.集合的底层有用到数组 这篇文章是加深对集合的理解,探究各种 ...

  6. Java 面向对象 【钢镚核恒】

    Java 面向对象 简介 类和对象 类是模子,确定对象将会拥有的特征(属性)和行为(方法) 对象是类的实例表现 类是对象的类型 对象是特定类型的数据 类,抽象的概念-模板 对象,-个看得到.摸得着的具 ...

  7. Vue中使用SVG图标的步骤【钢镚核恒】

    Vue中使用SVG图标的步骤 简介 svg 可缩放矢量图形(Scalable Vector Graphics) svg 优势:任意缩放,超强显示效果,较小文件,可压缩 svgo 用来压缩svg中无用信 ...

  8. Java 原始的JDBC方式连接MySQL数据库【钢镚核恒】

    Java JDBC 简介 JDBC(Java DataBase Connectivity,Java数据库连接) JDBC 可让Java通过程序操作关系型数据库 JDBC 基于驱动程序实现与数据库的连接 ...

  9. Java 简介之JVM、JDK、JRE【钢镚核恒】

    Java 简介 Java是一门面向对象的程序设计语言 1995年由sun公司发布 2010年sun公司被Oracle公司收购 JVM JVM(Java Virtual Machine),Java虚拟机 ...

  10. Java 异常 【钢镚核恒】

    Java 异常 简介 错误在我们编写程序的过程中会经常发生,包括编译期间和运行期间的错误. 异常体系图 异常处理 捕获异常(快捷键 : Ctr l+ Alt + T) // try块后可接零个或多个c ...

最新文章

  1. jQuery Mobile
  2. stm32f407能跑linux吗_跑步能跑进医院?那我该做跑步运动吗?想健康一点太难了...
  3. redis 登录_Redis集群架构+Dubbo开发框架+SSO单点登录+Nginx+ZooKeeper
  4. 数据结构-线性表之单链表
  5. 多个redistemplate_Spring boot 使用多个RedisTemplate
  6. 输出二叉树根节点到叶子结点所有路径
  7. 《31天重构》4:下置方法
  8. PYTHON_SPLIT
  9. Linux下网站搭建(2)---Mysql安装和基本操作
  10. paip.盘古汉字转拼音组件库使用总结
  11. android App下载与安装
  12. 人一生要做的一百件事
  13. 详解 Flink Metrics 原理与监控实战
  14. 如何了解用户和需求?
  15. 计算机弹出虚拟U盘,我们通过工具所自带的电脑模拟器对我们u盘制作启动盘进行模拟启动测试...
  16. Android 组件化代码中心化问题之.api化方案
  17. android之媒体硬解OMX的实现
  18. dns服务器未响应重启就好,网络诊断提示DNS服务器未响应解决方法 - 全文
  19. SMTP判断邮箱是否存在 检查email地址是否真实存在
  20. SRAM/DRAM优缺点对比

热门文章

  1. 机器人学DH参数及利用matlab符号运算推导
  2. 《手把手教你学DSP-基于TMS320F28335》书中的错误
  3. MySQL存储过程实例
  4. 计算机辅助翻译 教学大纲,《计算机辅助翻译》本科课程教学大纲翻译本科
  5. 计算机办公应用教案,计算机应用基础与办公自动化教案
  6. DELPHI源码防QQ截屏区域截图全屏截图框架
  7. python模拟按键directx,Python3在DirectX游戏中移动鼠标
  8. 推荐一个免费内网穿透穿软件(附带一个git下载加速地址)
  9. c++ 开源grid控件
  10. WAP网站制作(WAP网站建设)全攻略教程二