1.什么是动态SQL
动态SQL就是根据不同的条件生成不同的SQL语句
在SMBMS项目中,我们使用了if语句来手动拼接SQL
动态SQL就是用来替代上面的这种场景的繁琐的Java代码的
学习动态SQL其实就是在学习4个标签
- if
- choose (when, otherwise)
- trim (where, set)
- foreach
2.搭建环境
- 创建表
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
-
创建新工程:MyBatis-08
-
编写实体类
package com.thhh.pojo; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; import java.util.Date; @NoArgsConstructor @AllArgsConstructor @Data public class Blog { private String id; //注意:ID为String类型,不是int类型 private String title; private String author; private Date createTime; //①使用驼峰命名,但是就和数据库中create_time字段名称不一致了 //②在Java中直接使用java.util.Date,而不要使用java.sql.Date private int views; }
-
编写实体类对应的mapper接口
package com.thhh.dao; public interface BlogMapper { }
-
编写接口对应的mapper.xml
<?xml version="1.0" encoding="UTF8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.thhh.dao.BlogMapper"> </mapper>
-
测试工程是否创建成功
- 接口
package com.thhh.dao; import com.thhh.pojo.Blog; public interface BlogMapper { int addBlog(Blog blog); }
-
mapper.xml
<?xml version="1.0" encoding="UTF8" ?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.thhh.dao.BlogMapper"> <insert id="addBlog" parameterType="blog"> insert into blog(id,title,author,create_time,views) values(#{id},#{title},#{author},#{createTime},#{views}) </insert> </mapper>
- 测试
package com.thhh.dao; import com.thhh.pojo.Blog; import com.thhh.utils.IDutils; import com.thhh.utils.MyBatisUtils; import org.apache.ibatis.session.SqlSession; import org.junit.Test; import java.util.Date; public class TestBlogMapper { @Test public void testAddBlog(){ SqlSession sqlSession = MyBatisUtils.getSqlSession(); BlogMapper mapper = sqlSession.getMapper(BlogMapper.class); Blog blog = new Blog(IDutils.getId(), "标题1", "作者1", new Date() ,20); int result = mapper.addBlog(blog); System.out.println("影响数据表行数 = "+result); sqlSession.close(); } }
多插入几条数据
@Test
public void testAddBlog(){
SqlSession sqlSession = MyBatisUtils.getSqlSession();
BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
Blog blog = null;
int result = 0;
for (int i=2;i<6;i++){
blog = new Blog(IDutils.getId(), "标题"+i, "作者"+i, new Date() ,9999);
result = mapper.addBlog(blog);
}
System.out.println("影响数据表行数 = "+result);
sqlSession.close();
}
- 编写一个工具类,这个工具类用于生成UUID作为插入数据库中的一行记录的ID;注意:上面的实体类Blog的ID属性为String类型
package com.thhh.utils; import org.junit.Test; import java.util.UUID; //用于自动获取一个UUID作为id,注意:blog的id属性是String类型,不是int类型 public class IDutils { public static String getId(){ return UUID.randomUUID().toString(); } }
- 测试
@Test public void test(){ System.out.println(IDutils.getId()); }
- 优化:将UUID中间的"-"去掉;手段:直接通过String的replace()即可
package com.thhh.utils; import org.junit.Test; import java.util.UUID; //用于自动获取一个UUID作为id,注意:blog的id属性是String类型,不是int类型 public class IDutils { public static String getId(){ return UUID.randomUUID().toString().replace("-",""); } }
- 测试
@Test public void test(){ System.out.println(IDutils.getId()); System.out.println(IDutils.getId()); System.out.println(IDutils.getId()); }
- 解决Blog中createTime属性名和数据库字段名create_time不一致的问题
-
在mybatis中提供了解决办法——通过在mybatis核心配置文件添加setting节点,并设置该节点的mapUnderscoreToCamelCase属性为true,即开启驼峰命名转换,即可解决问题
注意:上面的这个setting属性只能解决createTime和create_time这种去掉了下划线,字母不变的情况,字母大小写无所谓,但是字母必须相同才可以<settings> <setting name="logImpl" value="STDOUT_LOGGING"/> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings>
-