Java框架之Mybatis(二)

陆 、mybatis 中的一流缓存

 2)创造布局文件 UserMapper.xml

<insert id="add_user" parameterType="userInfo"  >
        insert into userInfo (userName,password,note) values (#{userName},#{password}, #{note} ) 
</insert>

4 输入输出映射对应的类型 ( parameterType 和 resultType )

1) 导jar包

1) 创建mapper接口

slf4j-api-1.6.1.jar

3.hashmap

程序员只须要写 mapper接口 ,必须服从一定的正统

<?xml version="1.0" encoding="UTF-8" ?>  
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" 
          "http://mybatis.org/dtd/mybatis-3-mapper.dtd">  

          <mapper namespace="cat.mapper.UserMapper" >
          <cache/>

<!-- 声明一个sql片段 在这个片断中尽量不要写where -->
          <sql id="query_user_condation">
           <if test="id != 0">
                and id = #{id}
           </if>
           <if test="userName != null and userName !='' " >
                 and userName = #{userName}
           </if>
           <if test="password != null and password!=''">
                 and password = #{password}
           </if>
           </sql>

           <!--    引用sql片断 -->
           <select id="get_userlist" parameterType="userInfo"  resultType="userInfo" >
                 select * from userInfo
             <where>
                 <include refid="query_user_condation" /> 
                          and note ='这是note'
             </where>

           </select>

           <resultMap id="userInfoResultMap" type="userInfo">
                      <id property ="id" column="id" />
                      <result property="userName" column="uname" />
                      <result property="password" column="pwd" />
           </resultMap>

                      <select id="getuser_byid"  parameterType="int" resultType="userInfo" >
                              select * from userInfo where id=#{id} 
                      </select>

                      <select id="getuser_biname" parameterType="string" resultType="userInfo">
                              select * from userInfo where userName like  '%${value}%' 
                      </select>

           <!-- 对于添加这类方法,是没有resultType的 -->
                      <insert id="add_user" parameterType="userInfo"  >
                      <selectKey order="AFTER" keyProperty="id" resultType="int">  
                               select  last_insert_id()
                      </selectKey>
                               insert into userInfo (userName,password,note) values (#{userName},#{password}, #{note} ) 
                      </insert>

                      <select id="get_login_user" parameterType="java.util.HashMap" resultMap="userInfoResultMap" >
                               select userName as uname,password as pwd,note  from userInfo where userName=#{userName} and password= #{password}
                      </select>

                      <insert id="add_user_new" parameterType="userInfo"  >
                        <selectKey order="BEFORE" keyProperty="id" resultType="string">  
                                 select  uuid()
                        </selectKey>
                                    insert into userInfo (id,userName,password,note) values (#{id},#{userName},#{password}, #{note} ) 
                      </insert>

                      <delete id="deluser_byid" parameterType="int" > 
                                    delete from userInfo where id=#{id}
                      </delete>

                      <update id="update_user" parameterType="cat.beans.UserInfo" > <!-- 传过来的userInfo对象中要有id -->
                                   update userInfo set userName= #{userName},password= #{password}, note =#{note} where id= #{id}
                      </update>

</mapper>

3) typeAliases 配置项目小名

地点的例子中,假若有八个mapper ,则在spring
中要配置多次,很不便于。能够选取扫描的方式加载:

log4j.logger.java.sql.PreparedStatement=DEBUG

<select id="selectUserRoles" resultType="UserRoleVO">
        select * from user_role a,role b where a.roleid = b.roleid and a.userid = #{userid}
</select>

只要传入的参数是四个的时候,大家就须求把它们封装成多个Map了,当然单参数也足以封装成map,实际上只要您在传诵参数的时候,在MyBatis里面也是会把它封装成2个Map的,map的key正是参数名,所以那几个时候collection属性值便是传播的List或array对象在温馨包装的map里面包车型大巴key。

<select id="get_userList" parameterType="userInfo" resultType="userInfo" >
        select * from userInfo where 1 = 1
        <if test="id != 0">
            and id = #{id}
        </if>
        <if test="userName != null and userName !='' " >
            and userName = #{userName}
        </if>
        <if test="password != null and password!=''">
            and password = #{password}
        </if>
</select>

log4j.appender.Console=org.apache.log4j.ConsoleAppender

十、mybatis 和 spring 整合

(1)当为select语句时:

11 mybatis + spring mvc

foreach

environments :用于配置数据源,连接池,事务属性等

EhCache
是八个纯Java的进度内缓存框架,具有便捷、精干等特性,是Hibernate中暗中认可的CacheProvider。

item  集合中每二个成分进行迭代时的外号,

log4j.logger.java.sql.ResultSet=INFO

<mappers>
        <mapper resource="mapper/UserMapper.xml" />
</mappers>

— UserMapper.xml , namepsace 属性 等于接口的凡事径名 <mapper
namespace=”cat.mapper.UserMapper”>

陈设事物管理器

在符合【Cache使用时的注意事项】的渴求时,并从未什么样伤害。

<aop:config>
     <aop:pointcut id="myTxPointCut"  expression="execution(* cat.service.impl.*.*(..))" /> 
     <aop:advisor advice-ref="txActive" pointcut-ref="myTxPointCut"/> 
</aop:config>

<tx:advice id="txActive" transaction-manager="txManager">
           <tx:attributes>
           <tx:method name="get*" read-only="true" propagation="NOT_SUPPORTED"/>
           <tx:method name="update*" propagation="REQUIRED"  />
           <tx:method name="insert*" propagation="REQUIRED"  />
           <tx:method name="del*" propagation="REQUIRED"  />
           <tx:method name="add*" propagation="REQUIRED"  />
           </tx:attributes>
</tx:advice>
static void test5() throws IOException{
                        InputStream in = Test.class.getClassLoader().getResourceAsStream("SqlMapConfig.xml");    
                        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);

                        SqlSession session1=factory.openSession();
                        SqlSession session2=factory.openSession();  //用的是两个不同的session


                        UserMapper userMapper1=session1.getMapper(UserMapper.class);
                        UserMapper userMapper2=session2.getMapper(UserMapper.class);

                        UserInfo user=userMapper1.getuser_byid(2);

                        session1.close();
                        UserInfo user2=userMapper2.getuser_byid(2);  //结果就输出一条查询语句,可以证明使用的是二级缓存

                        session2.close();

                        System.out.println(user);
                }

