Mybatis框架

本文深入探讨MyBatis框架的核心概念,包括#与$的区别、mapper接口调用规范、编程步骤及核心类解析。同时,详细阐述了一级与二级缓存的工作机制,介绍如何利用Redis增强二级缓存效率。

目录

1、Mybatis中 # 和 $ 的区别?

2、 使用MyBatis的mapper接口调用时有哪些要求?

3、Mybatis的编程步骤是什么样的?

4、核心类

5、JDBC开发步骤:

6、 Mybatis中一级缓存与二级缓存?

7、使用Redis做mybatis的二级缓存

        https://www.cnblogs.com/springlight/p/6374372.html


MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。 

1、Mybatis中 # 和 $ 的区别?

  1. #相当于对数据 加上 双引号,$相当于直接显示数据
  2.  #将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号。如:select  * from table1 where id=#{id},前台传入的值为2,sql:select * from table1 where id='2' 
  3. $将传入的数据直接显示生成在sql中。如:select * from table1 where id=${id},前台传入参数为2,sql:select * from table1 where id=2
  4. #方式能够很大程度防止sql注入

           SQL注入:就是将原本的SQL语句的逻辑结构改变,使得SQL语句的执行结果和原本开发者的意图不一样.

              比如:使用Statement语句执行者,执行sql,会造成sql注入的问题,

                        String sql = "select * from tb_name where name= '"+varname+"' and passwd='"+varpasswd+"'";

                        如果我们把[' or '1' = '1]作为varpasswd传入进来,执行查询的时候 sql会变成,

                        String sql = "select * from tb_name where name= '' and passwd = '' or '1' = '1',1=1是永远成立的,

                        所以,前面的条件已经不起作用,

       5、${}通常对应于SQL语句的非变量部分,用于传入数据库对象,如group by,order by,表名。

                如:select * from ${tableName} order by ${id}

2、 使用MyBatis的mapper接口调用时有哪些要求?

      1. Mapper接口方法名和mapper.xml中定义的每个sql的id相同

      2. Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同

      3. Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同

      4. Mapper.xml文件中的namespace即是mapper接口的类路径。

3、Mybatis的编程步骤是什么样的?

     1、使用类加载器加载mybatis配置文件 

     2、创建SqlSessionFactory

     3、通过SqlSessionFactory创建SqlSession

     4、通过sqlsession执行数据库操作

     5、调用session.commit()提交事务

     6、调用session.close()关闭会话

4、核心类

      1.SqlSessionFactoryBuilder(class):读取配置文件,得到数据源信息,创建连接工厂SqlSessionFactory。特点是当创建了SqlSessionFactory对象之后,这个类就不需要了。因此,它的最佳范围是存在于方法体内,也就是局部变量

      2.SqlSessionFactory(interface):连接工厂(一个数据库对应一个连接工厂);创建SqlSession实例的工厂。它的特点是,SqlSessionFactory对象一旦被创建,就无法销毁或者再创建,也不建议多次创建SqlSessionFactory对象。因此,它的最佳范围是应用(Application)范围内

      3.SqlSession(interface):将mapper文件转换成JDBC代码,封装dao接口实现类,封装Connection对象

                                                         一个连接可以让多个线程同时使用吗?不能

5、JDBC开发步骤:

  1. 加载驱动                           Class.forName("com.mysql.jdbc.Driver");
  2. 创建数据库连接对象        

                            Connection  con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/70_mybatis", "root", "admin");

  3. 定义sql语句                       String sql="select * from `user` where id=?";

  4. 创建prepareStatement对象并为参数赋值   PreparedStatement psmt = con.prepareStatement(sql) ;          psmt.setInt(1, 24);

  5. select操作需处理结果集

  6. 释放资源

6、 Mybatis中一级缓存与二级缓存?

          (1) 一级缓存: 基于PerpetualCache 的 HashMap本地缓存,其存储作用域为 Session,当 Session flush 或 close 之后, 该Session中的所有 Cache 就将清空。

          (2)二级缓存(默认开启)与一级缓存其机制相同,默认也是采用PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如 Ehcache。作用域为namespance是指对该namespance对应的配置文件中所有的select操作结果都缓存,这样不同线程之间就可以共用二级缓存。

          (3)MyBatis二级缓存只适用于不常进行增、删、改的数据,比如国家行政区省市区街道数据。一但数据变更,MyBatis会清空缓存。因此二级缓存不适用于经常进行更新的数据。

          (4)MyBatis二级缓存的对象必须实现Serializable接口

7、使用Redis做mybatis的二级缓存

        https://www.cnblogs.com/springlight/p/6374372.html

                  <!-- 全局映射器启用缓存 *主要将此属性设置完成即可--> <setting name="cacheEnabled" value="true"/>

                在重写各方法体中,使用redisFactory和redis服务建立连接,将缓存的数据加载到指定的redis内存中(putObject方法)或将redis服务中的数据从缓存中读取出来(getObject方法);

  1. 配置redis.xml 设置redis服务连接各参数
  2. 在mybatis配置文件中使用 <setting> 标签,设置开启二级缓存;
  3. 在mapper.xml 中使用<cache type="com.demo.RedisCacheClass" /> 将cache映射到指定的RedisCacheClass类中;
  4. 映射类RedisCacheClass 实现 MyBatis包中的Cache类,并重写其中各方法;

    在redis服务中写入和加载数据时需要借用spring-data-redis.jar中JdkSerializationRedisSerializer.class中的序列化(serialize)和反序列化方法(deserialize),此为包中封装的redis默认的序列化方法;

      5. 映射类中的各方法重写完成后即可实现mybatis数据二级缓存到redis服务中;

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值