Mybatis
介绍
Java程序操作数据库,现在主流的方式是:Mybatis。
MyBatis是一款优秀的 持久层 框架,用于简化JDBC的开发。
官网:https://mybatis.org/mybatis-3/zh/index.html
现在使用Mybatis操作数据库,就是在Mybatis中编写SQL查询代码,发送给数据库执行,数据库执行后返回结果。
操作
Mybatis操作数据库的步骤:
-
准备工作(创建springboot工程、数据库表、实体类)
-
引入Mybatis的相关依赖,配置Mybatis(数据库连接信息)
-
编写SQL语句(注解/XML)
第一步
导入 mybatis的起步依赖、mysql的驱动包。
<!-- mybatis起步依赖 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.3.0</version>
</dependency><!-- mysql驱动包依赖 -->
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<scope>runtime</scope>
</dependency>
第二步
连接数据库的四大参数:
MySQL驱动类
登录名
密码
数据库连接字符串
基于上述分析,在Mybatis中要连接数据库,同样也需要以上4个参数配置。
//在springboot项目中,可以编写application.properties文件,配置数据库连接信息。
配置
application.properties:
#驱动类名称 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver #数据库连接的url spring.datasource.url=jdbc:mysql://localhost:3306/mybatis #连接数据库的用户名 spring.datasource.username=root #连接数据库的密码 spring.datasource.password=1234
第三步
创建一个包 mapper
Mybatis的持久层接口规范一般都叫 XxxMapper
然后就可以连接
JDBC
java语言操作数据库呢,只能通过一种方式:使用sun公司提供的 JDBC 规范
Mybatis框架,就是对原始的JDBC程序的封装。
JDBC: ( Java DataBase Connectivity )
就是使用Java语言操作关系型数据库的一套API
直接基于JDBC程序来操作数据库,代码实现非常繁琐,通常会使用Mybatis这类的高级技术来操作数据库,从而简化数据库操作、提高开发效率。
数据库连接池
mybatis中,使用了数据库连接池技术,避免频繁的创建连接、销毁连接而带来的资源浪费。
数据库连接池的好处:
-
资源重用
-
提升系统响应速度
-
避免数据库连接遗漏
常见的数据库连接池:
-
C3P0
-
DBCP
-
Druid
-
Hikari (springboot默认)追光者
如果我们想把默认的数据库连接池切换为Druid数据库连接池,只需要完成以下两步操作即可:
参考官方地址:druid/druid-spring-boot-starter at master · alibaba/druid · GitHub
-
在pom.xml文件中引入依赖
<dependency> <!-- Druid连接池依赖 --> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.2.8</version> </dependency>
-
在application.properties中引入数据库连接配置
方式1:
spring.datasource.druid.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.druid.url=jdbc:mysql://localhost:3306/mybatis spring.datasource.druid.username=root spring.datasource.druid.password=1234
方式2:
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.url=jdbc:mysql://localhost:3306/mybatis spring.datasource.username=root spring.datasource.password=1234
lombok
Lombok是一个实用的Java类库,可以通过简单的注解来简化和消除一些必须有但显得很臃肿的Java代码。
通过注解的形式自动生成构造器、getter/setter、equals、hashcode、toString等方法,并可以自动化生成日志变量,简化java开发、提高效率。
使用
第一步
在pom.xml文件中引入依赖
<!-- 在springboot的父工程中,已经集成了lombok并指定了版本号,故当前引入依赖时不需要指定version --> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </dependency>
第二步
在实体类上添加注解
// 说明:@Data注解中不包含全参构造方法,通常在实体类上,还会添加上:全参构造、无参构造
@Data //getter方法、setter方法、toString方法、hashCode方法、equals方法
@NoArgsConstructor //无参构造
@AllArgsConstructor//全参构造
日志输出
在Mybatis当中我们可以借助日志,查看到sql语句的执行、执行传递的参数以及执行结果。具体操作如下:
-
打开application.properties文件
-
开启mybatis的日志,并指定输出到控制台
#指定mybatis输出日志的位置, 输出控制台 mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
预编译SQL
性能更高:预编译SQL,编译一次之后会将编译后的SQL语句缓存起来,后面再次执行这条语句时,不会再次编译。(只是输入的参数不同)
更安全(防止SQL注入):将敏感字进行转义,保障SQL的安全性。
主键返回
在数据添加成功后,需要获取插入数据库数据的主键。
//会自动将生成的主键值,赋值给emp对象的id属性
@Options(useGeneratedKeys = true,keyProperty = "id")
驼峰命名
-
实体类属性名和数据库表查询返回的字段名一致,mybatis会自动封装。
-
如果实体类属性名和数据库表查询返回的字段名不一致,不能自动封装。
开启驼峰命名(推荐):如果字段名与属性名符合驼峰命名规则,mybatis会自动通过驼峰命名规则映射
驼峰命名规则: abc_xyz => abcXyz
-
表中字段名:abc_xyz
-
类中属性名:abcXyz
# 在application.properties中添加:
mybatis.configuration.map-underscore-to-camel-case=true
XML配置文件
在resources目录下,创建和接口一样的包名
xml映射文件中的dtd约束,直接从mybatis官网复制即可
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="">
</mapper>
XML映射文件的namespace属性为Mapper接口全限定名
返回类型
resultType
<select id="list" resultType="com.itheima.pojo.Emp">
MybatisX
一款基于IDEA的快速开发Mybatis的插件,为效率而生
MybatisX快速定位。
Mybatis动态SQL
<if>
用于判断条件是否成立,如果条件为true,则拼接SQL
形式:
<if test="name != null"> … </if>
<where>
where元素只会在子元素有内容的情况下才插入where子句,而且会自动去除子句的开头的AND或OR
<set>
动态地在行首插入 SET 关键字,并会删掉额外的逗号。(用在update语句中)
<foreach>
<foreach collection="集合名称" item="集合遍历出来的元素/项" separator="每一次遍历使用的分隔符"
open="遍历开始前拼接的片段" close="遍历结束后拼接的片段">
</foreach>
SQL片段: 抽取重复的代码
<sql id="commonSelect"> select id, username, password, name, gender, image, job, entrydate, dept_id, create_time, update_time from emp </sql>
<include>
标签在原来抽取的地方进行引用
<include refid="commonSelect"/>