和原来的UserInfo.xml配置大旨一样,只要改变下边包车型客车那句即可

//例
<environments default="development">
    <environment id="development">
    <transactionManager type="JDBC" />
    <dataSource type="POOLED">
                <property name="driver" value="${db.driver}" />
                <property name="url" value="${db.url}" />
                <property name="username" value="${db.username}" />
                <property name="password" value="${db.password}" />
    </dataSource>
    </environment>
</environments>
//resultMap的使用
<select id="get_login_user" parameterType="java.util.HashMap" resultMap="userInfoResultMap" > //这里的返回类型 resultMap
        select userName as uname,password as pwd,note  from userInfo where userName=#{userName} and password= #{password}
</select>

<resultMap id="userInfoResultMap" type="userInfo">
        <id property ="id" column="id" />  //这列特殊,用来指定id
        <result property="userName" column="uname" />
        <result property="password" column="pwd" />
</resultMap>

//说明: 如果 userInfoResultMap 是配置在别的配置文件中的,在使用的时候要加上它的namespace

1)针对三个表的一些操作不在他独自的namespace下开始展览。

sql片段:

5 mybatis 动态 sql

//加载spring主配置文件
<context-param>
         <param-name>contextConfigLocation</param-name>
         <param-value>classpath:spring/applicationContext.xml</param-value>
</context-param>
         <listener>
                   <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
         </listener>

//配置springmvc的核心控制器
<servlet>
         <servlet-name>springmvc</servlet-name>
         <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
         <init-param>
               <param-name>contextConfigLocation</param-name>
               <param-value>classpath:spring/springmvc.xml</param-value>
         </init-param>
         <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
         <servlet-name>springmvc</servlet-name>
         <url-pattern>/</url-pattern>
</servlet-mapping>

 2)foreach

2)
在能够保证查询远远胜出insert,update,delete操作的气象下使用缓存。那点不要求多说,全部人都应当明白。记住,那或多或少索要保险在1的前提下才足以!

insert,update,delete操作会清空所在namespace下的全套缓存。平常采取MyBatis
Generator生成的代码中,都以各类表独立的,每一种表都有谈得来的namespace。

