MyBatis【钢镚核恒】
MyBatis
简介
- MyBatis是优秀的持久层框架, 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。
- MyBatis使用XML将SQL与程序解耦,便于维护
- MyBatis学习简单,执行高效,是JDBC的延伸
拓展:
持久化:即把数据(如内存中的对象)保存到可永久保存的存储设备中(如磁盘)。
持久层:完成持久化工作的代码块 . ----> dao层 【DAO (Data Access Object) 数据访问对象】
官方文档:https://mybatis.org/mybatis-3/zh/index.html
入门
- 依赖
<!-- mybatis -->
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.7</version>
</dependency>
- 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&useUnicode=true&characterEncoding=UTF-8&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&useUnicode=true&characterEncoding=UTF-8&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>
- 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();}
}
- 创建实体(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>
- 进行测试
SqlSessionFactory
- SqlSessionFactory是MyBatis的核心对象
- 用于初始化MyBatis,创建SqlSession对象
- 保证SqlSessionFactory在应用中全局唯一
SqlSession
- SqlSession是MyBatis操作数据库的核心对象
- SqlSession使用JDBC方式与数据库交互
- SqlSession对象提供了数据表CRUD对应方法
配置
- properties(属性)
- settings(设置)
- typeAliases(类型别名)
- typeHandlers(类型处理器)
- objectFactory(对象工厂)
- plugins(插件)
- environments(环境配置)
- environment(环境变量)
- transactionManager(事务管理器)
- dataSource(数据源)
- environment(环境变量)
- 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注入
工作流程图
日志
- 日志文件是用于记录系统操作事件的记录文件或文件集合
- 日志保存历史数据,是诊断问题以及理解系统活动的重要依据
- 依赖
<dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version>
</dependency>
- 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() 自动分页
- 依赖
<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>5.2.0</version>
</dependency>
- 使用
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的基础上只做增强不做改变
整合三部曲:
- pom引入mybatis-plus依赖
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus</artifactId><version>3.4.3</version>
</dependency>
- 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>
- mybatis-config.xml增加MP分页插件
<plugins><plugin interceptor="com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor"></plugin>
</plugins>
核心注解
- @TableName -将实体类与表名映射
- @Tableld -说明对应属性是表的主键
- @TableField -设置属性与列名的对应关系
MyBatis【钢镚核恒】相关推荐
- Spring MVC【钢镚核恒】
Spring MVC 简介 Spring MVC是Spring体系的轻量级Web MVC框架 Spring MVC的核心Controller控制器,用于处理请求,产生响应 Spring MVC基于Sp ...
- Spring 【钢镚核恒】
Spring 简介 Spring框架是企业开发复杂性的一站式解决方案 Spring框架的核心是loC容器与AOP面向切面编程 Spring loC负责创建与管理系统对象,并在此基础上扩展功能 使用 导 ...
- Mybatis 一对多查询【钢镚核恒】
实体类内部方式 实体类 @Data @TableName(value = "TTRD_DEPARTMENT", resultMap = "resultMap") ...
- IntelliJ IDEA 常用的配置 【钢镚核恒】
IntelliJ IDEA 配置 字符集,File Encodings 自动导入,Auto Import 忽视大小写,编译器 - 常规 注释不在第一列 启动时不打开项目 导入.导出配置 快捷键 # 窗 ...
- Java 探究集合List、Map、Set底层的数据结构【钢镚核恒】
Java 集合 简介 集合 (collection)是存储对象的容器.例如:6个人一个团队(集合) 集合与数组类通,数组是存储具体数据的容器.集合的底层有用到数组 这篇文章是加深对集合的理解,探究各种 ...
- Java 面向对象 【钢镚核恒】
Java 面向对象 简介 类和对象 类是模子,确定对象将会拥有的特征(属性)和行为(方法) 对象是类的实例表现 类是对象的类型 对象是特定类型的数据 类,抽象的概念-模板 对象,-个看得到.摸得着的具 ...
- Vue中使用SVG图标的步骤【钢镚核恒】
Vue中使用SVG图标的步骤 简介 svg 可缩放矢量图形(Scalable Vector Graphics) svg 优势:任意缩放,超强显示效果,较小文件,可压缩 svgo 用来压缩svg中无用信 ...
- Java 原始的JDBC方式连接MySQL数据库【钢镚核恒】
Java JDBC 简介 JDBC(Java DataBase Connectivity,Java数据库连接) JDBC 可让Java通过程序操作关系型数据库 JDBC 基于驱动程序实现与数据库的连接 ...
- Java 简介之JVM、JDK、JRE【钢镚核恒】
Java 简介 Java是一门面向对象的程序设计语言 1995年由sun公司发布 2010年sun公司被Oracle公司收购 JVM JVM(Java Virtual Machine),Java虚拟机 ...
- Java 异常 【钢镚核恒】
Java 异常 简介 错误在我们编写程序的过程中会经常发生,包括编译期间和运行期间的错误. 异常体系图 异常处理 捕获异常(快捷键 : Ctr l+ Alt + T) // try块后可接零个或多个c ...
最新文章
- jQuery Mobile
- stm32f407能跑linux吗_跑步能跑进医院?那我该做跑步运动吗?想健康一点太难了...
- redis 登录_Redis集群架构+Dubbo开发框架+SSO单点登录+Nginx+ZooKeeper
- 数据结构-线性表之单链表
- 多个redistemplate_Spring boot 使用多个RedisTemplate
- 输出二叉树根节点到叶子结点所有路径
- 《31天重构》4:下置方法
- PYTHON_SPLIT
- Linux下网站搭建(2)---Mysql安装和基本操作
- paip.盘古汉字转拼音组件库使用总结
- android App下载与安装
- 人一生要做的一百件事
- 详解 Flink Metrics 原理与监控实战
- 如何了解用户和需求?
- 计算机弹出虚拟U盘,我们通过工具所自带的电脑模拟器对我们u盘制作启动盘进行模拟启动测试...
- Android 组件化代码中心化问题之.api化方案
- android之媒体硬解OMX的实现
- dns服务器未响应重启就好,网络诊断提示DNS服务器未响应解决方法 - 全文
- SMTP判断邮箱是否存在 检查email地址是否真实存在
- SRAM/DRAM优缺点对比