小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

Java學(xué)習(xí)-Mybatis

 怡紅公子0526 2021-04-24

Mybatis

Maven依賴(lài):

<!-- https:///artifact/org.mybatis/mybatis -->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.5.6</version>
</dependency>

持久層

持久化就是將持久狀態(tài)和瞬時(shí)狀態(tài)轉(zhuǎn)化的過(guò)程

數(shù)據(jù)庫(kù)(JDBC),IO文件持久化

1、第一個(gè)Mybatis程序

1.1、基礎(chǔ)配置

  • 編寫(xiě)Mybatis的核心配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-////DTD Config 3.0//EN"
        "http:///dtd/mybatis-3-config.dtd">
<!--核心配置文件-->
<configuration>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://;ocalhost:3306/smbms?serverTimezone=UTC&userSSL=true&useUnicode=true&characterEncoding=UTF-8"/>
                <property name="username" value="root"/>
                <property name="password" value="handhand"/>
            </dataSource>
        </environment>
    </environments>
</configuration>
  • 編寫(xiě)Mybatis工具類(lèi)
public class MybatisUtils {
    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();
        }
    }

    //既然有了 SqlSessionFactory,顧名思義,我們可以從中獲得 SqlSession 的實(shí)例。SqlSession 提供了在數(shù)據(jù)庫(kù)執(zhí)行 SQL 命令所需的所有方法。你可以通過(guò) SqlSession 實(shí)例來(lái)直接執(zhí)行已映射的 SQL 語(yǔ)句。例如:
    public static SqlSession getSqlSession() {
        return sqlSessionFactory.openSession();
    }
}

1.2、編寫(xiě)代碼

  • 實(shí)體類(lèi)
public class User {
    private int id;
    private String name;
    private String password;

    public User(int id, String name, String password) {
        this.id = id;
        this.name = name;
        this.password = password;
    }

    public User() {
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", password='" + password + '\'' +
                '}';
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}
  • Dao接口
public interface UserDao {
    public List<User> getUserList();
}
  • 接口實(shí)現(xiàn)類(lèi),由原來(lái)的UserDaoImpl轉(zhuǎn)變?yōu)镸apper配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-////DTD Mapper 3.0//EN"
        "http:///dtd/mybatis-3-mapper.dtd">
<!--命名空間,綁定一個(gè)Dao接口-->
<mapper namespace="com.darker.dao.UserDao">
    <select id="getUserList" resultType="com.darker.pojo.User" >
        select * from smbms.user
    </select>

</mapper>

1.3測(cè)試

注意點(diǎn):org.apache.ibatis.binding.BindingException: Type interface com.darker.dao.UserDao is not known to the MapperRegistry.

<!--每一個(gè)Mapper.xml都需要在Mybatis的核心配置文件中注冊(cè)-->
    <mappers>
        <mapper resource="com/darker/dao/UserMapper.xml"/>
    </mappers>
  • 測(cè)試代碼
public class UserDaoTest {
    @Test
    public void test() {
        //獲得session對(duì)象
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        //方式一:getMapper執(zhí)行sql
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        List<User> userList = mapper.getUserList();
        for (User user : userList) {
            System.out.println(user);
        }
        //關(guān)閉SqlSession
        sqlSession.close();
    }
}

2、CRUD

1、namespace

namespace中的報(bào)名要喝Da/mapper接口的包名一致

2、select

選擇,查詢(xún)語(yǔ)句:

  • id:對(duì)應(yīng)namespace接口中的方法名

  • resultType:Sql語(yǔ)句執(zhí)行的返回值

  • parameterType:參數(shù)類(lèi)型

    <select id="getUserList" resultType="com.darker.pojo.User">
        select *
        from user
    </select>
    

3、insert