/* 以下面个写法来自网上,没有测试 
<select id="dynamicForeachTest" resultType="Blog">
        select * from t_blog where id in
<foreach collection="list" index="index" item="item" open="(" separator="," close=")">
        #{item}
</foreach>
</select>

        <if test="ids!=null">
<foreach collection="ids" item="userid" open=" and (" close=")" separator="or">
        <!-- 遍历拼接的串 -->
        id=#{id}
</foreach>
        </if>

         比如 where id in(1,3,6)

          <if test="ids!=null">
               <foreach collection="ids" item="userid" open=" and id in (" close=")" separator=",">
               <!-- 遍历拼接的串 -->
               #{id}
               </foreach>
          </if>
*/

//例子
<select id="getuser_by_ids" resultType="cat.beans.UserInfo" parameterType="list">  //注意,这里的 parameterType 给的是list
        select * from UserInfo where id in
        <foreach collection="list" item="userid" open=" (" close=")" separator=",">
        #{userid}
        </foreach>                     
</select>

//上面的写法 collection = ids 这样写可能是因为 它的paramenter type指定成 dto 中的 ids了     

trim

== 要拓展缓存的实体类要落到实处  Serializable 接口

2 dao层的支出(使用mapper代理的办法)

永不忘了在主配置文件中引入

3)  ehcache 的布局文件 ehcache.xml  (那是全体内容) //
放在config目录下(类路径下)即可

在选取foreach的时候最重视的也是最简单失误的正是collection属性,该属性是必须的,分歧意况下,值是区别的,首要有
3 种状态:

== 映射文件中的全部的inser,updage,delete 相关的口舌都会消除缓存

2) 在web.xml中配置 (一是布置spring, 是配置基本控制器)

if

typeAliases : 用于配置项目别称

index 钦定1个名字,用于表示在迭代经过中,每一遍迭代到的任务,

<dataSource type="POOLED">
                          <property name="driver" value="${driver}"/>
                          <property name="url" value="${url}"/>
                          <property name="username" value="${username}"/>
                          <property name="password" value="${password}"/>
</dataSource>

properties : 用于配置属性消息

岂不过要保管这些表在漫天系统中唯有单表操作,而且和该表有关的全方位操作必须一切在一个namespace下。

<select id="get_login_user" parameterType="java.util.HashMap" resultType="userInfo" >
        select userName,password as pwd,note  from userInfo where userName=#{userName} and password= #{password}
</select>

//上面的查询,对于 password 多了一个as pwd,结果发现查询出来的目标对象的password是null 
//只要有一个属性和类中的属性对上了,它就创建类对象

flushCache暗许为true,表示其他时候语句被调用,都会促成地点缓存和二级缓存被清空。

3) Action的配置

1) 输入参数的档次 parameterType

借使传入的是单参数且参数类型是二个List的时候,collection属性值为list

3 mybatis的配备详解

3) 关于二级缓存的表明

二 、dao层的付出(使用mapper代理的章程)

对此缓存数据更新机制,当某贰个功用域(顶尖缓存Session/二级缓存Namespaces)的展开了
C/U/D 操作后,暗中同意该意义域下全数 select 中的缓存将被clear。

== 缓存暗中认可会存款和储蓄10贰17个目的

<mapper namespace="cat.mapper.UserMapper" >
//mybatis ehcache缓存配置 -->
//以下两个<cache>标签二选一,第一个可以输出日志,第二个不输出日志
    <cache type="org.mybatis.caches.ehcache.LoggingEhcache" />
    <cache type="org.mybatis.caches.ehcache.EhcacheCache" /> 

    ....
</mapper>

3) where 主要用来简化where语句中的条件判断

separator 每便实行迭代里边以怎么着符号作为分隔符,

— mapper接口中方法的参数类型和再次来到值类型也要和照耀文件中的 
parameterType, resultType 一致

MyBatis的动态SQL是根据OGNL表明式的,它能够补助大家有益的在SQL语句中完成有个别逻辑。

mybatis-ehcache-1.0.3.jar

(2)当为insert、update、delete语句时:

2.pojo

settings : 用于配置mybatis的周转形式

//相当于IUserDao
public interface UserMapper {
                            UserInfo getuser_byid(int id);
                            int add_user(UserInfo user);  //其实这里用int 型的返回值也行,能返回来
                        }

 

2) 工程组织

选拔mapper代理的办法
,只须要mapper接口(也正是dao接口)即可,不用完完成类了。

或是会有成都百货上千人不掌握那里,二级缓存带来的裨益远远比不上她所隐藏的加害。

柒 、mybatis 中的二级缓存

