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工作流程

THE END
分享
二维码
< <上一篇
下一篇>>