mybatis中#与$的区别、一二级缓存以及mysql隔离级别、mybatis与hibernate区别

一、mybatis中#与$的区别

一、${}

1.${} 就是字符串替换。直接替换掉占位符。$方式一般用于传入数据库对象或固定变量,例如传入表名,例如字段名 2.使用 ${} 的话会导致 sql 注入。什么是 SQL 注入呢?比如 select * from user where id = ${value} 3.value 应该是一个数值吧。然后如果对方传过来的是 001 and name = tom。这样不就相当于多加了一个条件嘛?把SQL语句直接写进来了。如果是攻击性的语句呢?001;drop table user,直接把表给删了。

二、#{}

#{} 是预编译处理,像传进来的数据会加个" "(#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号)与JDBC一样创建prearedStatement参数占位符并安全设置参数(就像使用 ? 一样),安全迅速,转义字符,不会有SQL注入问题

二、事务隔离级别

数据库事务的隔离级别有4种,由低到高分别为Read uncommitted(读未提交) 、Read committed (读已提交)、Repeatable read (重复读)、Serializable (序列化)。读现象是在多个事务并发执行时,在读取数据方面可能碰到的问题。包括脏读、不可重复读、幻读。

脏读:读到了脏数据,即无效数据。

不可重复读:是指在数据库访问中,一个事务内的多次相同查询却返回了不同数据。

幻读:指同一个事务内多次查询返回的结果集不一样,比如增加了行记录。

备注:不可重复读对应的是修改,即update操作。幻读对应的是插入操作。幻读是不可重复读的一种特殊场景。

三、mybatis一级缓存、二级缓存

1、一级缓存:指的是mybatis中sqlSession对象的缓存,当我们执行查询以后,查询的结果会同时存入sqlSession中,再次查询的时候,先去sqlSession中查询,有的话直接拿出,当sqlSession消失时,mybatis的一级缓存也就消失了,当调用sqlSession的修改、添加、删除、commit()、close()等方法时,会清空一级缓存。

2、二级缓存:指的是mybatis中的sqlSessionFactory对象的缓存,由同一个sqlSessionFactory对象创建的sqlSession共享其缓存,但是其中缓存的是数据而不是对象。当命中二级缓存时,通过存储的数据构造成对象返回。查询数据的时候,查询的流程是二级缓存 > 一级缓存 > 数据库。

3、如果开启了二级缓存,sqlSession进行close()后,才会把sqlSession一级缓存中的数据添加到二级缓存中,为了将缓存数据取出执行反序列化,还需要将要缓存的pojo实现Serializable接口,因为二级缓存数据存储介质多种多样,不一定只存在内存中,也可能存在硬盘中。

4、mybatis框架主要是围绕sqlSessionFactory进行的,具体的步骤:

        (1)定义一个configuration对象,其中包含数据源、事务、mapper文件资源以及影响数据库行为属性设置settings。

        (2)通过配置对象,则可以创建一个sqlSessionFactoryBuilder对象。        

        (3)通过sqlSessionFactoryBuilder获得sqlSessionFactory实例。

        (4)通过sqlSessionFactory实例创建qlSession实例,通过sqlSession对数据库进行操作。

5、代码实例

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>   
    <!-- 加载类路径下的属性文件 -->  
    <properties resource="db.properties"/>  
 
    <!-- 设置类型别名 -->  
    <typeAliases>  
        <typeAlias type="cn.itcast.javaee.mybatis.app04.Student" alias="student"/>  
    </typeAliases>  
 
    <!-- 设置一个默认的连接环境信息 -->  
    <environments default="mysql_developer">  
 
        <!-- 连接环境信息,取一个任意唯一的名字 -->  
        <environment id="mysql_developer">  
            <!-- mybatis使用jdbc事务管理方式 -->  
            <transactionManager type="jdbc"/>  
            <!-- mybatis使用连接池方式来获取连接 -->  
            <dataSource type="pooled">  
                <!-- 配置与数据库交互的4个必要属性 -->  
                <property name="driver" value="${mysql.driver}"/>  
                <property name="url" value="${mysql.url}"/>  
                <property name="username" value="${mysql.username}"/>  
                <property name="password" value="${mysql.password}"/>  
            </dataSource>  
        </environment>  
 
        <!-- 连接环境信息,取一个任意唯一的名字 -->  
        <environment id="oracle_developer">  
            <!-- mybatis使用jdbc事务管理方式 -->  
            <transactionManager type="jdbc"/>  
            <!-- mybatis使用连接池方式来获取连接 -->  
            <dataSource type="pooled">  
                <!-- 配置与数据库交互的4个必要属性 -->  
                <property name="driver" value="${oracle.driver}"/>  
                <property name="url" value="${oracle.url}"/>  
                <property name="username" value="${oracle.username}"/>  
                <property name="password" value="${oracle.password}"/>  
            </dataSource>  
        </environment>  
    </environments>  
 
    <!-- 加载映射文件-->  
    <mappers>  
        <mapper resource="cn/itcast/javaee/mybatis/app14/StudentMapper.xml"/>  
    </mappers>  
 