缓存是以namespace为单位的,不一致namespace下的操作互不影响。

useCache属性在这场所下没有。

@Controller
public class UserAction {

                        @Resource
                        private UserMapper mapper;

                        @RequestMapping("/get_user")
                        public ModelAndView getUser(){
                            ModelAndView mv=new ModelAndView();
                            UserInfo user=mapper.getuser_byid(2);
                            System.out.println(user);
                            mv.addObject("user", user);
                            mv.setViewName("show_user");
                            return mv;
                        }
                    }
<mapper namespace="cat.mapper.UserMapper">

在意:close 在什么样截止?

choose(when,otherwise)

log4j.appender.Console.layout=org.apache.log4j.PatternLayout

更惊险的动静是在XXXMapper.xml做了insert,update,delete操作时,会造成UserMapper.xml中的各个操作充满未知微风险。有关那样单表的操作或者不常见。然而你或者想到了一种普遍的情形。

<properties resource="org/mybatis/example/config.properties">
            <property name="username" value="dev_user"/>
            <property name="password" value="F2Fa3!33TYyg"/>
</properties>

率先不管多表操作写到这几个namespace下,都会存在有个别表不在这些namespace下的境况。

就算您刚刚修改了那个用户的剧中人物,上面那么些查询利用缓存的时候结果就是错的。这点应该很简单精通。以笔者之见,就以MyBatis近期的缓存格局来看是无解的。多表操作根本无法缓存。就算您让她们都施用同2个namespace(通过<cache-ref>)来制止脏数据,那就错过了缓存的意义。看到那里,实际上正是,二级缓存不能够用。整篇小说介绍这么多也没怎么用了。

不畏把if 那个例子中的  where 1=1 换到了 <where>

public interface UserMapper {
                        UserInfo getuser_byid(int id);
                        int add_user(UserInfo user);  //其实这里用int 型的返回值也行,能返回来
                        UserInfo get_login_user(HashMap map);
                        List<UserInfo>get_userlist(UserInfo user);
                    }
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"

xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">

<context:property-placeholder location="classpath:mydbconfig.properties" />

//数据源
        <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
              destroy-method="close">
              <property name="driverClassName" value="${db.driver}" />
              <property name="url" value="${db.url}" />
              <property name="username" value="${db.username}" />
              <property name="password" value="${db.password}" />
              <property name="initialSize" value="10" />
              <property name="maxActive" value="500" />
              <property name="maxIdle" value="2" />
              <property name="minIdle" value="3" />
         </bean>


//配置sqlSessionFacory
         <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
              <property name="dataSource" ref="dataSource" />
              <property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml" /><!-- 
              这里要指定mybatis合局配置文件 -->
         </bean>

         <bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">
              <property name="mapperInterface" value="cat.mapper.UserMapper" />
              <property name="sqlSessionFactory" ref="sqlSessionFactory" />
         </bean>


</beans>

set

5) 配置映射文件  UserMapper.xml //和过去一致,没有任何不一样

== 缓存会利用Last Recently Used(LRU,近年来最少使用的)算法来收回

log4j.logger.org.apache=INFO

<typeAliases>
//单个别名的定义
            <typeAlias type="cat.beans.UserInfo" alias="userInfo" />

//批量别名的定义,会把beans包下的所有的类名定义成别名,首字母大小写均可 -->
           <package name="cat.beans" />
</typeAliases>

3) 配置spring的主配置文件 applicationContext.xml

一、mybatis 中 log4j 的配置

中间的特性就能够在总体配置文件中采用,使用可替换的属性来促成动态配置。比如:

十一、mybatis + spring mvc

log4j.logger.java.sql.Statement=DEBUG

//例子 使用 hashmap 做为 parameterType
<select id="get_login_user" parameterType="java.util.HashMap" resultType="userInfo" >
        select * from userInfo where userName=#{userName} and password= #{password}
</select>

        static void test2() throws IOException{
                            InputStream in= Resources.getResourceAsStream("SqlMapConfig.xml");
                            SqlSessionFactory factor=new SqlSessionFactoryBuilder().build(in);
                            SqlSession session =factor.openSession();
                            UserMapper userMapper=session.getMapper(UserMapper.class);
                            HashMap map=new HashMap();
                            map.put("userName", "高洪喜");
                            map.put("password", "admin");
                            UserInfo user=userMapper.get_login_user(map);
                            System.out.println(user);
                            session.close();
                        }

 

