🧆Mybatis②
目录
- log4j日志文件配置
- 接口绑定之批量操作
- 测试动态SQL
(1)if标签 (2)where标签(if的优化) (3)choose…when…otherwise标签 (4)bind标签 (5)set标签 (6)trim标签 (7)sql…include标签 - Mybatis的内建别名
一、log4j日志文件配置
1、官网下载jar包或者Mybatis资源包里的jar包导入项目lib
2、创建log4j配置文件
文件内容》》
# Set root category priority to INFO and its only appender to CONSOLE.
log4j.rootCategory=INFO, CONSOLE
# log4j.rootCategory=INFO, CONSOLE, LOGFILE
#单独设置SQL语句的输出级别为DEBUG级别
#方法级别设置
#log4j.logger.com.yjxxt.mappers.DeptMapper.queryAll=DEBUG
#类级别
#log4j.logger.com.yjxxt.mappers.DeptMapper=DEBUG
#包级别
log4j.logger.com.mybatis.mappers=DEBUG
# CONSOLE is set to be a ConsoleAppender using a PatternLayout.
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern= %m%c%l%n
# LOGFILE is set to be a File appender using a PatternLayout.
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.File=D:\\Java\\Project\\untitled\\Mybatis\\src\\test.log
log4j.appender.LOGFILE.Append=true
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=- %m %l%n
3、测试
public class test{
public static void main(String[] args){
Logger log=Logger.getLogger(Test01.class);
log.fatal("致命的,系统错误");
log.error("错误");
log.warn("警告");
log.debug("debug");
}
}
二、接口绑定之批量操作
1、批量增加用户
测试》》
EmpMapper em=session.getMapper(EmpMapper.class);
em.muchinsert(List.of(
new Emp(100,"王二"),
new Emp(101,"王三")
));
sql映射文件》》
<insert id="muchinsert" parameterType="list">
insert into emp(empno,ename)
<foreach collection="list" item="item" separator="union">
select #{item.empno},#{item.ename}from dual
</foreach>
</insert>
接口文件》》
int muchinsert(@Param("list") List<Emp> listemp);
结果》》
2、批量删除用户
测试》》
em.muchdelete(List.of(
new Emp(100),
new Emp(101)
));
sql映射文件》》
<delete id="muchdelete" parameterType="list">
delete from emp where empno in (
<foreach collection="list" item="item" separator=",">
#{item.empno}
</foreach>
)
</delete>
接口文件》》
int muchdelete(@Param("list") List<Emp> listemp);
结果》》
更新update与上面类似……略
三、测试动态SQL
- 动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。
- 使用动态 SQL 并非一件易事,但借助可用于任何 SQL 映射语句中的强大的动态 SQL 语言,MyBatis 显著地提升了这一特性的易用性。
1、 if 标签
- 用于进行条件判断, test 属性用于指定判断条件. 为了拼接条件, 在 SQL 语句后强行添加 1=1 的恒成立条件
测试》》
System.out.println("-----------------全空--------------------");
System.out.println(em.queryif(null, 0));
System.out.println("-----------------ename--------------------");
System.out.println(em.queryif("JONES", 0));
System.out.println("-----------------empno--------------------");
System.out.println(em.queryif(null, 7698));
sql映射文件》》
<select id="queryif" resultType="Emp">
select * from emp where 1=1
<if test="ename!=null">and ename=#{ename}</if>
<if test="empno!=0">and empno=#{empno}</if>
</select>
接口文件》》
List<Emp> queryif(@Param("ename") String ename,@Param("empno") int empno);
结果》》
2、 where 标签(if的优化)
- 如果没有条件, 不会生成 where 关键字
- 如果有条件, 会自动添加 where 关键字
- 如果第一个条件中有 and, 去除之
<select id="queryif" resultType="Emp">
select * from emp
<where>
<if test="ename!=null">and ename=#{ename}</if>
<if test="empno!=0">and empno=#{empno}</if>
</where>
</select>
3、choose…when…otherwise标签
sql映射文件》》
<select id="querychoose" resultType="dept" parameterType="int">
select * from dept
<where>
<choose>
<when test="deptno!=0">
and deptno=#{deptno}
</when>
<otherwise>
and 1=1
</otherwise>
</choose>
</where>
</select>
测试》》
System.out.println("------------------deptno=10-----------------------");
System.out.println(em.querychoose(10));
System.out.println("------------------deptno=100-----------------------");
System.out.println(em.querychoose(100));
结果
非常放便好用!
4、 bind 标签
测试》》
System.out.println("------------------------bind---------------------------------");
System.out.println(em.querybind("A"));
sql映射文件》》
<select id="querybind" parameterType="String" resultType="Emp">
select * from emp
<where>
<if test="ename!=null">
<bind name="ename" value="'%'+ename+'%'" />
and ename like #{ename}
</if>
</where>
</select>
接口文件》》
List<Emp> querybind(@Param("ename") String ename);
结果》》
5、 set 标签
- 满足条件时, 会自动添加 set 关键字
- 会去除 set 子句中多余的逗号
- 不满足条件时, 不会生成 set 关键字
测试》》
em.queryset(20,"lisi");
sql映射文件》》
<update id="queryset">
update dept
<set>
dname=#{dname},
</set>
where deptno=#{deptno}
</update>
接口文件》》
int queryset(@Param("deptno") int deptno,@Param("dname") String dname);
结果》》
6、trim 标签
- prefix, 在前面添加内容
- prefixOverrides, 从前面去除内容
- suffix, 向后面添加内容
- suffixOverrides, 从后面去除内容
测试》》
em.querytrim(20,"wangwu");
sql映射文件》》
<update id="querytrim" parameterType="int">
update dept
<trim prefix="set" suffix="where">
dname=#{dname}
</trim>
deptno=#{deptno}
</update>
接口文件》》
int querytrim(@Param("deptno") int deptno,@Param("dname") String dname);
结果》》
7、 sql…include标签
- sql用于提取 SQL 语句, include用于引用 SQL 语句
测试》》
System.out.println(em.queryinclude());
sql映射文件》》
<sql id="sql"> empno,ename,sal</sql>
<select id="queryinclude" resultType="Emp">
select
<include refid="sql"/>
from emp
</select>
接口文件》》
List<Emp> queryinclude();
结果》》
四、Mybatis的内建别名
- 下面是一些为常见的 Java 类型内建的类型别名。它们都是不区分大小写的,注意,为了应对原始类型的命名重复,采取了特殊的命名风格。
别名 | 映射的类型 |
---|
_byte | byte | – | – | _long | long | – | – | _short | short | – | – | _int | int | – | – | _integer | int | – | – | _double | double | – | – | _float | float | – | – | _boolean | boolean | – | – | string | String | – | – | byte | Byte | – | – | long | Long | – | – | short | Short | – | – | int | Integer | – | – | integer | Integer | – | – | double | Double | – | – | float | Float | – | – | boolean | Boolean | – | – | date | Date | – | – | decimal | BigDecimal | – | – | bigdecimal | BigDecimal | – | – | object | Object | – | – | map | Map | – | – | hashmap | HashMap | – | – | list | List | – | – | arraylist | ArrayList | – | – | collection | Collection | – | – | iterator | Iterator | – | – |
|