Mybatis考试复习资料

简介: Mybatis考试复习资料

Mybatis特点

1、简单易学:本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个sql映射文件易于学习,易于使用,通过文档和源代码,可以比较完全的掌握它的设计思路和实现。

2、灵活:mybatis不会对应用程序或者数据库的现有设计强加任何影响。 sql写在xml里,便于统一管理和优化。通过sql语句可以满足操作数据库的所有需求

3、解除sql与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易单元测试。sql和代码的分离,提高了可维护性。

4、提供映射标签,支持对象与数据库的ORM字段关系映射

5、提供对象关系映射标签,支持对象关系组建维护

6、提供xml标签,支持编写动态sql。

image.png

 

MybatisUtils.java

private static SqlSessionFactory sqlSessionFactory;

static {
   
try {
       
String resource = "mybatis-config.xml";
       
InputStream inputStream = Resources.getResourceAsStream(resource);
       
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

    }
catch (IOException e){
        e.printStackTrace();
    }
}

public static SqlSession createSession(){
       
return sqlSessionFactory.openSession();
}

image.png

 

几个可以优化的地方

  1. 连接数据库的配置单独放在一个properties文件中
  2. 为实体类定义别名,简化sql映射xml文件中的引用
  3. 可以在src下加入log4j的配置文件,打印日志信息

image.png

image.png

 

 

动态SQL与模糊查询

<mapper namespace="com.rjxy.day03_mybatis.test6.userMapper">

<select id="getUser"  parameterType="com.rjxy.day03_mybatis.test6.ConditionUser"  resultType="com.rjxy.day03_mybatis.test6.User">

                 select * from d_user where age>=#{minAge} and age&lt;=#{maxAge}

           <if test='name!="%null%"'>and name like #{name}</if>

     </select>

</mapper>

MyBatis中可用的动态SQL标签

image.png

 

调用存储过程

说说每行代表的含义

#创建存储过程(查询得到男性或女性的数量, 如果传入的是0就女性否则是男性)

DELIMITER $

CREATE PROCEDURE mybatis.ges_user_count(IN sex_id INT, OUT user_count INT)

BEGIN  

IF sex_id=0 THEN

SELECT COUNT(*) FROM mybatis.p_user WHERE p_user.sex='女' INTO user_count;

ELSE

SELECT COUNT(*) FROM mybatis.p_user WHERE p_user.sex='男' INTO user_count;

END IF;

END

$

 

<mappernamespace="com.rjxy.mybatis.test7.userMapper">

   <!--

      查询得到男性或女性的数量, 如果传入的是0就女性否则是男性

      CALL mybatis.get_user_count(1, @user_count);

    -->

    <selectid="getCount"statementType="CALLABLE"parameterMap="getCountMap">

       call mybatis.get_user_count(?,?)

    </select>

    <parameterMaptype="java.util.Map"id="getCountMap">

       <parameterproperty="sex_id"mode="IN"jdbcType="INTEGER"/>

       <parameterproperty="user_count"mode="OUT"jdbcType="INTEGER"/>

    </parameterMap>

</mapper>

image.png

缓存

如果SqlSession调用了close()方法,会释放掉一级缓存PerpetualCache对象,一级缓存将不可用。

如果SqlSession调用了clearCache(),会清空PerpetualCache对象中的数据,但是该对象仍可使用。

SqlSession中执行了任何一个update操作(update()、delete()、insert()) ,都会清空PerpetualCache对象的数据,但是该对象可以继续使用

怎么判断某两次查询是完全相同的查询?

1、传入的statementId

2、查询时要求的结果集中的结果范围

3、这次查询所产生的最终要传递给JDBC java.sql.Preparedstatement的Sql语句字符串(boundSql.getSql() )

4、传递给java.sql.Statement要设置的参数值

 

Mapper级别的缓存,拥有多个SqlSession,执行同一Mapper中的SQL语句,数据也存储在HashMap中,并且每个SqlSession中的缓存内容共享。Java类若要使用二级缓存则需要实现Serializable接口。

 