1) 只幸而【唯有单表操作】的表上使用缓存

open  该语句以什么起首,

7 mybatis 中的二级缓存

7) mappers 用于引入sql配置文件的

3)使用

static void test() throws IOException{
                                InputStream in= Resources.getResourceAsStream("SqlMapConfig.xml");
                                SqlSessionFactory factor=new SqlSessionFactoryBuilder().build(in);
                                SqlSession session =factor.openSession();

                                //由mybatsi生成一个UserMapper的实现类的一个对象
                                UserMapper userMapper=session.getMapper(UserMapper.class);
                                UserInfo user=userMapper.getuser_byid(2);        
                                System.out.println(user);

                                session.close();
                            }


                        //附注: 如果方法的参数,有多个, parameterType 要怎么写 ?可以使用pojo类型,或 使用 map

mybatis 就能够自动生成mapper接口完成类的代理对象

7)测试

三 、mybatis的配置详解

⑨ 、mybatis 中二级缓存使用时只顾的难题

#Console

4) typeHandlers:用于配置项目处理器

上边的音讯来源
MyBatis官方文书档案。固然有必不可少,那么就须求人工修改配置,修改结果类似下边:

flushCache私下认可为false,表示别的时候语句被调用,都不会去清空本地缓存和二级缓存。

<where>
      <if test="id != 0">
          and id = #{id}
      </if>
      <if test="userName != null and userName !='' " >
          and userName = #{userName}
      </if>
      <if test="password != null and password!=''">
          and password = #{password}
     </if>
< /where>
static void test4() throws IOException{
                InputStream in= Resources.getResourceAsStream("SqlMapConfig.xml");
                SqlSessionFactory factor=new SqlSessionFactoryBuilder().build(in);
                SqlSession session =factor.openSession();

                UserMapper userMapper=session.getMapper(UserMapper.class);

                UserInfo user=userMapper.getuser_byid(2); 
                UserInfo user2=userMapper.getuser_byid(2);  //输出一条查询语句,证明用了一级缓存

                session.close();
            }

log4j.logger.java.sql.Connection=DEBUG

1) 开启二级缓存

不管是写到RoleMapper.xml依然UserRoleMapper.xml,可能是1个独自的XxxMapper.xml中。假诺运用了二级缓存,都会导致地方那几个查询结果恐怕不科学。

// 它来自mybatis-spring-1.2.2.jar -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">  //由于是批量,就不用加id属性了
      <property name="basePackage" value="cat.dao" />
      <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory" />
</bean>

//使用了这种方式以后,mybatis 主配置文件 SqlMapConfig 中的下面就可以不要了
<mappers>
      <package name="cat.mapper" />    
</mappers>

== 映射文件中的全体的select 语句都会被缓存

最重视的,正是把 SessionFactory 的创始交给Spring

typeHandlers:用于配置项目处理器

— mapper接口中的方法名,要和照耀文件中的sql的id相同 (statement 的 id)

<cache 
      eviction="FIFO"  //回收策略为先进先出
      flushInterval="60000"  //自动刷新时间60s 
      size="512"  //最多缓存512个引用对象
      readOnly="true"  //只读 
      // type="org.mybatis.caches.ehcache.LoggingEhcache" 可以用type属性指定缓存提供者
/>

6) environments

//例如 <mapper resource="mapper/UserMapper.xml" />
//   有几下几种方式

// 1.相对于类路径的引入方式
<mappers>
        <mapper resource="org/mybatis/builder/AuthorMapper.xml"/>
        <mapper resource="org/mybatis/builder/BlogMapper.xml"/>
</mappers>

//2.使用全路径引入
<mappers>
        <mapper url="file:///var/mappers/AuthorMapper.xml"/>
        <mapper url="file:///var/mappers/BlogMapper.xml"/>
</mappers>

//3.使用类名包等
<mappers>
        <mapper class="org.mybatis.builder.AuthorMapper"/>
        <mapper class="cat.mapper.UserMapper"/>
</mappers>
//命名规范 类名必须是 UserMapper 这样的,而且映射文件要和接口文件放在同一个文件夹下

//3.使用mapper方式批量加载
<mappers>
        <package  name="cat.mapper" />  批量加载 cat.mapper包下的所有mapper
</mappers>

plugins :配置拦截器

1) 导包

1)if

6 mybatis 中的拔尖缓存

