If语句有时候会有问题,从上往下的判断,会导致某些条件可能成立,某些条件不成立,导致or或and多一个或者少一个之类的,从而导致sql语句错误
为了弥补sql语句语法错误一般在where 后面加上1=1 (id=-1)
MyBatis分页:查询显示几条显示
StudentDao接口:
package com.bjpowernode.dao;
import com.bjpowernode.domain.Student;
import com.bjpowernode.vo.CustomObject;
import com.bjpowernode.vo.QueryParama;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
public interface StudentDao {
//动态sql if的使用
List<Student> selectIf(Student student);
//动态sql where的使用
List<Student> selectwhere(Student student);
//foreach的使用遍历《简单类型》
List<Student> selectForeachOne(List<Integer> idlist);
//foreach的使用遍历《对象类型》
List<Student> selectForeachTwo(List<Student> studentList);
//设置查询分页的方法
List<Student> selectAllStudent();
}
StudentDao.xml:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.bjpowernode.dao.StudentDao">
<!-- 定义代码片段-->
<sql id="selectStudent">
select * from student
</sql>
<sql id="selectStudentList">
id,name ,email
</sql>
<!--if的使用
test:使用对象的属性作为条件
条件使用对象属性值
需要添加一个条件来防止上边if不满足时,下边if 多一个or
<include refid="selectStudent"/>引入代码段
-->
<select id="selectIf" resultType="com.bjpowernode.domain.Student">
<include refid="selectStudent"/>
where id=-1
<if test="name !=null and name!=''">
or name =#{name}
</if>
<if test="age>0">
or age = #{age}
</if>
</select>
<!--where的使用
where标签删除和他最近的or 或者and
-->
<select id="selectwhere" resultType="com.bjpowernode.domain.Student">
select <include refid="selectStudentList"/> from student
<where>
<if test="name !=null and name!=''">
or name =#{name}
</if>
<if test="age>0">
or age < #{age}
</if>
</where>
</select>
<!-- foreach使用 循环简单类型List-->
<select id="selectForeachOne" resultType="com.bjpowernode.domain.Student">
select * from student
首先用if判断集合是否为null或者没有数据
<if test="list !=null and list.size>0">
where id in
<foreach collection="list" open="(" close=")" separator="," item="myid">
#{myid}
</foreach>
</if>
</select>
<!-- foreach 循环List<Student>-->
<select id="selectForeachTwo" resultType="com.bjpowernode.domain.Student">
select * from student
首先用if判断集合是否为null或者没有数据
<if test="list !=null and list.size>0">
where id in
<foreach collection="list" open="(" close=")" separator="," item="stu">
#{stu.id}
</foreach>
</if>
</select>
<!--查询分页的sql语句-->
<select id="selectAllStudent" resultType="com.bjpowernode.domain.Student">
select * from student order by id
</select>
</mapper>
数据库属性配置文件jdbc.properties:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&charaterEcoding=utf-8
jdbc.username=root
jdbc.password=123456
主配置文件,mybatis.xml:
<?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>
<!--声明别名-->
<!--
第一种方式:
type:java类型的全限定名称
alias:自定义别名
优点:别名可以自定义
缺点:每个类型必须单独定义
第二种方式:
name:包名 mybatis会把这个包中的所有类名作为别名(不区分大小写)
优点:使用方便,一次可以给多个类定义别名
缺点:别名不能自定义,必须是类名
-->
<typeAliases>
<!-- 第一种方式-->
<!-- <typeAlias type="com.bjpowernode.domain.Student" alias="stu"></typeAlias>-->
<!-- <typeAlias type="com.bjpowernode.vo.QueryParama" alias="qp" />-->
<!-- 第二种方式-->
<package name="com.bjpowernode.domain"/>
</typeAliases>
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"/>
</plugins>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!-- 配置数据源:创建Connection对象,连接数据库 -->
<dataSource type="POOLED">
<!--driver:驱动的内容-->
<property name="driver" value="${jdbc.driver}"/>
<!--连接数据库的url-->
<property name="url"
value="${jdbc.url}"/>
<!--用户名-->
<property name="username" value="${jdbc.username}"/>
<!--密码-->
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- 是指定其他mapper文件的位置:
其他mapper文件的目的是找到其他文件sql语句
-->
<mappers>
<mapper resource="com/bjpowernode/dao/StudentDao.xml"/>
<!-- 新加了接口需要指定xml的位置-->
<!--
第一种方式,resource=“mapper文件路径”
优点:文件清晰,加载文件是明确的。文件的位置比较灵活
缺点:文件较多,代码量比较大,管理难度大
-->
<!-- <mapper resource="com/bjpowernode/dao/ProvinceDao.xml"/>-->
<!--
第二种方式,使用<package>
name:包名,mapper文件所在的包名
特点:把这个包中的所有mapper文件,一次加载进来
使用要求:
1.mapper文件和dao接口在同一目录下
2.mapper文件和dao接口名称完全一样
-->
<package name="com.bjpowernode.dao"/>
</mappers>
</configuration>
测试类:MyTest:
package com.bjpowernode;
import com.bjpowernode.dao.StudentDao;
import com.bjpowernode.domain.Student;
import com.bjpowernode.utils.MybatisUtil;
import com.bjpowernode.vo.CustomObject;
import com.bjpowernode.vo.ProvinceCity;
import com.github.pagehelper.PageHelper;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class MyTest {
// 动态sql if查询测试
@Test
public void testSelectByIf(){
//获取SqlSession
SqlSession session= MybatisUtil.getSqlSession();
//获取dao代理
StudentDao dao=session.getMapper(StudentDao.class);
Student student=new Student();
student.setName("李四");
student.setAge(20);//where条件 where name =? or age=?
//student.setName("李四");//where条件 where name =?
//student.setName(null);
//student.setAge(20); //发生错误 条件:where or age=?
//调用方法
List<Student> students=dao.selectIf(student);
students.forEach(stu-> System.out.println("stu="+stu));
//4.关闭SqlSession对象
session.close();
}
//动态sql where查询
@Test
public void testSelectByWhere(){
//获取SqlSession
SqlSession session= MybatisUtil.getSqlSession();
//获取dao代理
StudentDao dao=session.getMapper(StudentDao.class);
Student student=new Student();
//student.setName("李四");
//student.setAge(20);//where条件 where name =? or age=?
//student.setName("李四");//where条件 where name =?
student.setName(null);
student.setAge(20); //发生错误 条件:where or age=?
//调用方法
List<Student> students=dao.selectwhere(student);
students.forEach(stu-> System.out.println("stu="+stu));
//4.关闭SqlSession对象
session.close();
}
//动态sql foreach循环简单类型
@Test
public void testSelectForeachOne(){
//获取SqlSession
SqlSession session= MybatisUtil.getSqlSession();
//获取dao代理
StudentDao dao=session.getMapper(StudentDao.class);
List<Integer> idlist=new ArrayList<>();
idlist.add(1001);
idlist.add(1002);
idlist.add(1003);
//调用方法
List<Student> students=dao.selectForeachOne(idlist);
students.forEach(stu-> System.out.println("stu="+stu));
//4.关闭SqlSession对象
session.close();
}
//动态sql foreach循环对象类型
@Test
public void testSelectForeachTwo(){
//获取SqlSession
SqlSession session= MybatisUtil.getSqlSession();
//获取dao代理
StudentDao dao=session.getMapper(StudentDao.class);
List<Student> studentsList=new ArrayList<>();
Student s1=new Student();
s1.setId(1001);
Student s2=new Student();
s2.setId(1005);
studentsList.add(s1);
studentsList.add(s2);
//调用方法
List<Student> students=dao.selectForeachTwo(studentsList);
students.forEach(stu-> System.out.println("stu="+stu));
//4.关闭SqlSession对象
session.close();
}
//分页查询条数测试
@Test
public void testPageHelper(){
//获取SqlSession
SqlSession session= MybatisUtil.getSqlSession();
//获取dao代理
StudentDao dao=session.getMapper(StudentDao.class);
//调用PageHelper的方法:
//取第2页,取4个
PageHelper.startPage(1,3);
List<Student> students=dao.selectAllStudent();
students.forEach(stu-> System.out.println("stu="+stu));
//4.关闭SqlSession对象
session.close();
}
}
测试结果1:
2.
3.
4.
5.