美文网首页
Mybatis动态SQL

Mybatis动态SQL

作者: 小杨小杨神采飞杨 | 来源:发表于2020-04-16 23:02 被阅读0次

    概念:

    根据不同的条件生成不同的SQL语句

    环境搭建:

    1、创建数据库

    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
    

    2、创建项目,配置maven配置文件以及mybatis核心配置文件,外部数据库连接文件,日志配置文件
    maven

    <dependencies>
            <dependency>
                <groupId>log4j</groupId>
                <artifactId>log4j</artifactId>
                <version>1.2.17</version>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.18.10</version>
                <scope>provided</scope>
            </dependency>
        </dependencies>
    

    mybatis

    <configuration>
        <!--外部导入配置文件-->
        <properties resource="db.properties"/>
        
        <settings>
            <!--开启日志--> 
            <setting name="logImpl" value="LOG4J"/>
            <!--        <setting name="logImpl" value="STDOUT_LOGGING"/>-->
            <!--开启驼峰命名自动映射-->
            <setting name="mapUnderscoreToCamelCase" value="true"/>
        </settings>
    
        <!--设置别名-->
        <typeAliases>
            <typeAlias type="cn.yzx.pojo.blog" alias="blog"/>
        </typeAliases>
    
        <!--环境配置-->
        <environments default="development">
            <environment id="development">
                <transactionManager type="JDBC"/>
                <dataSource type="POOLED">
                    <property name="driver" value="${driver}"/>
                    <property name="url" value="${url}"/>
                    <property name="username" value="${username}"/>
                    <property name="password" value="${password}"/>
                </dataSource>
            </environment>
        </environments>
    
        <!--注册-->
        <mappers>
            <mapper resource="cn/yzx/mapper/blogMapper.xml" />
        </mappers>
    
    </configuration>
    

    外部数据库链接文件

    driver=com.mysql.cj.jdbc.Driver
    url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT
    username=root
    password=123456
    

    日志配置文件

    #将等级为DEBUG的日志信息输出到console和file这两个目的地,console和file的定义在下面的代码
    log4j.rootLogger=DEBUG,console,file
    
    #控制台输出的相关设置
    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
    
    #文件输出的相关设置
    log4j.appender.file = org.apache.log4j.RollingFileAppender
    log4j.appender.file.File=./log/yzx.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{yy-MM-dd}][%c]%m%n
    
    #日志输出级别
    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
    

    3、创建对应实体类、工具类、接口、接口xml
    实体类

    @Data
    public class blog {
        private String id;
        private String title;
        private String author;
        private Date createTime;
        private int views;
    
        public blog(String id, String title, String author, Date createTime, int views) {
            this.id = id;
            this.title = title;
            this.author = author;
            this.createTime = createTime;
            this.views = views;
        }
    
        public blog() {
        }
    

    接口

    public interface blogMapper {
    }
    

    工具类
    mybatis工具类

    public class mybatisUtil {
        private static SqlSessionFactory sqlSessionFactory = null;
    
        static {
            try {
                String resource = "mybatis-config.xml";
                InputStream inputStream = Resources.getResourceAsStream(resource);
                sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    
        public static SqlSession getSqlSession() {
            return sqlSessionFactory.openSession();
        }
    }
    

    id工具类,用于获取随机的不重复的id

    public class idUtil {
        public static String getId() {
            return UUID.randomUUID().toString().replaceAll("-","");
        }
    }
    

    接口xml

    <?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="cn.yzx.mapper.blogMapper">
        
    </mapper>
    

    动态SQL之IF语句

    需求:当传入title时,查询指定title的书籍,若传入author时,查询指定author的书籍,若都没有传入时,查询全部,若两个都不为空,则两个都满足

    1、在接口建立方法


    建立方法

    2、在xml使用动态SQL创建sql查询语句


    xml

    3、在test类进行测试

    @Test
        public void testSelectByIf() {
            SqlSession sqlSession = mybatisUtil.getSqlSession();
            blogMapper mapper = sqlSession.getMapper(blogMapper.class);
    
            Map<String,Object> map = new HashMap<String,Object>();
            map.put("title","西游记");
            //map.put("author","罗贯中");
            List<blog> blogByIf = mapper.findBlogByIf(map);
            for (blog blog : blogByIf) {
                System.out.println(blog);
            }
    
            sqlSession.close();
        }
    

    4、正确获取结果


    执行结果

    改造动态SQL之IF语句

    在正规代码中,where 1 = 1这样为了让拼接语句能正常实现的做法是投机取巧,不正确的,mybatis为我们提供了更正规的方法


    改造xml

    choose(when,otherwise)

    效果类似于java中的switch(case,default),且有break效果

    xml

    set、trim

    与where标签一样,正常的update语句中,set是要以,分隔的,但是若使用if进行更新,最后一个set结尾是不需要,的,此时若值满足了中间的if,则会多出一个,就会有错误,而set标签会在这种时候,自动把,去掉


    xml

    where和set标签的这个功能就是通过trim实现的,trim可以根据条件,覆盖前后的指定字符

    sql拼接

    1、使用sql标签抽取sql语句中重复使用较多的公共部分,设置唯一id,注意尽量只抽取带IF标签的语句,不要抽取其他标签的语句

    重复代码

    2、在需要使用的位置使用include标签导入


    引入

    foreach

    可以遍历集合,并以指定格式拼接到sql语句中,例如id in ('1' or '2' or '3'),可以使用foreach来达到将一个集合的数据按格式变为('1' or '2' or '3')的功能
    需求:一次查询title为西游记、红楼梦的数据


    foreach

    相关文章

      网友评论

          本文标题:Mybatis动态SQL

          本文链接:https://www.haomeiwen.com/subject/dkkdvhtx.html