若是在这个地方,属性多于一个以来,MyBatis 遵照如下的相继加载它们:

Ehcache是一种常见接纳的开源Java分布式缓存。重要面向通用缓存,Java
EE和轻量级容器。它具有内部存款和储蓄器和磁盘存储,缓存加载器,缓存增加,缓存卓殊处理程序,二个gzip缓存servlet过滤器,扶助REST和SOAP
api等特色。

<mapper namespace="cat.mapper.UserMapper" >
            <cache />  //这样就可以开启
             ....
</mapper>

多表操作必然无法利用缓存 为啥不能够?

2)

这么些是外部化的, 可代表的性质, 这一个属性也能够陈设在出色的 Java
属性配置文件中, 可能通过 properties 成分的子成分来传递。例如:

log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] –
%m%n
       

二级缓存和一流缓存的建制一样,默许也是使用 PerpetualCache
(其实便是mybatis 中Cache
那么些的接口的落实类)它也是用hashmap进行仓库储存,它和超级缓存的差别是它的意义域 Mapper ( namespace ) 正是同三个 namespace
共享一份缓存,能够自定义存款和储蓄源 比如Ehcache 等。

1.不难类型

MyBatis中用来落实动态SQL的元素首要有:

mybatis 中的超级缓存是在七个Session域内,
session未关门的时候实施查询会根据sql的key进行缓存,假诺对缓存的数目开始展览了增加和删除改等操作,会免去缓存

<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"  
         "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
      <typeAliases>
        <package name="cat.beans" />
      </typeAliases>

      <mappers>
        <package name="cat.mapper" />    
      </mappers>
</configuration>   

在 config 文件夹下,新建 log4j.properties ,其内容如下:  即可

一言九鼎用在构建in条件中,它能够在SQL语句中展开迭代2个会见。foreach元素的属性主要有item,index,collection,open,separator,close。

为什么制止使用二级缓存 ?

log4j.rootLogger=DEBUG, Console

<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ehcache.xsd" updateCheck="false">
    <diskStore path="java.io.tmpdir/mybatis/g" />  //如果往磁盘上放,默认放在哪个目录

    <!-- DefaultCache setting. -->
    <defaultCache
                 maxEntriesLocalHeap="10000"
                 eternal="false"
                 timeToIdleSeconds="300"
                 timeToLiveSeconds="600"
                 overflowToDisk="true"
                 maxEntriesLocalDisk="100000"
                 memoryStoreEvictionPolicy="LFU"/>

    <!-- security entity-->
                 <cache
                        name="entityCache"
                        maxEntriesLocalHeap="10000"
                        eternal="true"
                        overflowToDisk="true"
                        maxEntriesLocalDisk="1000000" />
                 </ehcache>

ehcache-core-2.6.8.jar

10 mybatis 和 spring 整合

以此事例中的 username 和 password 将会由 properties
元素中安装的值来替换。 driver 和 url 属性将会从包罗进来的
config.properties 文件中的值来替换。那里提供许多配置的选项。

譬如在UserMapper.xml中有多数针对性user表的操作。不过在二个XXXMapper.xml中,还有针对性user单表的操作。那会导致user在五个命名空间下的数目不相同等。假诺在UserMapper.xml中做了刷新缓存的操作,在XXXMapper.xml中缓存依旧有效,若是有针对性user的单表查询,使用缓存的结果也许会不正确。

2)代码

9 mybatis 中二级缓存使用时只顾的难题

像上边这么些查询,你会写到那些xml中呢??

4) catch 标签的常用属性

6) 接口 UserMapper.java  //和千古同一

此地的 parameterType 能够传的档次有几以下两种

其余景况就会有不少风险了。

1) properties

在 properties 成分体内钦点的特性首先被读取。从类路径下财富或 properties
元素的 url 属性中加载的属性第2被读取,它会
覆盖已经存在的一点一滴相同的性质。作为艺术参数字传送递的习性最终被读取,
它也会覆盖任一已经存在的完全一致的 属性,这么些属性只怕是从 properties
成分体内和财富/url 属性中加载的。因而,
最高优先级的质量是那贰个作为艺术参数的, 然后是能源/url 属性, 最终是
properties 成分中钦命的习性。

出口参数的品种有三种  一仩是 resultType  多少个是  resultMap

