一、什么是MyBatis
- MyBatis是优秀的持久层框架
- MyBatis使用XML将SQL与程序解耦,便于维护
- MyBatis学习简单,执行高效,是JDBC的延伸
二、MyBatis开发流程
- 引入MyBatis依赖
- 创建核心配置文件
- 创建实体(Entity)类
- 创建Mapper映射文件
- 初始化SessionFactory
- 利用SqlSession对象操作数据
三、MyBatis环境配置
1.mybatis-config.xml
a. MyBatis采用XML格式配置数据库环境信息
b. MyBaits环境配置标签
c. environment包含数据库驱动、URL、用户名与密码
<?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>
<settings>
<!-- goods_id ==> goodsId 驼峰命名转换 -->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!--启用Pagehelper分页插件-->
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!--设置数据库类型-->
<property name="helperDialect" value="mysql"/>
<!--分页合理化-->
<property name="reasonable" value="true"/>
</plugin>
</plugins>
<!--设置默认指向的数据库-->
<environments default="dev">
<!--配置环境,不同的环境不同的id名字-->
<environment id="dev">
<!-- 采用JDBC方式对数据库事务进行commit/rollback -->
<transactionManager type="JDBC"></transactionManager>
<!--采用连接池方式管理数据库连接-->
<!--<dataSource type="POOLED">-->
<dataSource type="com.imooc.mybatis.datasource.C3P0DataSourceFactory">
<property name="driverClass" value="com.mysql.jdbc.Driver"/>
<property name="jdbcUrl" value="jdbc:mysql://localhost:3306/babytun?useUnicode=true&characterEncoding=UTF-8"/>
<property name="user" value="root"/>
<property name="password" value="root"/>
<property name="initialPoolSize" value="5"/>
<property name="maxPoolSize" value="20"/>
<property name="minPoolSize" value="5"/>
<!--...-->
</dataSource>
</environment>
<environment id="prd">
<!-- 采用JDBC方式对数据库事务进行commit/rollback -->
<transactionManager type="JDBC"></transactionManager>
<!--采用连接池方式管理数据库连接-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://192.168.1.155:3306/babytun?useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="mappers/goods.xml"/>
<mapper resource="mappers/goods_detail.xml"/>
</mappers>
</configuration>
四、SqlSessionFactory
- SqlSessionFactory是MyBatis的核心对象
- 用于初始化MyBatis,创建SqlSession对象
- 保证SqlSessionFactory在应用中全局唯一
五、SqlSession
- SqlSession是MyBatis操作数据库的核心对象
- SqlSession使用JDBC方式与数据库交互
- SqlSession对象提供了数据表CRUD对应方法
六、初始化工具类MyBatisUtils
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.Reader;
/**
* MyBatisUtils工具类,创建全局唯一的SqlSessionFactory对象
*/
public class MyBatisUtils {
//利用static(静态)属于类不属于对象,且全局唯一
private static SqlSessionFactory sqlSessionFactory = null;
//利用静态块在初始化类时实例化sqlSessionFactory
static {
Reader reader = null;
try {
reader = Resources.getResourceAsReader("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
//初始化错误时,通过抛出异常ExceptionInInitializerError通知调用者
throw new ExceptionInInitializerError(e);
}
}
/**
* openSession 创建一个新的SqlSession对象
* @return SqlSession对象
*/
public static SqlSession openSession(){
return sqlSessionFactory.openSession();
}
/**
* 释放一个有效的SqlSession对象
* @param session 准备释放SqlSession对象
*/
public static void closeSession(SqlSession session){
if(session != null){
session.close();
}
}
}
七、MyBatis数据查询步骤
- 创建实体类(Entity)
- 创建Mapper XML
- 编写SQL标签
- 开启驼峰命名映射
- 新增
- SqlSession执行select语句
八、SQL传参
<!-- 单参数传递,使用parameterType指定参数的数据类型即可,SQL中#{value}提取参数-->
<select id="selectById" parameterType="Integer" resultType="com.imooc.mybatis.entity.Goods">
select * from t_goods where goods_id = #{value}
</select>
<!-- 多参数传递时,使用parameterType指定Map接口,SQL中#{key}提取参数 -->
<select id="selectByPriceRange" parameterType="java.util.Map" resultType="com.imooc.mybatis.entity.Goods">
select * from t_goods
where
current_price between #{min} and #{max}
order by current_price
limit 0,#{limt}
</select>
九、MyBatis获取多表关联查询结果
ResultMap结果映射
- ResultMap可以将查询结果映射为复杂类型的Java对象
- ResultMap适用于Java对象保存多表关联结果
- ResultMap支持对象关联查询等高级特性
<!-- 利用LinkedHashMap保存多表关联结果
MyBatis会将每一条记录包装为LinkedHashMap对象
key是字段名 value是字段对应的值 , 字段类型根据表结构进行自动判断
优点: 易于扩展,易于使用
缺点: 太过灵活,无法进行编译时检查
-->
<select id="selectGoodsMap" resultType="java.util.LinkedHashMap" >
select g.* , c.category_name,'1' as test from t_goods g , t_category c
where g.category_id = c.category_id
</select>
十、MyBatis日志输出
Mybatis 内置日志工厂
- u SLF4J
- Apache Commons Logging
- Log4j 2 u Log4j
- JDK logging
Mybatis配置SLF4J日志组件
<configuration>
<settings>
...
<setting name="logImpl" value="SLF4J"/>
...
</settings>
</configuration>
十一、selectKey与useGeneratedKeys的区别
selectKey将数据插入后,将最新的数据返回
useGeneratedKeys也是用于获取最新生成的
- selectKey标签的用法
<insert id="insert" parameterType="com.itlaoqi.mybatis.entity.Goods">
INSERT INTO SQL 语句
<selectKey resultType="int" keyProperty="goodsId" order="AFTER">
<!-- 当前连接中最后产生的id号 -->
select last_insert_id()
</selectKey>
</insert>
- useGeneratedKeys属性用法
<insert id="insert" parameterType="com.itlaoqi.mybatis.entity.Goods"
useGeneratedKeys="true"
keyProperty="goodsld"
keyColumn="goods_id" >
INSERT INTO SQL语句
</insert>
- 二者区别-显示与隐士
a. selectKey标签需要明确编写获取最新主键sql语句
b. useGeneratedKeys属性会自动根据驱动生成对应sql语句 - selectKey适用于所有的关系型数据库
a. selectKey 适用于所有的关系型数据库
b.useGeneratedKeys只支持"自增主键"类型的数据库 - 在Oracle中selectKey的用法
<insert id="insert" parameterType="com.itlaoqi.mybatis.entity.Goods">
INSERT INTO SQL 语句
<selectKey resultType="Integer" order="BEFORE" keyProperty="goodsId" order="AFTER">
<!-- 当前连接中最后产生的id号 -->
select seq_goods.nextval as id from dual
</selectKey>
</insert>
十二、MyBatis预防SQL注入攻击
- SQL注入攻击:SQL注入是指攻击者利用SQL漏洞,绕过系统约束,越权获取数据的攻击方式
SQL代码:
select * from a where name ='”+ name+”'”;
正常情况:
name:张三 -> select * from a where name='张三';
SQL注入攻击:
name:' or 1=1 or 1='
select * from a where name='' or 1=1 or 1=''
- MyBatis两种传值方式
${}文本替换,未经任何处理对SQL文本替换
#{}预编译传值,使用预编译传值可以预防SQL注入
十三、MyBatis工作流程