[Mybatis] SQL dynamique et cache

SQL dynamique et mise en cache

SQL dynamique

  • Qu'est-ce que le SQL dynamique
    • Selon différentes conditions de requête, générez différentes instructions SQL
    • En utilisant des balises, composez des instructions SQL flexibles
    • Essentiellement, il s'agit d'épisser des instructions SQL
  • Construire une table de base de données
CREATE TABLE `blog` (
  `id` varchar(50) NOT NULL COMMENT '博客id',
  `title` varchar(100) NOT NULL COMMENT '博客标题',
  `author` varchar(30) NOT NULL COMMENT '博客作者',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `views` int(30) NOT NULL COMMENT '浏览量'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • Les fichiers de configuration de base et les classes d'outils sont les mêmes qu'auparavant. Les classes d'entités sont les suivantes
package com.kuang.pojo;

import lombok.Data;

import java.util.Date;

@Data
public class Blog {
    
    
    private String id;
    private String title;
    private String author;
    private Date create_time;
    private int views;
}
  • Interface DAO
package com.kuang.dao;

import com.kuang.pojo.Blog;

import java.util.List;
import java.util.Map;

public interface BlogMapper {
    
    
    //插入数据
    int addBlog(Blog blog);
    //查询博客
    List<Blog> queryBlogByIf(Map map);
    List<Blog> queryBlogByChoose(Map map);
    //更新博客
    int updateBlogBySet(Map map);
    //查询第1-3号记录博客
    List<Blog> queryBlogByForeach(Map map);
}
  • Classe d'implémentation d'interface
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.kuang.dao.BlogMapper">

    <!--向数据库表插入数据-->
    <insert id="addBlog" parameterType="Blog">
        insert into mybatis.blog(id, title, author, create_time, views)
        values(#{
    
    id}, #{
    
    title}, #{
    
    author}, #{
    
    create_time}, #{
    
    views});
    </insert>

    <!--sql标签的使用-->
    <!--
    sql片段  实际上就是将共有的片段抽离出来  需要使用的时候再引用进去
    注意:
        1 最好基于单表定义SQL片段
        2 SQL片段不要存在where标签
    -->
    <sql id="if-title-author">
        <if test="title!=null">
            title=#{
    
    title}
        </if>
        <if test="author!=null">
            and author=#{
    
    author}
        </if>
    </sql>

    <!--动态sql语句之if和where标签的使用-->
    <!--
    1 满足if标签里的条件就会把语句拼接进去
    2 where标签 就是检测where之后拼接的第一个语句,如果有and(or),则直接删掉and(or);如果where之后没有语句了,则直接删掉自己
    -->
    <select id="queryBlogByIf" parameterType="map" resultType="Blog">
        select * from mybatis.blog
        <where>
            <!--引入sql片段-->
            <include refid="if-title-author"></include>
        </where>
    </select>

    <!--动态sql语句之choose标签的使用-->
    <!--
    choose就相当于switch...case...default..
    只要满足其中一个,就停止
    -->
    <select id="queryBlogByChoose" parameterType="map" resultType="Blog">
        select * from mybatis.blog
        <where>
            <choose>
                <when test="author!=null">
                    author=#{
    
    author}
                </when>
                <when test="title!=null">
                    and title=#{
    
    title}
                </when>
                <otherwise>
                    and views=#{
    
    views}
                </otherwise>
            </choose>
        </where>
    </select>

    <!--动态sql语句之set标签的使用-->
    <!--
    set标签 可以删除无关的逗号 如果set之后没有修改的,它也不会删掉自己,只会报错
    -->
    <update id="updateBlogBySet" parameterType="map">
        update mybatis.blog
        <set>
            <if test="views!=null">
                views=#{
    
    views},
            </if>
            <if test="author!=null">
                author=#{
    
    author}
            </if>
        </set>
        where id=#{
    
    id}
    </update>

    <!--动态sql语句之Foreach标签使用-->
    <!--
    select * from blog where 1=1 and (id=1 or id=2 or id=3);
    -->
    <select id="queryBlogByForeach" parameterType="map" resultType="Blog">
        select * from mybatis.blog
        <where>
            <foreach collection="ids" item="id" open="(" close=")" separator="or">
                id=#{
    
    id}
            </foreach>
        </where>
    </select>
</mapper>
  • Classe d'essai
import com.kuang.dao.BlogMapper;
import com.kuang.pojo.Blog;
import com.kuang.utils.id_utils;
import com.kuang.utils.mybatis_utils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

