MyBatis(二)动态sql
1.使用mavne管理项目
pom文件如下
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>LATEST</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.20</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.0-alpha1</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>2.0.0-alpha1</version>
</dependency>
</dependencies>
<!--使用插件,让项目使用jdk1.8编译-->
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.1</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>1.8</encoding>
</configuration>
</plugin>
</plugins>
<resources>
<resource> <!--为了保证包目录下的配置文件在编译后能够发布到执行目录,需要指定编译后生成的文件内容 -->
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
</resource>
</resources>
</build>
2.用户表
简简单单一张表,所有操作都围绕着此表进行,其中userTime是datetime类型
3.需要的配置文件以及dao层接口以及dao接口
mapper映射文件和接口放在同一个包下,
log4j.properties 帮助我们打印日志信息,还能看到语句执行过程
接口方法
List<User> selectUserById(User user);
List<User> selectUserByName(String name1,String name2);
List<User> testDaoSelectUserChoose(User user);
List<User> selectUserIn(List<Integer> list);
List<User> selectUserByMapOrArray(Map<String,Integer> mmp);
void updateUser(User user);
4.动态sql之where节点
语句里的where标签的内容如果有效会自动给sql语句加上where关键字,通常和if标签来一起使用
where内的include标签引用了外部sql的if标签,写在外面,那么所有的语句都能利用include节点来使用这个sql。
如果传入的user对象中未给id赋值或者赋为空,那么就查询所有,如果不为空且不为0,就查询对应id的user信息
赋为1,只会查询出一条信息
5.动态sql之多个参数
对于多个参数如何使用
如果使用之前的写法,确实可以执行,但是一旦其中一个参数为空,就会出现不同的情况(与预期相违背),我们来使用动态sql优化
测试,第一个参数传空字符串,第二个传值,会发现查询出来了,说明mybatis帮我们去掉了or关键字,还是非常方便
如果第一个参数传值,第二个参数为空呢
6.动态sql之choose、otherwise
choose和otherwise一般一起使用,也用作条件,类似于switch语句,传什么值,执行对应的行为
测试,date不为空,小于当前时间的都会查询
id不为空,只根据对应的id值
如果都为空,会执行otherwise里面的语句
如果都不为空,会按照次序,也就是choose语句的顺序,所以会按照id来查询
7.动态sql之foreach
主要和sql语句in关键字一起使用,用来生成in的数据
属性:collection : 集合类型
open="(" 左括号开始
close=")" 右括号结束
separator="," 值与值之间以逗号分隔
item="item" 代表集合里的值
参数使用list集合,传值
如果使用map集合作为参数呢,使用map集合,可以不用添加参数类型属性
foreach中的集合类型可以使用entrySet(键值对)集合。
_parameter是没有指定参数名时候的默认参数名,_parameter获取所有的entrySet(键值对的集合)
然后,就是foreach中的属性,此时index是键,item是value
然后 使用
${} #{} 都可将id取出
测试,取index时,可以看到,所有的key都被取出来了,并且成功拼接
取item,取出了所有的cvalue,并且成功拼接
如果是数组呢,不需要参数类型,只需要将集合类型改为array即可,然后利用# $取值