<insert id="addUser" parameterType="com.darker.pojo.User">
    insert into user
    values (#{id}, #{name}, #{password});
</insert>

4、update

<update id="updateUser" parameterType="com.darker.pojo.User">
    update user
    set name     = #{name},
        password = #{password}
    where id = #{id};
</update>

5、delete

<delete id="deleteUser" parameterType="int">
    delete
    from user
    where id =
          #{id}
</delete>

6、注意點(diǎn)

增刪改需要sqlSession.commit();提交事物。

7、Map

假設(shè)實(shí)體類(lèi)中的字段過(guò)多,考慮使用Map。

@Test
public void addUser2() {
    SqlSession sqlSession = MybatisUtils.getSqlSession();

    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    HashMap<String, Object> hashMap = new HashMap<String, Object>();
    hashMap.put("userid",5);
    hashMap.put("username","safasdf");
    hashMap.put("userpassword","2341212");
    mapper.addUser2(hashMap);
    sqlSession.close();
}
<insert id="addUser2" parameterType="map">
    insert into user
    values (#{userid}, #{username}, #{userpassword});
</insert>
//新增用戶(hù)
int addUser2(HashMap<String, Object> map);

8、模糊查詢(xún)

在傳參是使用%%

List<User> userList = mapper.getUserLikeList("%測(cè)試%");

SQL中寫(xiě)

select * from user where name like "%"#{value}"%"

3、配置解析

1、核心配置文件

  • mybatis-config.xml
configuration(配置)
    properties(屬性)
    settings(設(shè)置)
    typeAliases(類(lèi)型別名)
    typeHandlers(類(lèi)型處理器)
    objectFactory(對(duì)象工廠)
    plugins(插件)
    environments(環(huán)境配置)
        environment(環(huán)境變量)
            transactionManager(事務(wù)管理器)
            dataSource(數(shù)據(jù)源)
    databaseIdProvider(數(shù)據(jù)庫(kù)廠商標(biāo)識(shí))
    mappers(映射器)

1.1、環(huán)境配置(environments)

MyBatis 可以配置成適應(yīng)多種環(huán)境,但每個(gè) SqlSessionFactory 實(shí)例只能選擇一種環(huán)境。

Mybatis默認(rèn)的事物管理器是JDBC,連接池:POOLED;

1.2、屬性(properties)

可以通過(guò)properties屬性來(lái)實(shí)現(xiàn)引用配置文件【db.properties】

<properties resource="db.properties">
    <property name="username" value="root"/>
    <property name="password" value="handhand"/>
</properties>
  • 可以引入外部配置文件

  • 可以在其中增加屬性配置

  • 如果有重復(fù)的字段,優(yōu)先使用外部配置文件

1.3、類(lèi)型別名(typeAliases)

類(lèi)型別名可為 Java 類(lèi)型設(shè)置一個(gè)縮寫(xiě)名字。 它僅用于 XML 配置,意在降低冗余的全限定類(lèi)名書(shū)寫(xiě)

  • 給實(shí)體類(lèi)起別名
<typeAliases>
    <typeAlias type="com.darker.pojo.User" alias="User"/>
</typeAliases>
  • 掃描實(shí)體類(lèi)的包,他的默認(rèn)別名就為這個(gè)類(lèi)名的首字母小寫(xiě)
<typeAliases>
    <package name="com.darker.pojo">
</typeAliases>
@Alias("helloUser")

1.4、設(shè)置(settings)

設(shè)置名 描述 有效值 默認(rèn)值
cacheEnabled 全局性地開(kāi)啟或關(guān)閉所有映射器配置文件中已配置的任何緩存。 true | false true
lazyLoadingEnabled 延遲加載的全局開(kāi)關(guān)。當(dāng)開(kāi)啟時(shí),所有關(guān)聯(lián)對(duì)象都會(huì)延遲加載。 特定關(guān)聯(lián)關(guān)系中可通過(guò)設(shè)置 fetchType 屬性來(lái)覆蓋該項(xiàng)的開(kāi)關(guān)狀態(tài)。 true | false false
mapUnderscoreToCamelCase 是否開(kāi)啟駝峰命名自動(dòng)映射,即從經(jīng)典數(shù)據(jù)庫(kù)列名 A_COLUMN 映射到經(jīng)典 Java 屬性名 aColumn。 true | false False
logImpl 指定 MyBatis 所用日志的具體實(shí)現(xiàn),未指定時(shí)將自動(dòng)查找。 SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING 未設(shè)置

1.5、映射器(mappers)

注冊(cè)綁定我們的mapper文件

<!--每一個(gè)Mapper.xml都需要在Mybatis的核心配置文件中注冊(cè)-->
    <mappers>
        <mapper resource="mapper/UserMapper.xml"/>
    </mappers>

1.6、生命周期和作用域

SqlSessionFactoryBuilder

  • 一旦創(chuàng)建了 SqlSessionFactory,就不再需要它了。
  • 局部變量

SqlSessionFactory

  • SqlSessionFactory 一旦被創(chuàng)建就應(yīng)該在應(yīng)用的運(yùn)行期間一直存在,沒(méi)有任何理由丟棄它或重新創(chuàng)建另一個(gè)實(shí)例。
  • SqlSessionFactory 的最佳作用域是應(yīng)用作用域
  • 最簡(jiǎn)單的就是使用單例模式或者靜態(tài)單例模式。

SqlSession

  • SqlSession 的實(shí)例不是線程安全的,因此是不能被共享的,所以它的最佳的作用域是請(qǐng)求或方法作用域。
  • 用完后關(guān)閉

4、解決屬性名和字段名不一致的問(wèn)題

  • 實(shí)體

    private int id;
    private String name;
    private String pwd;//與數(shù)據(jù)庫(kù)不對(duì)應(yīng)
    

    數(shù)據(jù)庫(kù)字段

    id
    name
    password 
    

解決方法

  • 起別名
<select id="getUserById" resultType="com.darker.pojo.User" parameterType="int">
    select id,name,password as pwd
    from user
    where id = #{id}
</select>
  • resultMap

結(jié)果集映射

<resultMap id="UserMap" type="com.darker.pojo.User">
    <!--column數(shù)據(jù)庫(kù)中的字段,property實(shí)體類(lèi)中的屬性-->
    <result column="id" property="id"/>
    <result column="name" property="name"/>
    <result column="password" property="pwd"/>
</resultMap>
<select id="getUserById" resultMap="UserMap" parameterType="int">
    select *
    from user
    where id = #{id}
</select>

5、日志

5.1日志工廠

Mybatis提供的日志工廠

image-20210305102702889

  • SLF4J
  • LOG4J
  • LOG4J2
  • JDK_LOGGING
  • COMMONS_LOGGING
  • STDOUT_LOGGING
  • NO_LOGGING

STDOUT_LOGGING標(biāo)準(zhǔn)日志輸出

Opening JDBC Connection
Created connection 1073763441.
Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@40005471]
==>  Preparing: select * from user where id = ?
==> Parameters: 4(Integer)
<==    Columns: id, name, password
<==        Row: 4, q3142q測(cè)試, 23131
<==      Total: 1
User{id=4, name='q3142q測(cè)試', pwd='23131'}
Resetting autocommit to true on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@40005471]
Closing JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@40005471]
Returned connection 1073763441 to pool.