public class mytest {
    
    
    @Test
    public void testAddBlog(){
    
    
        SqlSession sqlsession = mybatis_utils.getSqlSession();
        BlogMapper mapper = sqlsession.getMapper(BlogMapper.class);

        Blog blog = new Blog();
        blog.setId(id_utils.getId());
        blog.setTitle("Mybatis如此简单");
        blog.setAuthor("狂神说");
        blog.setCreate_time(new Date());
        blog.setViews(9999);

        mapper.addBlog(blog);


        blog.setId(id_utils.getId());
        blog.setTitle("Java如此简单");
        mapper.addBlog(blog);

        blog.setId(id_utils.getId());
        blog.setTitle("Spring如此简单");
        mapper.addBlog(blog);

        blog.setId(id_utils.getId());
        blog.setTitle("微服务如此简单");
        mapper.addBlog(blog);

        sqlsession.close();
    }
    @Test
    public void testQueryBlogByIf(){
    
    
        SqlSession sqlSession=mybatis_utils.getSqlSession();
        BlogMapper blogMapper=sqlSession.getMapper(BlogMapper.class);
        HashMap map=new HashMap();
        map.put("title","Mybatis如此简单");
        map.put("author","狂神说");
        List<Blog> blogList=blogMapper.queryBlogByIf(map);
        for (Blog blog : blogList) {
    
    
            System.out.println(blog);
        }
        sqlSession.close();
    }
    @Test
    public void testQueryBlogByChoose(){
    
    
        SqlSession sqlSession=mybatis_utils.getSqlSession();
        BlogMapper blogMapper=sqlSession.getMapper(BlogMapper.class);
        HashMap map=new HashMap();
        //map.put("author","狂神说");
        map.put("title","Mybatis如此简单");
        map.put("views",9999);
        List<Blog> blogList=blogMapper.queryBlogByChoose(map);
        for (Blog blog : blogList) {
    
    
            System.out.println(blog);
        }
        sqlSession.close();
    }
    @Test
    public void testUpdateBlogBySet(){
    
    
        SqlSession sqlSession=mybatis_utils.getSqlSession();
        BlogMapper blogMapper=sqlSession.getMapper(BlogMapper.class);
        HashMap map=new HashMap();
        map.put("views",3333);
        map.put("id","3");
        int res=blogMapper.updateBlogBySet(map);
        if(res>0){
    
    
            System.out.println("你成功了!");
        }
        sqlSession.close();
    }
    @Test
    public void testQueryBlogByForeach(){
    
    
        SqlSession sqlSession=mybatis_utils.getSqlSession();
        BlogMapper blogMapper=sqlSession.getMapper(BlogMapper.class);
        HashMap map=new HashMap();
        ArrayList<Integer> ids=new ArrayList<Integer>();
        ids.add(1);
        ids.add(2);
        map.put("ids",ids);
        List<Blog> blogList=blogMapper.queryBlogByForeach(map);
        for (Blog blog : blogList) {
    
    
            System.out.println(blog);
        }
        sqlSession.close();
    }
}

Cache

  • Qu'est-ce que la mise en cache
    • Données temporaires stockées en mémoire
    • Placez les données que les utilisateurs interrogent fréquemment et ne modifient pas fréquemment dans le cache
  • Pourquoi utiliser la mise en cache
    • Réduisez le nombre d'interactions avec la base de données, réduisez la surcharge du système et améliorez l'efficacité du système

Cache de niveau 1

  • Cache de niveau 1
    • Aussi appelé cache de session local
    • Par défaut sur
    • C'est le cache de niveau SqlSession
    • Existe uniquement lors de la création de l'objet Sqlsession jusqu'à ce qu'il soit fermé
  • Quelle est l'invalidation du cache de premier niveau
    • L'invalidation du cache de premier niveau fait référence à: le cache de premier niveau actuel ne peut pas être utilisé, nous devons lancer une demande de connexion à la base de données pour interroger les données
  • Quatre situations d'échec du cache de premier niveau
    • sqlSession est différent
    • Même sqlSession, interrogez différentes choses
    • sqlSession est le même, les ajouts, les suppressions et les modifications rafraîchiront le cache
    • Identique à sqlSession, effacez manuellement le cachesqlsession.clearCache();

Cache secondaire

  • Cache secondaire

    • Aussi appelé cache global
    • Est le cache au niveau de l'espace de noms
    • Si sqlsession (session) est fermé, le cache de premier niveau de sqlsession a disparu et les données du cache de premier niveau seront enregistrées dans le cache de second niveau
  • Utilisation du cache secondaire

    • Activez le cache global et ajoutez la configuration suivante au fichier de configuration principal
      • <setting name="cacheEnabled" value="true"/>
    • Configurer le cache secondaire dans le fichier de configuration mapper.xml
      • <cache/>
    • Toutes les classes d'entités implémentent d'abord l'interface de sérialisation
      • public class Blog implements Serializable{}
    • tester
    //使用不同的sqlsession查询相同的东西
    @Test
    public void testQueryUserById(){
          
          
        SqlSession session = MybatisUtils.getSession();
        SqlSession session2 = MybatisUtils.getSession();
    
        UserMapper mapper = session.getMapper(UserMapper.class);
        UserMapper mapper2 = session2.getMapper(UserMapper.class);
    
        User user = mapper.queryUserById(1);//一个会话查询一条数据,这个数据就会被放在当前会话的一级缓存中
        System.out.println(user);
        session.close();//当会话关闭以后,一级缓存数据被保存到了二级缓存中
    
        User user2 = mapper2.queryUserById(1);//再次查询 直接从二级缓存中拿数据
        System.out.println(user2);
        System.out.println(user==user2);//true
        session2.close();
    }
    

Le principe de la mise en cache

  • L'ordre dans lequel les utilisateurs interrogent les données
    • Vérifiez d'abord s'il existe un cache secondaire
    • Regardez si le cache de premier niveau
    • Base de données de requêtes
  • Abrégé en: utilisateur -----> cache de second niveau -----> cache de premier niveau -----> base de données

Je suppose que tu aimes

Origine blog.csdn.net/kieson_uabc/article/details/107404802
conseillé
Classement