MyBatis动态sql等知识点总结

 

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 &lt; #{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&amp;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.

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

喵俺第一专栏

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值