动态sql

动态sql的内容是变化的,可以根据条件获取到不同的sql语句,主要是where部分发生变化,实现是使用mybaits提供的标签,,,

条件判断

语法:

1
2
3
<if test="判断Java对象的属性值">
sql语句
</if>
1
2
3
4
5
6
7
如果表中数据含name不为空,那么我就查询name为张三的人
<select id="selectStudent" resultType="com.zss.pojo.Student" >
select * from student where
<if test="name!=null and name!=''">
name=#{name}
</if>
</select>
1
2
3
4
5
6
public static void main( String[] args ) throws IOException {
SqlSession sqlSession= MyBaitsUtils.getSqlSession();
StudentDAO dao=sqlSession.getMapper(StudentDAO.class);
List<Student> student=dao.selectStudent("张三");
System.out.println(student);
}

标签

where标签可以用来包含if,当多个if有一个成立时,会自动增加一个where关键字,并且会去除and,or等语句,防止报错。如果多个都不符合,where语句也会自动删除

1
2
3
4
5
6
7
8
9
10
11
12
<select id="selectStudent" resultType="com.zss.pojo.Student" >
select * from student
<where>
<if test="name!=null and name!=''">
name=#{name}
</if>
<if test="age>0">
and age=#{age}
</if>
</where>

</select>

循环标签

主要使用在sql的in语句的

1
select * from where id in100110021003);

那么怎么传输后面的值就成为了问题

1
2
3
4
5
6
7
8
<select id="selectForeach" resultType="com.zss.pojo.Student" ><!--collection表示的是方法参数的类型,如果是数组使用array,如果是list集合使用list
open是开始,close表示结束,separator表示分隔符-->

select * from student where id in
<foreach collection="list" item="myid" open="(" close=")" separator=",">
#{myid}
</foreach>
</select>
1
2
3
4
5
6
7
8
9
10
11
public static void main( String[] args ) throws IOException {
SqlSession sqlSession= MyBaitsUtils.getSqlSession();
StudentDAO dao=sqlSession.getMapper(StudentDAO.class);
List<Integer> list=new ArrayList<>();
list.add(1);
list.add(1003);
List<Student> studentList=dao.selectForeach(list);
for (Student student:studentList){
System.out.println(student);
}
}

image-20220502210124191

当然我们也可以传输对象,但是里面的只要

1
2
3
<foreach collection="list" item="myid" open="(" close=")" separator=",">
#{student.myid}
</foreach>

当然里面的的小括号也可以自己完成

1
2
3
4
5
6
7
<select id="selectForeach" resultType="com.zss.pojo.Student" >

select * from student where id in(
<foreach collection="list" item="myid" separator=",">
#{myid}
</foreach>)
</select>

代码片段

有一些sql语句需要我们需要重复使用,一次又一次去写又太过于麻烦

  1. 先定义sql语句,表名,字段等等
  2. 在使用
1
2
3
4
5
6
7
8
9
10
11
<!--定义sql片段-->
<sql id="studentSql">
select * from student
</sql>
<select id="selectForeach" resultType="com.zss.pojo.Student" >
<!--替换掉原来的语句-->
<include refid="studentSql"></include> where id in(
<foreach collection="list" item="myid" separator=",">
#{myid}
</foreach>)
</select>

数据库属性配置文件

将数据库的信息保存在一个单独的文件中,和mybaits主配置文件分开,便于修改,保存。

  1. 在resources目录中定义一个属性配置文件,xx.properties,
    1. 在配置文件中,定义数据格式为key=value
    2. key一般使用.做多级目录的,例如jdbc.mysql.cj.
  2. 在mybaits主配置文件中使用 指定位置

记录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--从类路径的根考试寻找-->
<properties resource="jdbc.properties"/>

<!--输出日志-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>

<!--环境配置,default必须与一个environment的id相似,表示链接哪一个库-->
<environments default="development">
<!--id表示唯一值-->
<environment id="development">
<!--表示事务类型,type="JDBC"表示使用jdbc中的connection的commit,rollback做事务处理-->
<transactionManager type="JDBC"/>
<!--表示数据源-->
<dataSource type="POOLED">
<!--下面的值name是固定的,无法进行更改-->
<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="com/zss/dao/Student.xml"/>
</mappers>
</configuration>

指定多个mapper配置文件

如果有多个需要写很多行

1
2
3
4
<mappers>
<!--指出映射文件的位置-->
<mapper resource="com/zss/dao/Student.xml"/>
</mappers>

但是我们还是可以扫描包,扫描包的时候需要注意:

mapper文件名称需要和接口名称一样,区分大小写,mapper文件和dao接口在同一目录下

1
2
3
<mappers>
<package name="com.zss.dao"/>
</mappers>

PageHelper

数据分页

导入jar包

1
2
3
4
5
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.13</version>
</dependency>

配置插件

1
2
3
4
5
6
7
8
9
<!--输出日志-->
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>


<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"/>
</plugins>

java文件配置

1
2
3
4
5
6
7
8
9
10
public static void main( String[] args ) throws IOException {
SqlSession sqlSession= MyBaitsUtils.getSqlSession();
StudentDAO dao=sqlSession.getMapper(StudentDAO.class);
//加入pageHelper的方法,分页
//pageNum第几页,从1开始
//pageSize:一页中含有多少数据
PageHelper.startPage(1,2);
List<Student> studentList=dao.selectStudents();
System.out.println(studentList);
}

而我们最终也可以得到最终的行数等等信息image-20220502215118145