`

MyBatis3动态SQL

阅读更多
1. MyBatis3动态SQL

1. if 条件

2. choose,when和otherwise条件

3. where条件
1) 自动加上where;
2) 如果where子句以and或者or开头,则自动删除第一个and或者or;

4. trim条件
功能和where元素类似,提供了前缀,后缀功能,更加灵活;
prefix="where":表示加入前缀where;
prefixOverrides="and|or":表示自动覆盖第一个"and"或者"or";

5. foreach循环

6. set条件
1) 自动加上set;
2) 自动剔除最后一个逗号",";


2. 动态SQL实例

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/db_mybatis
jdbc.username=root
jdbc.password=root


<?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"/>
    <typeAliases>
        <package name="com.andrew.model"/>
    </typeAliases>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driverClassName}" />
                <property name="url" value="${jdbc.url}" />
                <property name="username" value="${jdbc.username}" />
                <property name="password" value="${jdbc.password}" />
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <package name="com.andrew.mappers"/>
    </mappers>
</configuration>


package com.andrew.util;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class SqlSessionFactoryUtil {
    private static SqlSessionFactory sqlSessionFactory;
    public static SqlSessionFactory getSqlSessionFactory() {
        if(sqlSessionFactory==null){
            InputStream inputStream=null;
            try {
        inputStream=Resources.getResourceAsStream("mybatis-config.xml");
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            } catch(Exception e) {
                e.printStackTrace();
            }
        }
        return sqlSessionFactory;
    }
    public static SqlSession openSession() {
        return getSqlSessionFactory().openSession();
    }
}


package com.andrew.model;
public class Student {
    private Integer id;
    private String name;
    private Integer age;
    public Student() {
        super();
    }
    public Student(String name, Integer age) {
        super();
        this.name = name;
        this.age = age;
    }
    public Student(Integer id, String name, Integer age) {
        super();
        this.id = id;
        this.name = name;
        this.age = age;
    }
    @Override
    public String toString() {
        return "Student [id=" + id + ", name=" + name + ", age=" + age + "]";
    }
    // getter and setter
}


package com.andrew.mappers;
import java.util.List;
import java.util.Map;
import com.andrew.model.Student;
public interface StudentMapper {
    public List<Student> searchStudents(Map<String,Object> map);
    public List<Student> searchStudents2(Map<String,Object> map);
    public List<Student> searchStudents3(Map<String,Object> map);
    public List<Student> searchStudents4(Map<String,Object> map);
    public List<Student> searchStudents5(Map<String,Object> map);
    public int updateStudent(Student student);
}


<?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.andrew.mappers.StudentMapper">
    <resultMap type="Student" id="StudentResult">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="age" column="age"/>
    </resultMap>
    <select id="searchStudents" parameterType="Map" resultMap="StudentResult">
        select * from t_student 
        where gradeId = #{gradeId}
        <if test="name!=null">
            and name like #{name}
        </if>
        <if test="age!=nulll">
            and age = #{age}
        </if>
    </select>
    <select id="searchStudents2" parameterType="Map" resultMap="StudentResult">
        select * from t_student 
        <choose>
            <when test="searchBy=='gradeId'">
                 where gradeId = #{gradeId}
             </when>
             <when test="searchBy=='name'">
                 where name like #{name}
             </when>
             <otherwise>
                 where age = #{age}
             </otherwise>
        </choose>
    </select>
    <select id="searchStudents3" parameterType="Map" resultMap="StudentResult">
        select * from t_student 
        <where>
            <if test="gradeId!=null">
                gradeId = #{gradeId}
            </if>
            <if test="name!=null">
                and name like #{name}
            </if>
            <if test="age!=nulll">
                and age = #{age}
            </if>
        </where>
    </select>
    <select id="searchStudents4" parameterType="Map" resultMap="StudentResult">
        select * from t_student 
        <trim prefix="where" prefixOverrides="and|or">
            <if test="gradeId!=null">
                gradeId = #{gradeId}
            </if>
            <if test="name!=null">
                 and name like #{name}
            </if>
            <if test="age!=nulll">
                 and age = #{age}
            </if>
        </trim>
    </select>
    <select id="searchStudents5" parameterType="Map" resultMap="StudentResult">
        select * from t_student 
        <if test="gradeIds!=null">
            <where>
                 gradeId in 
                 <foreach item="gradeId" collection="gradeIds" open="(" separator="," close=")">
                     #{gradeId}
                 </foreach>
             </where>
        </if>
    </select>
    <update id="updateStudent" parameterType="Student">
        update t_student
        <set>
            <if test="name!=null">
                name=#{name},
            </if>
            <if test="age!=null">
                age=#{age},
            </if>
        </set>
        where id=#{id}
    </update>
</mapper>


package com.andrew.service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.andrew.mappers.StudentMapper;
import com.andrew.model.Student;
import com.andrew.util.SqlSessionFactoryUtil;
public class StudentJunitTest {
    private static Logger logger = Logger.getLogger(StudentJunitTest.class);
    private SqlSession sqlSession = null;
    private StudentMapper studentMapper = null;
    @Before
    public void setUp() throws Exception {
        sqlSession = SqlSessionFactoryUtil.openSession();
        studentMapper = sqlSession.getMapper(StudentMapper.class);
    }
    @After
    public void tearDown() throws Exception {
        sqlSession.close();
    }
    @Test
    public void testSearchStudents1() {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("gradeId", 2);
        // map.put("name", "%3%");
        // map.put("age", 23);
        List<Student> studentList = studentMapper.searchStudents(map);
        for (Student student : studentList) {
            System.out.println(student);
        }
    }
    @Test
    public void testSearchStudents2() {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("searchBy", "gradeId");
        map.put("gradeId", 2);
        map.put("name", "%6%");
        map.put("age", 22);
        List<Student> studentList = studentMapper.searchStudents2(map);
        for (Student student : studentList) {
            System.out.println(student);
        }
    }
    @Test
    public void testSearchStudents3() {
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("gradeId", 2);
        map.put("name", "%李%");
        map.put("age", 11);
        List<Student> studentList = studentMapper.searchStudents3(map);
        for (Student student : studentList) {
            System.out.println(student);
        }
    }
    @Test
    public void testSearchStudents4() {
        Map<String, Object> map = new HashMap<String, Object>();
        // map.put("gradeId", 2);
        // map.put("name", "%五%");
        map.put("age", 22);
        List<Student> studentList = studentMapper.searchStudents4(map);
        for (Student student : studentList) {
            System.out.println(student);
        }
    }
    @Test
    public void testSearchStudents5() {
        Map<String, Object> map = new HashMap<String, Object>();
        List<Integer> gradeIds = new ArrayList<Integer>();
        // gradeIds.add(1);
        gradeIds.add(2);
        map.put("gradeIds", gradeIds);
        List<Student> studentList = studentMapper.searchStudents5(map);
        for (Student student : studentList) {
            System.out.println(student);
        }
    }
    @Test
    public void testUpdateStudent() {
        Student student = new Student();
        student.setId(1);
        student.setName("张三2");
        student.setAge(12);
        studentMapper.updateStudent(student);
        sqlSession.commit();
    }
}
分享到:
评论

相关推荐

    Mybatis3动态SQL物理分页

    Mybatis的自带分页方法只是逻辑分页,如果数据量很大,内存会溢出, 不知道为什么开源组织不在里面实现类似Hibernate的物理分页处理方法。 在不改动Mybatis源代码的情况下实现Mybatis支持物理分页

    mybatis之动态SQL

    动态 SQL 是 MyBatis 的一大特色,它允许我们在运行时根据条件构建 SQL 语句,极大地提高了代码的可维护性和灵活性。 动态 SQL 在 MyBatis 中主要通过 XML 映射文件或者注解来实现。在 XML 映射文件中,我们可以...

    mybatis动态sql.zip

    mybatis动态sql,动态sql解析引擎,类似mybatis动态sql的功能。 mybatis动态sql,动态sql解析引擎,类似mybatis动态sql的功能。mybatis动态sql,动态sql解析引擎,类似mybatis动态sql的功能。mybatis动态sql,...

    mybatis 动态sql及参数传递

    在实际开发过程中,我们往往需要编写复杂的SQL语句,拼接稍有不注意就会导致错误,Mybatis给开发者提供了动态SQL,大大降低了拼接SQL导致的错误。 动态标签 if标签 if标签通常用那个胡where语句,update语句,insert...

    MyBatis动态拼接SQL

    这就是MyBatis动态SQL的功能所在。 动态SQL是MyBatis的一大特色,它使得我们能够在运行时根据条件构建SQL语句。MyBatis通过`&lt;if&gt;`, `&lt;choose&gt;`, `&lt;when&gt;`, `&lt;otherwise&gt;`, `&lt;where&gt;`, `&lt;set&gt;`, `&lt;foreach&gt;`等标签来...

    《一头扎进MyBatis3》第六讲 动态SQL的实现

    在《一头扎进MyBatis3》第六讲中,你将会详细学习如何在MyBatis的配置文件中使用这些标签,以及如何通过Mapper接口和SqlSession来执行动态SQL。通过实践和理解,你将能更好地掌握MyBatis动态SQL的精髓,提高你的开发...

    mybatis直接执行sql语句后续之一

    1. **动态SQL**:MyBatis的一个强大特性是其支持动态SQL,允许在XML映射文件或注解中构建SQL语句。比如,我们可以使用`&lt;if&gt;`、`&lt;choose&gt;`、`&lt;when&gt;`、`&lt;otherwise&gt;`、`&lt;where&gt;`等标签来根据条件动态地插入、删除或...

    MyBatis动态SQL,MyBatis批量插入(Oracle数据库)[收集].pdf

    MyBatis动态SQL和批量插入的应用 MyBatis是一款功能强大且灵活的持久层框架,提供了多种方式来对数据库进行交互。其中,动态SQL是一种非常强大的特性,能够根据不同的条件生成不同的SQL语句。下面将详细介绍MyBatis...

    mybatis动态SQL语句

    if 、where、set、trim、choose 、foreach等在mybatis中的具体用法,有具体实例可供参考,玩转mybatis

    MyBatis 动态 SQL 示例

    附件是MyBatis 动态 SQL 示例,MyBatis 是一个持久层框架,它允许用户在 XML 文件中编写动态 SQL 语句。MyBatis 的动态 SQL 功能非常强大,它允许开发者根据运行时的条件动态地生成 SQL 语句。这使得 MyBatis 能够...

    MyBatis 动态SQL示例

    附件是MyBatis 动态SQL示例,MyBatis 是一个持久层框架,它允许用户在 XML 文件中编写动态 SQL 语句。MyBatis 的动态 SQL 功能非常强大,它允许开发者根据运行时的条件动态地生成 SQL 语句。这使得 MyBatis 能够灵活...

    mybatis慢SQL插件

    基于mybatis的慢SQL小插件,原理是mybatis拦截器。只需要在springboot的配置文件做简单的配置,mybatis拦截器将SQL中所有参数自动做了填充。拦截器监控慢SQL并将完整的可执行的SQL语句打印在日志文件中,复制该SQL...

    mybatis中进行sqlserver分页

    mybatis中,sqlserver分页

    mybatis如何防止SQL注入

    在使用MyBatis框架开发应用程序时,合理使用参数绑定技术(如`#{}`)以及对动态参数进行有效的过滤处理是防止SQL注入的关键。通过对MyBatis的正确配置和编程实践,可以大大降低应用程序面临的SQL注入风险,确保系统...

    Mybatis实现动态代理,动态SQL

    "Mybatis实现动态代理,动态SQL" Mybatis框架可以通过配置的形式为DAO接口生成动态代理实现类,从而简化程序开发,提高开发效率。在实现动态代理时,需要满足以下条件:接口全命名必须和SQL映射文件中的namespace...

    mybatis动态sql上传

    mybatis动态sql批量增删改查,增强了mybatis的认识。

    什么是mybatis动态sql以及学习mybatis动态sql的意义

    ### 什么是MyBatis动态SQL MyBatis作为一种流行的Java持久层框架,为开发者提供了将数据库操作与Java对象之间的映射进行简化的便捷方法。它不仅支持传统的SQL查询方式,还引入了动态SQL这一概念,这使得MyBatis在...

    mybatissql_mybatis解决sql注入

    标题 "mybatissql_mybatis解决sql注入" 暗示了我们正在讨论MyBatis框架如何处理SQL注入问题。SQL注入是一种常见的安全漏洞,攻击者可以通过恶意输入篡改SQL查询,获取、修改或删除数据库中的敏感数据。MyBatis,作为...

    ideal mybatis打印sql插件

    把 mybatis 输出的sql日志还原成完整的sql语句。 将日志输出的sql语句中的问号 ? 替换成真正的参数值。 通过 "Tools -&gt; MyBatis Log Plugin" 菜单或快捷键 "Ctrl+Shift+Alt+O" 启用。 点击窗口左边的 "Filter" ...

Global site tag (gtag.js) - Google Analytics