zoukankan      html  css  js  c++  java
  • mybatis动态SQL语句

    1、 动态SQL
    就是通过传入的参数不一样,可以组成不同结构的SQL语句,这种根据参数的条件修改SQL结构的SQL语句称为动态SQL语句。

    动态SQL作用:
    (1)根据条件组装不同结构的SQL语句,可以提高SQL代码的重用性.
    (2)满足某些特定需求,如条件判断查询


    2、动态SQL标签包括
    <sql>标签:用于声明公有的SQL语句块,在操作标签中使用<include>调用
    <if>标签:类似java的if(){},用于判断
    <foreach>标签:类似java的foreach循环,一般用户批量处理的SQL语句
    <trim>标签:切割标签,主要用于切割关键字的头和尾的字符
    <set>标签:可以在update的时候set 关键字后面的,sql语句最后的逗号可以自动忽略
    <where>:where后面的条件都不成立,忽略where关键字.
    <choose> <when> <otherwise> : 类似java的swithc case选择语句

    基于配置文件的mubatis动态SQL入门事例(以操作MySql数据库为例)
    第一步:创建项目,导入jar包

    第二步:配置xml规则文件

    <?xml version="1.0" encoding="UTF-8"?>

    <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "mybatis-3-config.dtd" >

    <configuration>

        <environments default="hzh">

            <environment id="hzh">

                <transactionManager type="JDBC"></transactionManager>

                <dataSource type="POOLED">

                    <!-- 配置四要素 -->

                    <property name="driver" value="org.gjt.mm.mysql.Driver" />

                    <property name="url" value="jdbc:mysql://localhost:3306/hzh" />

                    <property name="username" value="root" />

                    <property name="password" value="123" />

                </dataSource>

            </environment>

        </environments>

     

        <!-- 配置指定加载的映射文件 -->

        <mappers>

            <mapper resource="cn/hzh/mapper/xml/StudentMapper.xml" />

        </mappers>

    </configuration>

    第三步:创建一个MybatisUtils,获得Session

    package cn.hzh.utils;

     

    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 MybatisUtils {

        //创建私有一个会话工厂。

        public static final SqlSessionFactory SSF=createSSF();

     

        //声明一个线程变量

        private static final ThreadLocal<SqlSession> THREAD_LOCAL=new ThreadLocal<>();

     

     

        //1.获得会话工厂

        private static SqlSessionFactory createSSF(){

      

            try {

                //读取配置文件

                Reader reader = Resources.getResourceAsReader("mybatis-config.xml");

                //创建会话工厂构建类对象

                SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();

                //构建会话工厂

                return builder.build(reader);

            } catch (IOException e) {

                e.printStackTrace();

            }

            return null;

        }

       

        //2.获得会话

        public static SqlSession getSession(){

            if (THREAD_LOCAL.get()==null) {

                SqlSession session = SSF.openSession();

                //将对象放在线程变量里面

                THREAD_LOCAL.set(session);

            }

            //如果已经有该会话。直接返回线程变量的会话对象。

            return THREAD_LOCAL.get();

        }

       

        //使用了线程变量,在关闭会话的时候,需要清除线程变量的对象;。

        public static void close(){

            if (THREAD_LOCAL.get()!=null) {

                SqlSession session = THREAD_LOCAL.get();

                session.close();

                THREAD_LOCAL.remove();

            }

        }

       //测试数据库是否连接成功

        public static void main(String[] args) {

            System.out.println(MybatisUtils.getSession());

            System.out.println(MybatisUtils.getSession());

        }

    }


    第四步:创建一个操作接口和实体类

    package cn.hzh.mapper;

     

    import java.util.List;

    import cn.hzh.pojo.Student;

     

    public interface StudentMapper {

     

        //批量插入多条语句

        int batchInsert(List<Student> list);

       

    }

    package cn.hzh.pojo;

     

    import java.io.Serializable;

    import java.util.Date;

     

    public class Student implements Serializable{

       

        private static final long serialVersionUID = 1L;

       

        private Long studentId;//学生ID

        private String studentName;//学生用户名

        private String studentPassword;//学生密码

        private Date createDate;//创建日期

       

        public Student(String studentName, String studentPassword, Date createDate) {

            super();

            this.studentName = studentName;

            this.studentPassword = studentPassword;

            this.createDate = createDate;

        }

       

        public Long getStudentId() {

            return studentId;

        }

        public void setStudentId(Long studentId) {

            this.studentId = studentId;

        }

        public String getStudentName() {

            return studentName;

        }

        public void setStudentName(String studentName) {

            this.studentName = studentName;

        }

        public String getStudentPassword() {

            return studentPassword;

        }

        public void setStudentPassword(String studentPassword) {

            this.studentPassword = studentPassword;

        }

        public Date getCreateDate() {

            return createDate;

        }

        public void setCreateDate(Date createDate) {

            this.createDate = createDate;

        }

       

    }

    第五步:创建映射文件

    <?xml version="1.0" encoding="UTF-8"?>

    <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "mybatis-3-mapper.dtd" >

    <mapper namespace="cn.hzh.mapper.StudentMapper">

        <!-- 使用foreach标签,循环拼接sql语句 -->

        <!-- collection:指定集合的类型,item:变量,指定循环返回的值或对象 -->

        <!-- separator:每次循环后面都追加一个",",但最后一次不追加 -->

        <insert id="batchInsert">

            INSERT INTO t_student(studentName, studentPassword, createDate) VALUES

            <foreach collection="collection" item="item" separator=",">

                (#{item.studentName}, #{item.studentPassword}, #{item.createDate})

            </foreach>

        </insert>

    </mapper>

     

    第六步:在src下创建一个log4j.properties文件,配置日志输出格式

    log4j.rootLogger=DEBUG,A1

    log4j.appender.A1=org.apache.log4j.ConsoleAppender

    log4j.appender.A1.layout=org.apache.log4j.PatternLayout

    log4j.appender.A1.layout.ConversionPattern=%-4r%-5p[%t]%37c%3x-%m%n

    log4j.logger.org.apache.ibatis=ERROR

    第七步:编写测试类

    package cn.hzh.test;

     

    import java.util.ArrayList;

    import java.util.Date;

    import java.util.List;

    import org.apache.ibatis.session.SqlSession;

    import org.junit.Test;

    import cn.hzh.mapper.StudentMapper;

    import cn.hzh.pojo.Student;

    import cn.hzh.utils.MybatisUtils;

     

    public class StudentMapperTest {

       

        @Test

        public void insert(){

            try {

                SqlSession session = MybatisUtils.getSession();

                StudentMapper studentMapper = session.getMapper(StudentMapper.class);

     

                List<Student> list = new ArrayList<>();

                Student student1 =new Student("lisaa", "123123", new Date());

                Student student2 =new Student("lsss", "123123", new Date());

                list.add(student1);

                list.add(student2);

                int batchInsert = studentMapper.batchInsert(list);

                session.commit();

               

                System.out.println(batchInsert);

                MybatisUtils.close();

            } catch (Exception e) {

                e.printStackTrace();

            }

        }

    }

  • 相关阅读:
    入职一家新公司
    简单的线性数据比较
    python编程导论读书笔记【4】终章
    Hadoop构建数据仓库实践读书笔记【3】__数据仓库设计基础
    清北最后冲刺 张浩威 吃鱼
    新汉诺塔
    小朋友的数字
    硬币购物
    HH的项链
    求逆序对 && 逆序对数列
  • 原文地址:https://www.cnblogs.com/ong-zhanhon/p/10792916.html
Copyright © 2011-2022 走看看