一、Mybatis简介
1. Mybatis的理解
Mybatis是一个基于ORM(对象关系映射)的半自动持久层框架,将数据库中表通过映射的方式,通过pojo的实体类和xml配置文件来操作。
2. Mybatis的特性
- Mybatis是定制化的SQL、存储过程以高级映射的优秀的持久层框架
- Mybatis可以使用简单的XML文件或者注解用于配置映射关系,将接口和java的pojo映射成数据库中的字段属性
- Mybatis是一个半自动的持久层框架
3. 和其他持久层框架的对比
JDBC ---手动的持久层框架
sql语句夹杂在java代码中,耦合度较高,后期不易维护、修改sql语句,开发效率低
Hibernate -----全自动的持久层框架
自动生成hql语句,操作简单,开发效率高;但是sql无法修改,一些复杂的sql语句需要不经过框架实现;每一次查询都需要查询全部字段的信息,导致查询效率低
二、Mybatis实际操作
1. Maven項目导入依赖
<!--引入数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!--mybatis的包 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-boot-starter</artifactId>
<version>3.4.3</version>
</dependency>
2. Maven項目創建核心配置文件
mybatis-config.xml(核心配置文件)
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- environments数据库环境配置 -->
<!-- 和Spring整合后environments配置将配废除 -->
<environments default="development">
<environment id="development">
<!-- 使用JDBC事务管理器 -->
<transactionManager type="JDBC" />
<!-- 数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="数据库地址"/>
<property name="username" value="数据库账号"/>
<property name="password" value="数据库库密码"/>
</dataSource>
</environment>
</environments>
<!-- 8.引入加载映射文件 -->
<mappers>
<!--加载单个的xml文件-->
<mapper resource="mappers/mapper/UserMapper.xml" />
</mappers>
</configuration>
3. 创建实体类
package com.jt.pojo;
import lombok.Data;
import lombok.experimental.Accessors;
/**
* @author 86138
* 时间 2021/4/2
*/
@Data //lombok提供的注解,自动生成get\set方法
@Accessors(chain = true) //开启链式编程
public class User {
private Integer id;
private String username;
private String password;
private String phone;
private String email;
private Boolean status;
}
4. 创建Mapper接口
public interface UserMapper {
/**
* Mybatis 面向接口编程有两个一致性的原则:
* 1. 映射文件的namespace要和mapper接口的全类名保持一致,如过核心配置文件中做了类别名设置可以只写mapper文件名
* 2. 映射文件中的SQL语句的id要和mapper文件中对应的方法名一致
*/
/**
* 插入
* @param user
*/
int insertData(User user);
}
5. 创建Mybatis的映射文件
映射关系:
java中的实体类 ------ 数据库中的表
java中的属性名 ------ 数据库中的字段名
java中的对象 ------- 数据库中的一行数据
映射文件的命名规则:
mapper接口所对应的实体类名 + mapper.xml 所以一个实体类对应一张表,一张表对应一个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">
<!--语法:namespace="接口的路径" -->
<mapper namespace="com.jt.mapper.UserMapper">
<!--插入方法-->
<insert id="insertData" >
insert into user value (null,"root","root","1324","123@qq.com")
</insert>
<!--查询方法-->
<select id="" resultType="User">
</select>
<!--更新方法-->
<update id="" >
</update>
<!--删除方法-->
<delete id="" >
</delete>
</mapper>
三、Mybatis核心配置文件详解
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!-- 1.properties (2)resource:属性引入外部配置文件 -->
<properties resource="jdbc.properties">
<!-- (3) property里面的属性全局均可使用 -->
<property name="username" value="root"/>
</properties>
<!--2. 全局配置参数 -->
<settings>
<!-- 设置是否启动缓存 -->
<setting name="cacheEnabled" value="true"/>
<!-- 设置是否启用懒加载 -->
<setting name="lazyLoadingEnabled" value="true"/>
</settings>
<!-- 3.别名设置 载sql的xml文件可以简写实体类的路径名称-->
<typeAliases>
<!-- 第一种方式
type: 设置需要设置别名类型
alias:设置某个类型的别名 设置了alias别名就是alias的值 没有设置那么默认别名为类名 (不区分大小写)
-->
<typeAlias type="com.jt.pojo.User" alias="User"/>
<!--第二种方式
以包为单位,将这个包路径下类的别名设置为默认的类名 (不区分大小写)
-->
<package name="com.jt.pojo"/>
</typeAliases>
<!-- 4.类型转换器 -->
<typeHandlers>
<!-- 一个简单类型转换器 -->
<typeHandler handler="com.mybatis.example.ExampleTypeHandler"/>
</typeHandlers>
<!-- 5.对象工厂 -->
<objectFactory type="com.mybatis.example.ExampleObjectFactory">
<!-- 对象工厂注入的参数 -->
<property name="someProperty" value="100"/>
</objectFactory>
<!-- 6.插件 -->
<plugins>
<plugin interceptor="com.mybatis.example.ExamplePlugin">
<property name="someProperty" value="100"/>
</plugin>
</plugins>
<!-- 7.environments 配置数据库环境 default指定使用哪一个环境 default="id"-->
<!-- 注意:::: 和Spring整合后environments配置将配废除 -->
<environments default="development">
<environment id="development">
<!-- transactionManager: 设置事物管理方式
type: JDBC 表示当前环境执行SQL时使用JDBC事务管理器
MANAGED 被管理 例如:spring-->
<transactionManager type="JDBC" />
<!-- dataSource:数据库连接池
type: "POOLED\UNPOOLED\JNDI"
POOLED: 表示使用数据库连接池缓存数据库连接
UNPOOLED: 表示不使用数据库连接池
JNDI: 表示使用上下文的数据源
注意: 数据源可以在spring里进行数据源配置
-->
<dataSource type="POOLED">
<!--设置连接数据库的驱动
(1)可以直接在这里写-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<!--(2)通过properties 的resource引入外部配置文件来取值-->
<property name="url" value="${jdbc.url}}"/>
<!--(3) 通过properties 标签中的<property name="username" value="root"/>来定义-->
<property name="username" value="${username}}"/>
<property name="password" value="数据库库密码"/>
</dataSource>
</environment>
</environments>
<!-- 8.引入加载映射文件 -->
<mappers>
<!--加载单个的xml文件-->
<mapper resource="mappers/mapper/UserMapper.xml" />
<!--加载这个包下的所有映射文件 -->
<package name="mappers.mapper"/>
</mappers>
</configuration>
特别强调: 以上标签的设置顺序是固定的不可以改变
environments标签是用来配置数据库环境 里面可以有多个环境通过default=“id”来指定加载那个数据库环境
四、Mybatis获取参数的两种方式
1. Mybatis获取参数值的两种方式:
${}:
- 本质是 字符串拼接
- SQL直接拼接
- 所对应的变量值不会添加引号
- 不能防止SQL注入攻击
#{}:
- 本质是 占位符赋值
- SQL预编译,具有预编译效果
- 会给对应的变量自动添加引号
- 能够防止SQL注入攻击
2. 单个变量类型的参数
在mapper接口中方法的参数为单个变量时,两者都可以使用
${} --- select * from user where id ='${id}' 要用单引号引起来
#{} --- select * from user where id =#{id} 自动添加引号
3. 多个变量类型的参数
mappe接口参数为多个时,mybatis自动会将这些参数放在一个map集合里,以两种方式存储
a> 以(arg0,arg1...)为key 以参数值为value
mapper接口层 -- list<User> getListUser(String username, String password);
select * from user where id =#{arg0}, name=#{arg1} ${}同理,注意添加引号
b> 以(param1,param2 ...)为key 以参数值为value
mapper接口层 -- list<User> getListUser(String username, String password);
select * from user where id =#{param1}, name=#{param2 } ${}同理,注意添加引号
c> 以map集合的形式 自己将多个参数封装为一个map集合,用的就是自己定义的key
mapper接口层 -- list<User> getListUser(Map<String,Object> map );
select * from user where id =#{username}, name=#{password} ${}同理,注意添加引号
4. 以实体类的方式来传递参数
使用实体类的方式可以直接使用里面的变量名称
mapper接口层 -- list<User> getListUser(User user);
select * from user where id =#{username}, name=#{password} ${}同理,注意添加引号
5. 通过@param注解命名参数
mybatis会将参数封装为map,以两种方式进行存储
mapper接口层 -- list<User> getListUser(@Param("username")String username, @Param("passwoed")String password);
a> 以@Param 注解的值为键,传递参数
select * from user where id =#{username}, name=#{password} ${}同理,注意添加引号
b> 以(param1,param2 ...)为key 以参数值为value
select * from user where id =#{param1}, name=#{param2 } ${}同理,注意添加引