Ehcache最初是由格雷戈Luck于二〇〇三年始发开发。二〇〇八年,该项目被Terracotta购买。软件依旧是开源,但部分新的基本点功效。(例如,急忙可重启性之间的一致性的)只可以在购买销售产品中应用,例如Enterprise
EHCache and BigMemory。,
维基媒体Foundationannounced近日接纳的正是Ehcache技术。

诸如三个表:role和user_role,借使本人想询问出有些用户的一切角色role,就自然会涉嫌到多表的操作。

8 mybatis 和 缓存框架的组成

④ 、输入输出映射对应的项目 ( parameterType 和 resultType )

mappers : 配置sql映射文件

== 缓存会依据钦定的年月距离来刷新

<select id="save" parameterType="XXXXXEO" statementType="CALLABLE" flushCache="true" useCache="false">
                                ……
</select>

2) settings 用于配置mybatis的周转格局

1 mybatis 中 log4j的配置

where

正文主要介绍 Mybatis(一)之后剩下的内容:

useCache默许为true,表示会将本条语句的结果开始展览二级缓存。

叠加表明 : mybatis 提供了Cache 这样八个接口,它自个儿的暗中认可达成类是
PerpetualCache

// 声明一个sql片段 在这个片断中尽量不要写where 
<sql id="query_user_condation">
     <if test="id != 0">
         and id = #{id}
     </if>
     <if test="userName != null and userName !='' " >
         and userName = #{userName}
     </if>
     <if test="password != null and password!=''">
         and password = #{password}
     </if>
</sql>

//引用sql片段
<select id="get_userlist" parameterType="userInfo"  resultType="userInfo" >
        select * from userInfo
        <where>
               <include refid="query_user_condation" /> 
                        and note ='这是note'
        </where> 
</select>

mybatis 私下认可援救超级缓存。

八 、mybatis 和 缓存框架的结合

<settings>
         <setting name="cacheEnabled" value="true" />
         <setting name="lazyLoadingEnabled" value="true" />
         <setting name="multipleResultSetsEnabled" value="true" />
         <setting name="useColumnLabel" value="true" />
         <setting name="useGeneratedKeys" value="false" />
         <setting name="autoMappingBehavior" value="PARTIAL" />
         <setting name="defaultExecutorType" value="SIMPLE" />
         <setting name="defaultStatementTimeout" value="25" />
         <setting name="safeRowBoundsEnabled" value="false" />
         <setting name="mapUnderscoreToCamelCase" value="false" />
         <setting name="localCacheScope" value="SESSION" />
         <setting name="jdbcTypeForNull" value="OTHER" />
         <setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString" />
</settings>

4) 配置 mybatis  的主配置文件 SqlMapConfig.xml

假若传入的是单参数且参数类型是叁个array
数组的时候,collection的属性值为array

附:

ClassPathXmlApplicationContext context =new ClassPathXmlApplicationContext("classpath:spring/applicationContext.xml");
                    UserMapper userMapper=(UserMapper)context.getBean("userMapper");

                    UserInfo user=userMapper.getuser_byid(2);
                    System.out.println(user);

4.包装过的pojo

5)  MyBatis中有flushCache、useCache那四个布局属性,分为下边两种状态

 说明,关于spring中加载mapper

mybatis
中通过它做到java类型和jdbc类型的转移,日常mybatis提供的都够用,不用自定义。

5) plugins  略

2)输出参数的品类  resultType

public abstract interface org.apache.ibatis.cache.Cache { 
                                      public abstract java.lang.String getId();
                                      public abstract void putObject(java.lang.Object arg0, java.lang.Object arg1);
                                      public abstract java.lang.Object getObject(java.lang.Object arg0);
                                      public abstract java.lang.Object removeObject(java.lang.Object arg0);
                                      public abstract void clear();
                                      public abstract int getSize();
                                      public abstract java.util.concurrent.locks.ReadWriteLock getReadWriteLock();
                                }

1) 参加springmvc的安顿文件

mybatis 和 eache 的整合

代码实例:二级缓存测试

五、mybatis 动态 sql

<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:aop="http://www.springframework.org/schema/aop"

       xsi:schemaLocation="http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd 
       http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
       http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd">


<context:component-scan base-package="cat.controller" /> 
    <mvc:annotation-driven />
       <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" > 
             <property name="prefix" value="/" />
             <property name="suffix" value=".jsp" />
       </bean>

             <mvc:resources location="/resource/" mapping="resources/**"></mvc:resources>       
</beans>
网站地图xml地图