mybatis动态SQL语句

Posted pclover11

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mybatis动态SQL语句相关的知识,希望对你有一定的参考价值。

1 动态增加,对象有哪个字段/属性就添加哪个字段。关键标签<sql><trim><include><if>

2 动态更新,对象有哪个字段/属性就更新哪个字段。关键标签<set><if>

3 动态查找,对象有哪个字段/属性就根据哪个字段进行查找。关键标签<where><if>

4 集合属性,关键词 in, 那个字段在某一个集合中,关键标签<foreach>。注意: 如果参数类型是List,则必须在collecion中指定为list, 如果是数据组,则必须在collection属性中指定为 array.

 

例子:

开发流程:

1)引jar文件,参考之前的mybatis开发流程,增删改查

2)实体类Student,

package com.huitong.entity;

public class Student {
    
    private Integer sid;
    private String sname;
    private String sgender;
    private Short sage;
    private Double ssalary;
    
    
    public String getSname() {
        return sname;
    }
    public void setSname(String sname) {
        this.sname = sname;
    }
    public String getSgender() {
        return sgender;
    }
    public void setSgender(String sgender) {
        this.sgender = sgender;
    }
    public short getSage() {
        return sage;
    }
    
    public Integer getSid() {
        return sid;
    }
    public void setSid(Integer sid) {
        this.sid = sid;
    }
    public Double getSsalary() {
        return ssalary;
    }
    public void setSsalary(Double ssalary) {
        this.ssalary = ssalary;
    }
    public void setSage(Short sage) {
        this.sage = sage;
    }
    @Override
    public String toString() {
        return sid + ":"+sname + ":" + sgender + ":" + sage + ":" + ssalary; 
    }
    

}
View Code

3)映射文件StudentMapper.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.huitong.entity.Student">
    <resultMap type="com.huitong.entity.Student" id="studentMap">
        <id column="id" property="sid" />
        <result column="name" property="sname"/>
        <result column="gender" property="sgender"/>
        <result column="age" property="sage"/>
        <result column="salary" property="ssalary"/>
    
    </resultMap>
    
    <sql id="key2">
        <trim suffixOverrides=",">
            <if test="sname != null">name,</if>
            <if test="sgender != null">gender,</if>
            <if test="sage != null">age,</if>
            <if test="ssalary != null">salary,</if>    
        </trim>
    
    </sql>
    <sql id="value2">
    <trim suffixOverrides=",">
        <if test="sname != null">#{sname},</if>
        <if test="sgender != null">#{sgender},</if>
        <if test="sage != null">#{sage},</if>
        <if test="ssalary != null">#{ssalary},</if>    
    </trim>
    </sql>
    
    <sql id="key">
        <trim suffixOverrides=",">
            <if test="pname != null">name,</if>
            <if test="pgender != null">gender,</if>
            <if test="page != null">age,</if>
            <if test="psalary != null">salary,</if>    
        </trim>
    
    </sql>
    <sql id="value">
    <trim suffixOverrides=",">
        <if test="pname != null">#{pname},</if>
        <if test="pgender != null">#{pgender},</if>
        <if test="page != null">#{page},</if>
        <if test="psalary != null">#{psalary},</if>    
    </trim>
    </sql>
    
    
    <insert id="dynamicInsert" parameterType="map">
        INSERT INTO t_student(<include refid="key"></include>) VALUES(<include refid="value"></include>);
    </insert>
    
    <insert id="dynamicInsert2" parameterType="com.huitong.entity.Student">
        INSERT INTO t_student(<include refid="key2"></include>) VALUES(<include refid="value2"></include>);
    </insert>
    
    <delete id="dynamicDelete" parameterType="list">
        
    </delete>
    
    <select id="dynamicGetListByIds" parameterType="list" resultMap="studentMap">
        SELECT id,NAME,gender,age,salary 
        FROM t_student
        where id in
        <foreach collection="list" close=")" item="id" open="(" separator=",">
            #{id}
        </foreach>
        
    </select>
    
    <select id="dynamicGet" parameterType="map" resultMap="studentMap">
        SELECT id,NAME,gender,age,salary 
        FROM t_student
        <where>
            <if test="pid!=null">id=#{pid}</if>
            <if test="pname!=null">and name=#{pname}</if>
            <if test="pgender!=null">and gender=#{pgender}</if>
        </where>
    </select>
    
    <select id="dynamicGetm2" parameterType="com.huitong.entity.Student" resultMap="studentMap">
        SELECT id,NAME,gender,age,salary 
        FROM t_student
        <where>
            <if test="sid!=null">id=#{sid}</if>
            <if test="sname!=null">and name=#{sname}</if>            
            <if test="sgender!=null">and gender=#{sgender}</if>
            <if test="sage!=null">and age=#{sage}</if>    
            <if test="ssalary!=null">and salary=#{ssalary}</if>    
        </where>
    </select>
    
    <update id="dynamicUpdate" parameterType="com.huitong.entity.Student">
        UPDATE t_student
        <set>
            <if test="sname!=null">name=#{sname},</if>
            <if test="sgender!=null">gender=#{sgender},</if>
            <if test="sage!=null">age=#{sage},</if>
            <if test="ssalary!=null">salary=#{ssalary}</if>
        </set>
        WHERE id=#{sid}
    </update>

