概念:
根据不同的条件生成不同的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效果
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
网友评论