• Mybatis 使用


    一、mapper映射的几种方式
    1、使用相对于类路径的资源引用
    <mappers>
    <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
    </mappers>

    2、使用完全限定资源定位符(URL)
    <mappers>
    <mapper url="file:///var/mappers/AuthorMapper.xml"/>
    </mappers>

    3、使用映射器接口实现类的完全限定类名
    <mappers>
    <mapper class="org.mybatis.builder.AuthorMapper"/>
    </mappers>

    4、将包内的映射器接口实现全部注册为映射器
    <mappers>
    <package name="org.mybatis.builder"/>
    </mappers>

    二、获取参数的两种方式
    #{}
    1、会将SQL语句中的参数转为'?',SQL语句会经过JDBC的PreparedStatement预编译成数据库的相对应的语句。
    如:select * from user where id = #{id} ==> select * from user where id = ?
    2、能够有效的防止SQL注入

    ${}
    1、会将SQL语句转为字符串拼接的方式,不会进行预编译
    如:select * from user where id = ${id} ==> select * from user where id = +id
    2、存在SQL注入风险


    三、参数传递(SQL语句中的参数个数)
    1、单个参数
    getUser(Integer id);
    java代码中的参数名称与SQL语句中的参数名称可以不一样,如:
    select * from user where id = #{dfdfd}

    2、对个参数
    getUser(Integer id, String username);
    会将传进来的参数封装成map,
    1个值会对应两个map项,如:id ==> {arg0:id的值},{param1:id的值}
    那么username ==> {arg1:username的值},{param2:username的值}
    select * from user where id = #{arg0} and username = #{param2} (不推荐这种方式,不利于SQL扩展)

    select * from user where id = #{id} and username = #{username} (推荐)


    四、常用OGNL表达式
    e1 or e2
    e1 and e2
    e1 == e2, e1 eq e2
    e1 != e2, e1 neq e2
    e1 lt e2:小于
    e1 gt e2:大于
    e1 in e2
    e1 not in e2
    e1 + e2, e1 * e2, e1/e2, e1 - e2, e1%e2
    !e,not e:非,求反
    e.method(args)调用对象方法
    e.property对象属性
    e1[e2]按索引取值,list,array,map
    @class@method(args)调用类的静态方法
    @class@field调用类的静态字段值

    五、缓存

    参考:https://www.cnblogs.com/wuzhenzhao/p/11103043.html
    一级缓存特性
    1、默认开启,也可以关闭一级缓存localCacheScope=STATEMENT
    2、作用域是SQLSession(默认),一次数据库操作会话
    3、缓存默认实现类PerpetualCache,使用map进行存储,其key ==> hashcode + sqlid + sql + hashcode + environment的ID
    4、查询完之后将结果集存储到一级缓存中
    失效情况
    1、 不同的SQLSession会使用不同的一级缓存
    2、同一个SQLSession但查询语句不一样
    3、同一个SQLSession在执行了增删改等操作后,针对同一条SQL查询的缓存回失效。
    4、同一个SQLSession,查询语句一样,手动清除缓存

    二级缓存特性
    1、默认开启,但是没有实现。
    2、作用域:基于全局范围,应用级别
    3、缓存默认实现类PerpetualCache,也使用map进行存储,但是二级缓存根据不同的mapper命名空间多包涵了一层map
    org.apache.ibatis.session.Configuration#cache
    一层 key mapper命名空间 value:erpetualCache.map
    二层 key ==> hashcode + sqlid + sql + hashcode + environment的ID value:SQL语句查询结果
    4、事务提交后将结果集存储到二级缓存中
    5、查询先从二级缓存中获取数据,在从一级缓存中获取
    实现
    1、全局配置文件中设置<setting name="cacheEnabled" value="true"/>
    2、在需要用到二级缓存的映射文件中加上结点<cache></cache>,是基于mapper映射文件来实现的二级缓存,基于mapper映射文件的命名空间来存储
    3、在需要使用到二级缓存的javabean中实现序列化接口Serializable
    失效
    1、同一个mapper文件中(同一个命名空间下)调用了增删改操作,会导致二级缓存失效。如果不想失效,可以将SQL的flushCache设置为false

    —转载请注明出处
  • 相关阅读:
    [ APIO 2015 ] 雅加达的摩天楼
    「POI2011 R1」Conspiracy
    「COCI2016/2017 Contest #2」Bruza
    「THUWC 2017」随机二分图
    「HAOI2015」按位或
    Topcoder Srm 726 Div1 Hard
    「LOJ6482」LJJ爱数数
    「2017 山东一轮集训 Day4」基因
    「Codechef April Lunchtime 2015」Palindromeness
    「UOJ207」共价大爷游长沙
  • 原文地址:https://www.cnblogs.com/landiss/p/14501303.html
Copyright © 2020-2023  润新知