cccreator / Java

Accumulation And Mark
0 stars 0 forks source link

MyBatis #17

Open cccreator opened 5 years ago

cccreator commented 5 years ago

MyBatis

MyBatis是持久层框架,支持定制化sql,存储过程以及高级映射。MyBatis的GitHUB学习地址为: http://mybatis.github.io/mybatis-3/

MyBatis的xml配置

  1. <properties>的使用 <properties resource="db.properties"></properties> 用properties标签来引入外部properties类型的文件,其中:resource引入类路径下的资源;url引入网络路径或者磁盘路径下的资源;

  2. <settings>的使用

    <settings>
             <!--自动映射下划线到驼峰命名 如DB:last_name 自动映射成lastName>
             <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>

    settings包含很多重要的设置项,用setting来设置每一项,那么设置项的名称,value设置项的值

  3. <environments>的使用

    
    <environments default="mysql">
            <environment id = "mysql">
                           <transactionManager type="JDBC" />
                           <dataSource type="POOLED">
                                         <property name ="driver" value="${jdbc.driver}" />
                                         <property name = "url" value="${jdbc.url}" />
                                         <property name = "username" value="${jdbc.uername}" />
                                         <property name = "password" value="${jdbc.password}" />
                            </dataSource>
              </environment>
    
              <environment id = "oracle">
                             <transactionManager type="JDBC" />
                             <dataSource type="POOLED">
                                           <property name ="driver" value="${orcl.driver}" />
                                           <property name = "url" value="${orcl.url}" />
                                           <property name = "username" value="${orcl.uername}" />
                                           <property name = "password" value="${orcl.password}" />
                              </dataSource>
                </environment>
    </environments>
environments用于配置各种环境,使用default来指定默认的具体环境;environment用于配置每个具体的环境,其中id为当前环境的标识;transactionManager事务管理器,其中type用于配置具体的事物管理器类型,JDBC为JdbcTransactionFactory,MANAGED为ManagedTransactionFactory,最终事务管理要交给Spring,使用Spring的声明式事务;dataSource为数据源,其中Type为执行数据源的类型,UNPOOLED表示不使用连接池,POOLED表示使用连接池,JNDI表示从web服务器中获取数据源,最终数据源交给Spring管理;

1. `<databaseIdProvider>`的使用

mappers用于引入sql映射文件,mapper用于引入单个sql映射文件,其中resource:引入类路径下的sql映射文件,url引入网络路径或者磁盘路径下的sql映射文件;package用于批量引入sql映射文件,要求:sql映射文件名字与Mapper接口的名字一致;sql映射文件与Mapper接口必须在同一目录下
cccreator commented 5 years ago

MyBatis的使用

一、select查询返回List/Map 1.查询多条数据返回List 如果使用的是自动映射 , resultType指定的是集合中元素的类型。或者说 理解为想让Mybatis将一条数据封装成哪种类型的java对象。就指定哪种类型 2.查询返回Map a.查询一条数据返回Map,MyBatis会自动使用表的列名作为key,列值作为value返回. b.查询多条数据返回Map,需要使用@MapKey("key")指定封装map的时候所使用的key Map中的value就是 一条数据封装成的java对象 二、resultMap 自定义映射 a. association 用来映射联合属性

association可以使用分步查询

association使用分步查询可以使用延迟加载

b. collection 用来映射集合类型的联合属性

collection使用分步查询

collection分步查询使用延迟加载

三、动态sql if: 用于条件的判断. test中写的OGNL表达式. where:用于解决拼装sql的时候where 以及 前面多出或者少and的问题. trim: 用于解决拼装sql的时候前面或者后面 缺少或者多出某些字符的问题 set: 用于解决修改操作拼装sql的时候,的问题. choose:类似于带了break的switch case语句. when可以出现多次 otherwise出现一次. foreach:主要用于对集合的遍历 . 使用foreach完成Mysql的批量操作. 四、内置参数 a._parameter: 代表整个参数. 如果是单个参数,则代表整个参数 如果是多个参数,MyBatis会封装map,_parameter代表封装后的map。 b._databaseId: 如果配置了databaseIdProvider,_databaseId代表当前使用的数据库的别名. 五、抽取可重用的sql 可以使用 将重复使用率高的sql语句抽取出来。方便多次使用. 在使用的地方可以用 来引用已经抽取好的sql. Mapper.xml的使用:https://github.com/cccreator/Java/tree/master/mybatis/MyBatis02/conf/com/atguigu/mybatis/mapper

cccreator commented 5 years ago

mybatis缓存

一、缓存机制 1.一级缓存 一级缓存(本地缓存) SqlSession级别的缓存,本质上就是SqlSession级别的一个map。 每一个SqlSession对象都自己的一级缓存.互不共享. 一级缓存是默认开启的 工作机制: 与数据库的一次会话期间(通过一个SqlSession,查询到的数据会放在一级缓存中. 以后如果需要获取相同的数据,直接从缓存中获取,而不需要发送sql到数据库查询. 一级缓存失效的情况: 1.SqlSession不同.
2.SqlSession相同,但是查询条件不同.
3.SqlSession相同,但是在两次查询期间执行了增删改的操作. 4.SqlSession相同,手动清除了一级缓存. 2.二级缓存 二级缓存(全局缓存 基于namespace级别的缓存. 二级缓存默认是关闭的,必须手动配置开启. 工作机制: 1.一个会话(SqlSession),查询一条数据,这个数据就会被放在当前会话的一级缓存中. 2.如果会话提交或者关闭,一级缓存中的数据会被保存到二级缓存中.

        使用步骤:
        1.在全局配置文件中开启二级缓存:
           <setting name="cacheEnabled" value="true"/>
        2.在想要使用二级缓存的sql映射文件中配置使用二级缓存:
           <cache></cache>
        3.我们的POJO需要实现序列化接口.
3.缓存相关的设置
 1. cacheEnabled=false:关闭的是二级缓存,一级缓存依旧可以使用.
 2. 每一个select标签都useCache=true属性.
        如果useCache=false:  不使用二级缓存,依旧使用一级缓存.
 3. 每一个增删改标签都有flushCache=true属性:
       在两次查询期间做了增删改操作,一二级缓存都会清除.
    每一个查询标签都有flushCache=false,如果改为true,每次查询之后都会清除缓存,缓存是没被使用的.
 4.sqlSession.clearCache(): 只会清空当前session的一级缓存.

 5.localCacheScope:设置一级缓存(本地缓存)的作用域。
        SESSION :会话期间
    STATEMENT:  可以禁用一级缓存.

4.整合第三方的缓存 1.导入Ehcache的jar包 以及适配包 ehcache-core-2.6.8.jar mybatis-ehcache-1.0.3.jar slf4j-api-1.6.1.jar slf4j-log4j12-1.6.2.jar 2.配置Ehcache的配置文件

 3.在映射文件中配置使用Ehcache
      <cache type="org.mybatis.caches.ehcache.EhcacheCache"></cache>