</mapper>
View Code

4)mybatis配置文件mabits.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>
    <environments default="mysql">
        <environment id="mysql">
            <transactionManager type="jdbc">
            </transactionManager>
            <dataSource type="pooled">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql:///day14?useSSL=true"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            
            </dataSource>
        </environment>
    
    </environments>
    
    <mappers>
        <mapper resource="com/huitong/entity/StudentMapper.xml"/>
    </mappers>

</configuration>
View Code

5)工具类,获取sqlSession,关闭sqlSession

package com.huitong.util;

import java.io.IOException;
import java.io.Reader;

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 MybatisUtil {
    
    private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
    private static SqlSessionFactory sqlSessionFactory ;
    
    static {
        try {
            Reader reader = Resources.getResourceAsReader("mybatis.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }
    
    public static SqlSession getSqlSession(){
        SqlSession sqlSession = threadLocal.get();
        if(sqlSession==null){
            sqlSession = sqlSessionFactory.openSession();
            threadLocal.set(sqlSession);
        }
        
        return sqlSession;
    }
    
    public static void closeSqlSession(){
        SqlSession sqlSession = threadLocal.get();
        if(sqlSession!=null){
            sqlSession.close();
            threadLocal.remove();
        }
        
    }

}
View Code

6)Dao类StudentDao

package com.huitong.dao;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.ibatis.session.SqlSession;

import com.huitong.entity.Student;
import com.huitong.util.MybatisUtil;

public class StudentDao {
    
    public void dynamicInsert(String name, String gender, Short age, Double salary) throws Exception{
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("pname", name);
        map.put("pgender", gender);
        map.put("page", age);
        map.put("psalary", salary);
        
        try {
            sqlSession.insert(Student.class.getName() + ".dynamicInsert", map);
            sqlSession.commit();
            
            
        } catch(Exception e) {
            e.printStackTrace();
            sqlSession.rollback();
            
        } finally {
            MybatisUtil.closeSqlSession();
            
        }
        
    }
    
    public void dynamicInsert2(Student stu) throws Exception{
        SqlSession sqlSession = MybatisUtil.getSqlSession();
        
        try {
            sqlSession.insert(Student.class.getName() + ".dynamicInsert2", stu);
            sqlSession.commit();
                        
        } catch(Exception e) {
            e.printStackTrace();
            sqlSession.rollback();
            throw new RuntimeException(e);
            
        } finally {
            MybatisUtil.closeSqlSession();
            
        }
        
    }
    
    public void dynamicDelete(List<Integer> list) throws Exception{
        SqlSession sqlSession;
        
        try {
            sqlSession = MybatisUtil.getSqlSession();
            
        } catch(Exception e) {
            
        } finally {
            
        }
    }
    
    public List<Student> dynamicGetListByIds(List<Integer> ids) throws Exception{
        SqlSession sqlSession;
        try {
            sqlSession = MybatisUtil.getSqlSession();
            return sqlSession.selectList(Student.class.getName() + ".dynamicGetListByIds", ids);
            
        } catch(Exception e){
            e.printStackTrace();
            throw new RuntimeException(e);
            
        } finally {
            MybatisUtil.closeSqlSession();
        }
    }
    
    public List<Student> dynamicGet(Integer id, String name, String gender) throws Exception{
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("pid", id);
        map.put("pname", name);
        map.put("pgender", gender);
        SqlSession sqlSession;
        
        try {
            sqlSession = MybatisUtil.getSqlSession();
            return sqlSession.selectList(Student.class.getName() + ".dynamicGet", map);
            
            
        } catch(Exception e){
            e.printStackTrace();
            throw new RuntimeException(e);
            
        }finally{
            MybatisUtil.closeSqlSession();
            
        }
    }
    
    public List<Student> dynamicGetm2(Student stu) throws Exception{
        SqlSession sqlSession;
        try {
            sqlSession = MybatisUtil.getSqlSession();
            return sqlSession.selectList(Student.class.getName() + ".dynamicGetm2", stu);
            
        } catch(Exception e) {
            e.printStackTrace();
            throw new RuntimeException(e);
            
        } finally {
            MybatisUtil.closeSqlSession();
        }
    }
    
    public void dynamicUpdate(Student stu)throws Exception{
        SqlSession sqlSession=null;
        
        try {
            sqlSession = MybatisUtil.getSqlSession();
            sqlSession.update(Student.class.getName() + ".dynamicUpdate", stu);
            sqlSession.commit();
            
        } catch(Exception e){
            e.printStackTrace();
            sqlSession.rollback();
            throw new RuntimeException(e);
            
        } finally{
            MybatisUtil.closeSqlSession();
            
        }
    }
    
    public static void main(String[] args) {
        StudentDao studentDao = new StudentDao();
        Student student = new Student();

        student.setSid(2);
        student.setSgender("");
        student.setSage((short)14);
        
        try {
            
            studentDao.dynamicUpdate(student);
            
            System.out.println("update success");
            
        } catch (Exception e) {
            e.printStackTrace();
            
        } 
        
    }

}
View Code

 

以上是关于mybatis动态SQL语句的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis超强大的动态SQL大全

mybatis 动态SQL .2

mybatis 详解------动态SQL

mybatis 详解------动态SQL

MyBatis:动态sql语句

MyBatis-05-笔记