MyBatis
内容纲要
SSM开发框架
什么是MyBatis
- MyBatis是优秀的持久层框架
- MyBatis使用XML将SQL与程序解耦,便于维护
- MyBatis学习简单,执行高效,是JDBC的延伸
MyBatis开发流程
♦ 引入MyBatis依赖 ♦ 创建核心配置文件
♦ 创建实体类(Entity)类 ♦ 创建Mapper映射文件
♦ 初始化SessionFactory ♦ 利用SQLSession对象操作数据mybatis-config.xml
- MyBatis采用XML格式配置数据库环境信息
- MyBaits环境配置标签< environment>
- environment包含数据库驱动、URL、 用户名与密码
SqISessionFactory
- SqISessionFactory是MyBatis的核心对象
- 用于初始化MyBatis,创建SqlSession对象
- 保证SqlSessionFactory在应用中全局唯一
SqlSession
- SqISession是MyBatis操作数据库的核心对象
- SqISession使用JDBC方式与数据库交互
- SqISession对象提供了数据表CRUD对应方法
@Test
public void testSqlSessionFactory() throws IOException {
//利用Reader加载classpath下的mybatis-config.xml核心配置文件
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
//初始化SqlSessionFactory对象,同时解析mybatis-config.xml文件
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
System.out.println("SessionFactory加载成功");
SqlSession sqlSession = null;
try {
//创建SqlSession对象,SqlSession是JDBC的扩展类,用于与数据库交互
sqlSession = sqlSessionFactory.openSession();
//创建数据库连接(测试用)
Connection connection = sqlSession.getConnection();
System.out.println(connection);
}catch (Exception e){
e.printStackTrace();
}finally {
if(sqlSession != null){
//如果type="POOLED",代表使用连接池,close则是将连接回收到连接池中
//如果type="UNPOOLED",代表直连,close则会调用Connection.close()方法关闭连接
sqlSession.close();
}
}
}
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(){
//默认SqlSession对自动提交事务数据(commit)
//设置false代表关闭自动提交,改为手动提交事务数据
return sqlSessionFactory.openSession(false);
}
/**
* 释放一个有效的SqlSession对象
* @param session 准备释放SqlSession对象
*/
public static void closeSession(SqlSession session){
if(session != null){
session.close();
}
}
}
==============================
public void testMyBatisUtils() throws Exception {
SqlSession sqlSession = null;
try {
sqlSession = MyBatisUtils.openSession();
Connection connection = sqlSession.getConnection();
System.out.println(connection);
}catch (Exception e){
throw e;
} finally {
MyBatisUtils.closeSession(sqlSession);
}
}
MyBatis数据查询步骤
- 创建实体类(Entity)
- 创建Mapper XML
- 编写< select> SQL标签
- 开启驼峰命名映射
- 新增< mapper>
- SqlSession执行select语句
查询 - < select>
ResultMap结果映射
- ResultMap可以将查询结果映射为复杂类型的Java对象
- ResultMap适用于Java对象保存多表关联结果
- ResultMap支持对象关联查询等高级特性
MyBatis数据写入
数据库事务
- 数据库事务是保证数据操作完整性的基础
要么所有写入数据库,要么全部清除MyBatis写操作包含三种
- 插入- < insert>
- 更新- < update>
- 删除- < delete>
插入信息并且返回插入id
selectKey与useGeneratedKeys的区别
selectKey标签用法
useGeneratedKeys
SQL语句,获取最后一次插入数据的id值
select last_insert_id()
二者区别-显示与隐示
- selectKey标签需要明确编写获取最新主键的SQL语句
- useGeneratedKeys属性会自动根据驱动生成对应SQL语句
二者区别-应用场景不同
- selectKey适用于所有的关系型数据库
- useGeneratedKeys只支持"自增主键"类型的数据库
在Oracle中selectKey的用法
总结
- selectKey标签是通用方案,适用于所有数据库,但编写麻烦
- useGeneratedKeys属性只支持"自增主键"数据库,使用简单
更新与删除操作
更新 - < update>
删除 - < delete>
MyBatis预防SQL注入攻击
SQL注入攻击
- SQL注入是指攻击者利用SQL漏洞,绕过系统约束,越权获取数据的攻击方式
MyBatis两种传值方式
- ${}文本替换,未经任何处理对SQL文本替换
-
{}预编译传值,使用预编译传值可以预防SQL注入
MyBatis工作流程
共有 0 条评论