5.2、Log4j

log4j.rootLogger=DEBUG,console,file

#控制臺(tái)輸出相關(guān)配置
log4j.appender.console = org.apache.log4j.ConsoleAppender
log4j.appender.console.Target = System.out
log4j.appender.console.Threshold = DEBUG
log4j.appender.console.layout = org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern = [%c] -%m%n

#文件輸出相關(guān)的配置
log4j.appender.file = org.apache.log4j.RollingFileAppender
log4j.appender.file.File = ./log/darker.log
log4j.appender.file.MaxFileSize = 10MB
log4j.appender.file.Threshold = DEBUG
log4j.appender.file.layout = org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern = [%p][%d{yyyy-MM-dd HH:mm:ss}][%c]%m%n

#日志輸出級(jí)別
log4j.logger.org.mybatis=DEBUG
log4j.logger.java.sql=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.ResultSet=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

簡(jiǎn)單使用

1.導(dǎo)包

import org.apache.log4j.Logger;

2.日志對(duì)象,參數(shù)為當(dāng)前類(lèi)的class

Logger logger = Logger.getLogger(UserDaoTest.class);

3.使用

logger.info("info:進(jìn)入testLog4j");
logger.debug("debug:進(jìn)入testLog4j");
logger.error("error:進(jìn)入testLog4j");

6、分頁(yè)

減少數(shù)據(jù)的處理量

使用Limit分頁(yè)

select * from user limit startIndex,pageSize

使用RowBounds

SqlSession sqlSession = MybatisUtils.getSqlSession();
//offset,limit.從查詢(xún)的第2行開(kāi)始數(shù),往后面四行數(shù)據(jù)
RowBounds rowBounds = new RowBounds(1, 4);

List<User> userLise = sqlSession.selectList("com.darker.dao.UserMapper.getUserByRowBounds", null, rowBounds);

