mybatis复习

Mysql的一级缓存:

一级缓存基于sqlSession默认开启,在操作数据库时需要构造SqlSession对象,在对象中有一个HashMap用于存储缓存数据。不同的SqlSession之间的缓存数据区域是互相不影响的。
一级缓存的作用域是SqlSession范围的,当在同一个sqlSession中执行两次相同的sql语句时,第一次执行完毕会将数据库中查询的数据写到缓存(内存),
第二次查询时会从缓存中获取数据,不再去底层数据库查询,从而提高查询效率。

二级缓存是mapper级别的缓存。使用二级缓存时,多个SqlSession使用同一个Mapper的sql语句去操作数据库,得到的数据会存在二级缓存区域,它同样是使用HashMap进行数据存储。相比一级缓存SqlSession,二级缓存的范围更大,多个Sqlsession可以共用二级缓存,二级缓存是跨SqlSession的。
二级缓存的作用域是mapper的同一个namespace。不同的sqlSession两次执行相同的namespace下的sql语句,且向sql中传递的参数也相同,即最终执行相同的sql语句,则第一次执行完毕会将数据库中查询的数据写到缓存,第二次查询会从缓存中获取数据,不再去底层数据库查询,从而提高效率。

(1) 在核心配置文件SqlMapConfig.xml中settings标签中加入下面开启总缓存(默认就是开启的)

"cacheEnabled" value="true"/>

(2)在UserMapper.xml中开启二缓存(开启之后对象需要实现序列化接口:Serializable  为了将缓存数据取出执行反序列化操作,因为二级缓存数据存储介质多种多样,不一定在内存。)

注意:开启二级缓存后对应的pojo需要实现序列化,因为二级缓存不只在内存

当进行了commit也就是增删改操作时,两个缓存都会刷新,但是二级缓存可以设置不刷新,但是会造成脏读。

 

延迟加载:

当需要查询两个表的连接内容,但是可能第二个表并不一定需要,我们则可以指定第二个表进行延迟加载,就是需要才加载,通过associate和collection实现

一对多,一对一:

一对一使用association,将结果映射到单个对象

一对多使用collection,将结果映射至集合

注意,如果两个表中的名称有一致的,那么必须定义别名使名称不相同,否则会有不可预估的错误

  
      
      
      
          
          
          
          
              
              
          
      

      
      
      
          
          
          
              
              
          
          
              
              
          
      

  

sql动态语句:

 

#{}和${}的区别

#{}表示一个占位符:,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入

  ${}表示拼接sql串,通过${}可以将parameterType传入的内容拼接在sql中且不进行jdbc类型转换

 

模糊查询like语句该怎么写?

第1种:在Java代码中添加sql通配符。
    string wildcardname = “%smi%”; 
    list names = mapper.selectlike(wildcardname);

    
第2种:在sql语句中拼接通配符,会引起sql注入
    string wildcardname = “smi”; 
    list names = mapper.selectlike(wildcardname);

    
第三种:通过$

select * from foo where bar like "%${要存的} %"

当实体类中的属性名和表中的字段名不一样 ,怎么办 ?

第1种:用resultType的话, 通过在查询的sql语句中定义字段名的别名,让字段名的别名和实体类的属性名一致 。

     



第2种: 通过来映射字段名和实体类属性名的一一对应的关系 

    
    
         
         
         
         
         
    

4、通常一个Xml映射文件,都会写一个Dao接口与之对应,请问,这个Dao接口的工作原理是什么?Dao接口里的方法,参数不同时,方法能重载吗?

Dao接口,就是人们常说的Mapper接口,接口的全限名,就是映射文件中的namespace的值,接口的方法名,就是映射文件中MappedStatement的id值,接口方法内的参数,就是传递给sql的参数。Mapper接口是没有实现类的,当调用接口方法时,接口全限名+方法名拼接字符串作为key值,可唯一定位一个MappedStatement,举例:com.mybatis3.mappers.StudentDao.findStudentById,可以唯一找到namespace为com.mybatis3.mappers.StudentDao下面id = findStudentById的MappedStatement。在Mybatis中,每一个或者标签。Mybatis框架在初始化阶段会对XML配置文件进行读取,将其中的sql语句节点对象化为一个个MappedStatement对象。比如下面这个非常简单的XML mapper文件:

为了区分不同的Mapper文件中的sql节点,我们其是以Mapper文件的namespace作为前缀,再加上该节点本身的id值。用来标识的,


public final class MappedStatement {
 
  private String resource;
  private Configuration configuration;
  private String id;
  private Integer fetchSize;
  private Integer timeout;
  private StatementType statementType;
  private ResultSetType resultSetType;
  private SqlSource sqlSource;
  private Cache cache;
  private ParameterMap parameterMap;
  private List resultMaps;
  private boolean flushCacheRequired;
  private boolean useCache;
  private boolean resultOrdered;
  private SqlCommandType sqlCommandType;
  private KeyGenerator keyGenerator;
  private String[] keyProperties;
  private String[] keyColumns;
  private boolean hasNestedResultMaps;
  private String databaseId;
  private Log statementLog;
  private LanguageDriver lang;
 
  private MappedStatement() {
    // constructor disabled
  }
  ..........

我们可以看到其中的属性基本上和xml元素的属性有对应关系,其中比较重要的有表示查询参数的ParameterMap对象,表示sql查询结果映射关系的ResultMap列表resultMaps,当然最重要的还是执行动态sql计算和获取的SqlSource对象。通过这些对象的通力合作,MappedStatement接受用户的查询参数对象,动态计算出要执行的sql语句,在数据库中执行sql语句后,再将取得的数据封装为JavaBean对象返回给用户。MappedStatement对象的这些功能,也体现出了Mybatis这个框架的核心价值,“根据用户提供的查询参数对象,动态执行sql语句,并将结果封装为Java对象

mybaits分页:

将分页的详情当做参数传进去。

你可能感兴趣的:(mybatis复习)