</configuration>  
public class MyBatisTest {
 
    public static void main(String[] args) {
        try {
            //读取mybatis-config.xml文件
            InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
            //初始化mybatis,创建SqlSessionFactory类的实例
            SqlSessionFactory sqlSessionFactory =  new SqlSessionFactoryBuilder().build(resourceAsStream);
            //创建session实例
            SqlSession session = sqlSessionFactory.openSession();
            /*
             * 接下来在这里做很多事情,到目前为止,目的已经达到得到了SqlSession对象.通过调用SqlSession里面的方法,
             * 可以测试MyBatis和Dao层接口方法之间的正确性,当然也可以做别的很多事情,在这里就不列举了
             */
            //插入数据
            User user = new User();
            user.setC_password("123");
            user.setC_username("123");
            user.setC_salt("123");
            //第一个参数为方法的完全限定名:位置信息+映射文件当中的id
            session.insert("com.cn.dao.UserMapping.insertUserInformation", user);
            //提交事务
            session.commit();
            //关闭session
            session.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

四、mybatis与hibernate区别

MyBatis 和 Hibernate 是两种常用的持久化框架,它们在实现方式和使用方法上有一些显著的区别:

  1. 编程风格和理念:

    • MyBatis: MyBatis 是一种基于 SQL 的持久化框架,它允许开发者直接编写 SQL 查询和更新语句,并通过映射文件或注解将 SQL 和 Java 对象进行关联。它更加接近于传统的 JDBC 编程风格,开发者可以更细粒度地控制 SQL 语句的执行和优化。

    • Hibernate: Hibernate 是一个全自动的对象关系映射(ORM)框架,它将 Java 对象和数据库表之间的映射关系完全定义在对象模型中,开发者不需要编写 SQL,而是通过面向对象的方式操作数据库。Hibernate 提供了更高级的功能,比如对象的缓存、延迟加载、自动事务管理等,使得开发更加简洁和高效。

  2. 灵活性和控制:

    • MyBatis: 提供了更多的灵活性和对 SQL 的直接控制能力。开发者可以优化和调整 SQL 查询,处理复杂的数据库操作,适用于需要复杂 SQL 语句或者对数据库操作有特殊要求的场景。

    • Hibernate: 相对于 MyBatis,Hibernate 更加注重对象的持久化和操作的简化。它提供了更高层次的抽象,使得开发者可以专注于面向对象的设计和开发,但在某些复杂 SQL 操作上可能不如 MyBatis 灵活。

  3. 学习曲线和使用难度:

    • MyBatis: 学习曲线相对较平缓,特别是对于熟悉 SQL 的开发者来说,上手相对容易。因为开发者需要自己编写和调优 SQL 语句,所以需要一定的数据库和 SQL 知识。

    • Hibernate: 初学者可能需要更多的时间理解和掌握 Hibernate 的概念和使用方法,特别是在配置和映射对象关系上。但一旦掌握,可以显著提高开发效率,尤其是在简单 CRUD 操作和对象操作上。

  4. 适用场景:

    • MyBatis: 适合对 SQL 控制要求高、有复杂查询和数据库优化需求的项目。如果你更喜欢在代码中直接控制 SQL 或者对 SQL 有深入的理解和优化需求,MyBatis 是一个不错的选择。

    • Hibernate: 适合那些强调对象模型和面向对象编程的项目,特别是对象的 CRUD 操作和对象之间的关系管理较为简单和直接的应用程序。Hibernate 提供的缓存、延迟加载等特性可以帮助提高性能和开发效率。

  5. 相同点

    • MyBatis 和 Hibernate 是两种在 Java 开发中常用的持久化框架,他们都是用于简化 Java 应用程序与数据库之间的交互,从而实现数据持久化的目的。

    • 无论是 MyBatis 还是 Hibernate,都支持将 Java 对象映射到数据库表,使开发者可以使用面向对象的方式操作数据。

    • 两者都提供了事务管理功能,可以确保在数据库操作中的一系列操作要么全部成功要么全部失败,从而保持数据的一致性和完整性。

    • 配置相对复杂,MyBatis 和 Hibernate 都支持缓存机制,可以减少数据库访问次数,提高性能。

  6. 不同点

    • Hibernate 是全自动的 ORM 框架,它会自动生成 SQL 语句并执行,开发者无需编写 SQL,可以通过 HQL(Hibernate Query Language)进行查询。但在某些情况下,可能会导致开发者失去对 SQL 查询执行的直接控制。

    • MyBatis 则是半自动的 ORM 框架,开发者需要手动编写 SQL 或者使用 MyBatis 的 XML 配置文件来映射 SQL 语句,从而更加灵活地控制 SQL 查询。配置较为简单,可以直接控制 SQL 查询的执行方式,并且可以使用动态 SQL 构建动态查询。

        
———总结来说,选择 MyBatis 还是 Hibernate 取决于项目的具体需求、团队的技术栈和个人偏好。有时候也可以根据项目的不同部分选择合适的框架组合,例如在复杂查询部分使用 MyBatis,在对象持久化和简单操作部分使用 Hibernate,以发挥各自的优势。

  • 17
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值