for (User user : userLise) {
    System.out.println(user.toString());
}
sqlSession.close();

7.注解開(kāi)發(fā)

在接口上實(shí)現(xiàn)

@Select("select * from user")
List<User> getUserListAnn();

配置文件中綁定接口

<mapper class="com.darker.dao.UserMapper"/>

方法中如果有多個(gè)參數(shù),一定要使用

@Param("id")
  • 基本類(lèi)型的參數(shù)或者String類(lèi)型,需要加上
  • 引用類(lèi)型不需要加上
  • 如果只有一個(gè)基本來(lái)興,可以忽略

8、多對(duì)一的處理

需求:查詢(xún)學(xué)生對(duì)應(yīng)的老師信息

  • 學(xué)生實(shí)體類(lèi)
private long id;
private String name;
//關(guān)聯(lián)老師
private Teacher teacher;
  • 老師實(shí)體類(lèi)
private long id;
private String name;

按照查詢(xún)嵌套處理

<select id="getStdentAllInfo" resultMap="StudentTeacher">
    select s.id, s.name, s.tid
    from student s
</select>

<resultMap id="StudentTeacher" type="Student">
    <result property="id" column="id"/>
    <result property="name" column="name"/>
    <!-- 復(fù)雜的屬性,需要單獨(dú)處理
    association:對(duì)象
    collection:集合
    -->
    <association property="teacher" column="tid" javaType="Teacher" select="getTeacher"/>
</resultMap>
<select id="getTeacher" resultType="Teacher">
    select *
    from teacher where id = #{id}
</select>

按照結(jié)果嵌套處理

<select id="getStdentAllInfo2" resultMap="StudentTeacher2">
    select s.id sid, s.name sname, t.name tname
    from student s
             left join teacher t on s.tid = t.id;
</select>
<resultMap id="StudentTeacher2" type="Student">
    <result  property="id" column="sid"/>
    <result  property="name" column="sname"/>
    <association  property="teacher" javaType="Teacher">
        <result  property="name" column="tname"/>
    </association>
</resultMap>

9、一對(duì)多的處理

需求:查詢(xún)老師下的學(xué)生信息

  • 老師實(shí)體類(lèi)
private long id;
private String name;
private List<Student> students;
  • 學(xué)生實(shí)體類(lèi)
private long id;
private String name;
private int tid;

按照查詢(xún)嵌套處理

<select id="getTeacherAllInfo2" resultMap="TeacherSdudent2">
    select t.id tid, t.name tname
    from  teacher t
</select>
<resultMap id="TeacherSdudent2" type="Teacher">
    <result property="id" column="tid"/>
    <result property="name" column="tname"/>
    <collection property="students" column="tid" javaType="ArrayList" ofType="Student" select="getStudent"/>
</resultMap>
<select id="getStudent"  resultType="Student">
    select * from student where tid = #{tid}
</select>

按照結(jié)果嵌套處理

<!--案結(jié)果嵌套查詢(xún)-->
    <select id="getTeacherAllInfo" resultMap="TeacherSdudent">
        select t.id tid, t.name tname, s.id sid, s.name sname
        from student s,
             teacher t
        where s.tid = t.id
    </select>
    <resultMap id="TeacherSdudent" type="Teacher">
        <result property="id" column="tid"/>
        <result property="name" column="tname"/>
<!--  javaType:指定屬性的類(lèi)型
     集合中的泛型信息,用ofType獲取-->
        <collection property="students" ofType="Student">
            <result property="id" column="sid"/>
            <result property="name" column="sname"/>
            <result property="tid" column="tid"/>
        </collection>
    </resultMap>

小結(jié)

1.關(guān)聯(lián) association【多對(duì)一】

2.集合 collection 【一對(duì)多】

3.javaType 和 ofType

?javaType 用來(lái)指定實(shí)體類(lèi)中的屬性類(lèi)型

ofType用來(lái)指定映射到List或者集合中的POJO類(lèi)型,泛型中的約束類(lèi)型

10、動(dòng)態(tài)SQL

在 MyBatis 之前的版本中,需要花時(shí)間了解大量的元素。借助功能強(qiáng)大的基于 OGNL 的表達(dá)式,MyBatis 3 替換了之前的大部分元素,大大精簡(jiǎn)了元素種類(lèi),現(xiàn)在要學(xué)習(xí)的元素種類(lèi)比原來(lái)的一半還要少。

  • if
  • choose (when, otherwise)
  • trim (where, set)
  • foreach

