Mybatis动态SQL

2020-04-16  本文已影响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
上一篇 下一篇

猜你喜欢

热点阅读