JDBC的执行流程有那几步。

  1. 加载数据库驱动
  2. 创建并获取数据库链接
  3. 创建jdbc statement对象
  4. 设置SQL语句
  5. 设置SQL语句中的参数
  6. 通过statement执行SQL并获取结果
  7. 对SQL执行结果进行解析处理
  8. 释放资源

简述Mybatis开发的步骤。

  1. 添加jar包
  2. 建库+表
  3. 添加Mybatis的配置文件conf.xml。
  4. 定义表所对应的实体类
  5. 定义操作users表的SQL映射文件userMapper.xml
  6. 在conf.xml文件中注册userMapper.xml文件
  7. 编写测试代码,执行定义的select语句


一级缓存

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

SqlSession级别的缓存,缓存数据存储在HashMap中,在进行第一次查询时,首先会从数据库中查询出结果,然后将结果存在一级缓存中;当我们第二次查询时,首先会查询一级缓存,如果一级缓存没有在查询数据库。在进行CUD操作并执行了commit或关闭Sqlsession后会将缓存清空,如果二级缓存是开启的那么会将数据缓存到二级缓存中。默认一级缓存是开启的


二级缓存

二级缓存是二级缓存与一级缓存其机制相同,默认也是采用  PerpetualCache,HashMap存储,不同在于其存储作用域为 Mapper(Namespace),并且可自定义存储源,如  Ehcache(EhCache 是一个纯Java的进程内缓存框架,具有快速、精干等特点)。

Mapper级别的缓存,拥有多个SqlSession,执行同一Mapper中的SQL语句,数据也存储在HashMap中,并且每个SqlSession中的缓存内容共享。Java类若要使用二级缓存则需要实现Serializable接口。

 

重点说说每个标签的含义

<cache

eviction="FIFO"  //回收策略为先进先出

flushInterval="60000" //自动刷新时间60s

size="512" //最多缓存512个引用对象

readOnly="true"/> //只读

 

目录
相关文章
|
3月前
|
缓存 Java 数据库连接
mybatis第一次课
mybatis第一次课
19 0
mybatis第一次课
|
3月前
|
SQL Java 数据库连接
还在为学MyBatis发愁?史上最全,一篇文章带你学习MyBatis
还在为学MyBatis发愁?史上最全,一篇文章带你学习MyBatis
|
8月前
|
SQL 存储 缓存
MyBatis 学习心得笔记
MyBatis 学习心得笔记
64 0
|
9月前
|
XML SQL Java
学习笔记如此详细的mybatis,你不来看看吗?
学习笔记如此详细的mybatis,你不来看看吗?
132 0
学习笔记如此详细的mybatis,你不来看看吗?
|
SQL XML Java
|
XML SQL Java
MyBatis配置与使用-初入篇
MyBatis配置与使用
180 0
|
SQL XML 存储
Mybatis面试题库
Mybatis 在处理#{}时,会将 sql 中的#{}替换为?号,调用 PreparedStatement 的 set方法来赋值; Mybatis 在处理${}时,就是把${}替换成变量的值。
127 0
|
SQL 缓存 Java
八股文面经之Mybatis笔记(上)
八股文面经之Mybatis笔记(上)
326 0
|
SQL 存储 XML
MyBatis从前世到今生一网打尽(下)
框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种认为,框架是可被应用开发者定制的应用骨架、模板。​ 简单的说,框架其实是半成品软件,就是一组组件,供你使用完成你自己的系统。从另一个角度来说框架一个舞台,你在舞台上做表演。在框架基础上加入你要完成的功能。
189 0
MyBatis从前世到今生一网打尽(下)
|
SQL XML Java
MyBatis从前世到今生一网打尽(上)
框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种认为,框架是可被应用开发者定制的应用骨架、模板。 ​ 简单的说,框架其实是半成品软件,就是一组组件,供你使用完成你自己的系统。从另一个角度来说框架一个舞台,你在舞台上做表演。在框架基础上加入你要完成的功能。
166 0
MyBatis从前世到今生一网打尽(上)