if

if標(biāo)簽中tes屬性必輸

<select id="queryBlogIF" parameterType="map" resultType="Blog">
    select * from blog where 1=1
    <if test="title != null">
        and title like #{title}
    </if>
    <if test="author != null">
        and author like #{author}
    </if>
</select>

choose (when, otherwise)

有時(shí)候,我們不想使用所有的條件,而只是想從多個(gè)條件中選擇一個(gè)使用。針對(duì)這種情況,MyBatis 提供了 choose 元素,它有點(diǎn)像 Java 中的 switch 語(yǔ)句。

<select id="queryBlogChoose" parameterType="map" resultType="Blog">
    select * from blog
    <where>
        <choose>
            <when test="title != null">
                and title like #{title}
            </when>
            <when test="author != null">
                and author like #{author}
            </when>
            <otherwise>
                1=1
            </otherwise>
        </choose>
    </where>
</select>

trim (where, set)

where 元素只會(huì)在子元素返回任何內(nèi)容的情況下才插入 “WHERE” 子句。而且,若子句的開(kāi)頭為 “AND” 或 “OR”,where 元素也會(huì)將它們?nèi)コ?/p>

用于動(dòng)態(tài)更新語(yǔ)句的類(lèi)似解決方案叫做 setset 元素可以用于動(dòng)態(tài)包含需要更新的列,忽略其它不更新的列。

<update id="updateBlog" parameterType="map">
    update blog
    <set>
        <if test="title !=null">
            title = #{title},
        </if>
        <if test="author !=null">
            author = #{author},
        </if>
    </set>
    where id = #{id}
</update>

foreach

動(dòng)態(tài) SQL 的另一個(gè)常見(jiàn)使用場(chǎng)景是對(duì)集合進(jìn)行遍歷(尤其是在構(gòu)建 IN 條件語(yǔ)句的時(shí)候)。

foreach 元素的功能非常強(qiáng)大,它允許你指定一個(gè)集合,聲明可以在元素體內(nèi)使用的集合項(xiàng)(item)和索引(index)變量。它也允許你指定開(kāi)頭與結(jié)尾的字符串以及集合項(xiàng)迭代之間的分隔符。這個(gè)元素也不會(huì)錯(cuò)誤地添加多余的分隔符,看它多智能!

提示 你可以將任何可迭代對(duì)象(如 List、Set 等)、Map 對(duì)象或者數(shù)組對(duì)象作為集合參數(shù)傳遞給 foreach。當(dāng)使用可迭代對(duì)象或者數(shù)組時(shí),index 是當(dāng)前迭代的序號(hào),item 的值是本次迭代獲取到的元素。當(dāng)使用 Map 對(duì)象(或者 Map.Entry 對(duì)象的集合)時(shí),index 是鍵,item 是值。

image-20210307152224232

<select id="queryBlogForeach" parameterType="map" resultType="Blog">
    select * from blog
    <where>
        <foreach item="id" collection="ids" open="and (" separator="or" close=")">
           id = #{id}
        </foreach>
    </where>
</select>

sql拼接結(jié)果:select * from blog WHERE ( id = ? or id = ? )

SQL片段

將公共的部分抽取出來(lái),方便復(fù)用

使用sql標(biāo)簽抽取公共部分

在要用的時(shí)候是用include標(biāo)簽引用

<sql id="if-title-authoe">
    <if test="title != null">
        and title like #{title}
    </if>
    <if test="author != null">
        and author like #{author}
    </if>
</sql>
<select id="queryBlogIF" parameterType="map" resultType="Blog">
    select * from blog where 1=1
    <include refid="if-title-authoe"/>
</select>

11、緩存

Mybatis緩存

  • mybatis默認(rèn)定義了兩級(jí)緩存:一級(jí)緩存二級(jí)緩存
    • 默認(rèn)情況下,只有一級(jí)緩存開(kāi)啟,(Sqlsession級(jí)別的緩存,也成為本地緩存)
    • 二級(jí)緩存需要手動(dòng)開(kāi)啟,他是namespace級(jí)別的環(huán)境
    • Mybatis還定義了緩存接口Cache,可以通過(guò)實(shí)現(xiàn)Cache接口來(lái)定義二級(jí)緩存

