动态SQL? 动态SQL就是根据不同的条件生成不同的sql语句
在 MyBatis 之前的版本中,需要花时间了解大量的元素。借助功能强大的基于 OGNL 的表达式,MyBatis 3 替换了之前的大部分元素,大大精简了元素种类,现在要学习的元素种类比原来的一半还要少。
- if
- choose (when, otherwise)
- trim (where, set)
- foreach
搭建环境
数据库
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;
创建基础工程
1.导包
2.编写配置文件
数据库配置文件
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/sqlstudy?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username=root
password=123456
mybatis配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"https://mybatis.org/dtd/mybatis-3-config.dtd">
<!--configuration核心配置文件-->
<configuration>
<!--映入外部配置文件-->
<properties resource="db.properties">
<!--可以全写在db.properties里 也可以两边搭配混合都能实现效果,如果存在 优先使用外部配置文件-->
<!-- <property name="username" value="root"/>-->
<!-- <property name="password" value="123456"/>-->
</properties>
<!--设置 日志配置logImpl规范填写,严格区分大小写,空格-->
<settings>
<!--标准的日志工厂实现-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
<!--LOG4J-->
<!-- <setting name="logImpl" value="LOG4J"/>-->
<!-- 是否开启驼峰命名自动映射,即从经典数据库列名 A_COLUMN 映射到经典 Java 属性名 aColumn。-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
<!--设置类型别名-->
<typeAliases>
<!--给实体类起别名-->
<!-- <typeAlias type="com.mybatisstudy.pojo.Student" alias="Student"></typeAlias>-->
<!-- <typeAlias type="com.mybatisstudy.pojo.Teacher" alias="Teacher"></typeAlias>-->
<!--配置包名-->
<!-- <package name="com.mybatisstudy.pojo" />-->
</typeAliases>
<!--default 切换环境-->
<environments default="development">
<!--开发环境-->
<environment id="development">
<!--事务管理器 默认事务处理器JDBC-->
<transactionManager type="JDBC"/>
<!--数据源 默认POOLED / UNPOOLED-->
<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 class="com.studymb.dao.BlogMapper"></mapper>
<!-- <mapper resource="dao/StudentMapper.xml"></mapper>-->
</mappers>
</configuration>
3.编写实体类
/**
* @author tian
*/
@Data
public class Blog {
private int id;
private String title;
private String author;
private Date createTime;
private int views;
}
4.编写实体类对应的Mapper
5.测试
@Test
public void addInitBlog(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
Blog blog = new Blog();
blog.setId(IDUtils.getId());
blog.setViews(200);
blog.setAuthor("zhang");
blog.setTitle("java学习");
blog.setCreateTime(new Date());
int i = mapper.addBlog(blog);
sqlSession.close();
}
重温工具类
MybatisUtils
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
/**
* @author tian
* sqlSessionFactory --> sqlSession
*/
public class MybatisUtils {
private static SqlSessionFactory sqlSessionFactory;
// 静态代码块
static {
// 使用mybatis第一步 获取sqlSessionFactory
try {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
// 既然有了 SqlSessionFactory,顾名思义,我们可以从中获得 SqlSession 的实例。SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。你可以通过 SqlSession 实例来直接执行已映射的 SQL 语句。
/**
* sqlSession完全包含了面向数据库执行sql,命令所需的所有方法.
*/
public static SqlSession getSqlSession(){
// 加上true后增删改不再需要手动commit提交
return sqlSessionFactory.openSession(true);
}
}
UUID工具类
import org.junit.Test;
import java.util.UUID;
/**
* @author tian
*/
public class IDUtils {
public static String getId(){
return UUID.randomUUID().toString().replaceAll("-","");
}
@Test
public void testUUID(){
System.out.println(IDUtils.getId());
}
}