一級(jí)緩存

  • 映射語(yǔ)句文件中的所有 select 語(yǔ)句的結(jié)果將會(huì)被緩存。
  • 映射語(yǔ)句文件中的所有 insert、update 和 delete 語(yǔ)句會(huì)刷新緩存。
  • 緩存會(huì)使用最近最少使用算法(LRU, Least Recently Used)算法來(lái)清除不需要的緩存。
  • 緩存不會(huì)定時(shí)進(jìn)行刷新(也就是說(shuō),沒(méi)有刷新間隔)。
  • 緩存會(huì)保存列表或?qū)ο螅o(wú)論查詢(xún)方法返回哪種)的 1024 個(gè)引用。
  • 緩存會(huì)被視為讀/寫(xiě)緩存,這意味著獲取到的對(duì)象并不是共享的,可以安全地被調(diào)用者修改,而不干擾其他調(diào)用者或線程所做的潛在修改。
  • 手動(dòng)清除緩存sqlSession.clearCache();

二級(jí)緩存

要啟用全局的二級(jí)緩存,只需要在你的 SQL 映射文件中添加一行

<cache/>

這些屬性可以通過(guò) cache 元素的屬性來(lái)修改。比如:

<cache
  eviction="FIFO"
  flushInterval="60000"
  size="512"
  readOnly="true"/>

這個(gè)更高級(jí)的配置創(chuàng)建了一個(gè) FIFO 緩存,每隔 60 秒刷新,最多可以存儲(chǔ)結(jié)果對(duì)象或列表的 512 個(gè)引用,而且返回的對(duì)象被認(rèn)為是只讀的,因此對(duì)它們進(jìn)行修改可能會(huì)在不同線程中的調(diào)用者產(chǎn)生沖突。

可用的清除策略有:

  • LRU – 最近最少使用:移除最長(zhǎng)時(shí)間不被使用的對(duì)象。
  • FIFO – 先進(jìn)先出:按對(duì)象進(jìn)入緩存的順序來(lái)移除它們。
  • SOFT – 軟引用:基于垃圾回收器狀態(tài)和軟引用規(guī)則移除對(duì)象。
  • WEAK – 弱引用:更積極地基于垃圾收集器狀態(tài)和弱引用規(guī)則移除對(duì)象。

默認(rèn)的清除策略是 LRU。

flushInterval(刷新間隔)屬性可以被設(shè)置為任意的正整數(shù),設(shè)置的值應(yīng)該是一個(gè)以毫秒為單位的合理時(shí)間量。 默認(rèn)情況是不設(shè)置,也就是沒(méi)有刷新間隔,緩存僅僅會(huì)在調(diào)用語(yǔ)句時(shí)刷新。

size(引用數(shù)目)屬性可以被設(shè)置為任意正整數(shù),要注意欲緩存對(duì)象的大小和運(yùn)行環(huán)境中可用的內(nèi)存資源。默認(rèn)值是 1024。

readOnly(只讀)屬性可以被設(shè)置為 true 或 false。只讀的緩存會(huì)給所有調(diào)用者返回緩存對(duì)象的相同實(shí)例。 因此這些對(duì)象不能被修改。這就提供了可觀的性能提升。而可讀寫(xiě)的緩存會(huì)(通過(guò)序列化)返回緩存對(duì)象的拷貝。 速度上會(huì)慢一些,但是更安全,因此默認(rèn)值是 false。

提示 二級(jí)緩存是事務(wù)性的。這意味著,當(dāng) SqlSession 完成并提交時(shí),或是完成并回滾,(也就是一級(jí)緩存SqlSession .close()之后)但沒(méi)有執(zhí)行 flushCache=true 的 insert/delete/update 語(yǔ)句時(shí),緩存會(huì)獲得更新。

原理

用戶(hù)查詢(xún)的時(shí)候,首先查看二級(jí)緩存中有沒(méi)有,

如果沒(méi)有則去查看一級(jí)緩存有沒(méi)有,

沒(méi)有就會(huì)去查詢(xún)數(shù)據(jù)庫(kù)。

自定義緩存ehcache

ehcache是一個(gè)分布式緩存

依賴(lài):

<dependency>
    <groupId>org.mybatis.caches</groupId>
    <artifactId>mybatis-ehcache</artifactId>
    <version>1.2.1</version>
</dependency>

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多