zoukankan      html  css  js  c++  java
  • 动态SQL3

    Oracle的批量操作

        Oracle不支持VALUES(),(),()这种方式,所以不能用上一节所讲的方法。

    有时候业务会包含很多次数据库操作,为了减少数据库连接,我们会选择一次提交大量sql,

    这时我们会用到begin end,使用begin end需要注意的是,每个sql语句都要确保以";"结尾,代表一句sql结束。

    1. begin  
    2. insert into tb_employee(id,last_name,email,gender,d_id) VALUES  
    3. (employee_seq.nextval,'Maya','mcl@qq.com','0',1);  
    4. insert into tb_employee(id,last_name,email,gender,d_id) VALUES  
    5. (employee_seq.nextval,'Kafka','kafsl@qq.com','0',2);  
    6. end;  

    还可以利用中间表,进行批量插入,这部分不熟悉,先跳过,有兴趣的朋友可以深入了解一下,

    1. <insert id="addEmps">  
    2.     begin  
    3.     <foreach collection="emps" item="emp">  
    4.         insert into tb_employee(id,last_name,email,gender,d_id) VALUES  
    5.         (tb_employee_seq.nextval,#{emp.lastName},#{emp.email},#{emp.gender},#{emp.department.id});  
    6.     </foreach>  
    7.     end
    8. </insert>  

    内置参数

        不只是方法传入的参数可以被用来判断、取值,我们还可以使用两个默认的内置参数:_parameter,_databaseId

    _parameter:代表整个参数

        单个参数:_ parameter就是这个参数

        多个参数:参数会被封装成一个map; _parameter就是代表这个map

    _databaseId:如果配置了<databaseIdProvider>标签,那么_databaseId就会有值

        _databaseId就代表当前数据库的别名

    1. <select id="getEmpsTestInnerParameter" resultType="com.figsprite.bean.Employee">  
    2.     <if test="_databaseId='mysql'">  
    3.         select * from tb_employee  
    4.     </if>  
    5.     <if test="_databaseId='oracle'">  
    6.         select * from tb_employee  
    7.     </if>  
    8. </select>  
    1. <select id="getEmpsTestInnerParameter" resultType="com.figsprite.bean.Employee">  
    2.         select * from tb_employee  
    3.         <if test="_parameter!=null">  
    4.           where last_name = #{_parameter.lastName}  
    5.         </if>  
    6. </select>  

    <bind>标签

        这个标签可以将OGNL表达式的值绑定到一个变量中,方便后来引用这个变量的值

        举个例子,我们之前模糊查询的时候出入Employee对象时,要设定它的lastName为"%青%",也就是说这个%,是要认为拼接的,可是有些人,希望只写一个"青",让%由框架帮我们提供,那该怎么办?

    1.     <select id="getEmpsTestInnerParameter" resultType="com.figsprite.bean.Employee">  
    2.         select * from tb_employee  
    3.         <if test="_parameter!=null">  
    4.           where last_name like `%#{ lastName}%` 
    5.         </if>  
    6. </select>  

    这么写行不行?肯定不行,like后面是要作为整体传入数据库查询的,这时候${}就派上用场了,

    1. <select id="getEmpsTestInnerParameter" resultType="com.figsprite.bean.Employee">  
    2.         select * from tb_employee  
    3.         <if test="_parameter!=null">  
    4.           where last_name like '%${ lastName}%'  
    5.         </if>  
    6. </select>  

    由于${}不会进行预编译,所以它会将拼装完成的SQL语句传入数据库,这样就不会出问题了,当然这样不安全,所以我们希望还是使用#{},这样就不得不用<bind>标签了

    1. <select id="getEmpsTestInnerParameter" resultType="com.figsprite.bean.Employee">  
    2.     <bind name="_lastName" value="'%'+ lastName+'%'"/>  
    3.     select * from tb_employee  
    4.     <if test="_parameter!=null">  
    5.         where last_name like #{_lastName}  
    6.     </if>  
    7. </select>

    <sql>标签

        用于抽取重用的sql语句,比如我们上面的例子中,下面的语句使用了多次,这时就可以考虑使用<sql>标签。

    last_name,email,gender,d_id

    1. <sql id="column">  
    2.       last_name,email,gender,d_id  
    3. </sql>  

    接着将原先是这句话的sql语句,用<include>标签替换

    1. <insert id="addEmps">  
    2.     <foreach collection="emps" item="emp" separator=";">  
    3.         INSERT INTO tb_employee(<include refid="column"></include>) VALUES  
    4.         (#{emp.lastName},#{emp.email},#{emp.gender},#{emp.department.id})  
    5.     </foreach>  
    6. </insert>  
    1. @Test  
    2. public void TestSaveBach() throws IOException {  
    3.     SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();  
    4.     SqlSession openSession = sqlSessionFactory.openSession(true);  
    5.     Department department = new Department(2);  
    6.     Employee e1 = new Employee("Wendy","0","adcxs@qq.com",department);  
    7.     Employee e2 = new Employee("Diyago","1","aaasaadccjdjj@qq.con",department);  
    8.     List<Employee> employeeList = new ArrayList<>();  
    9.     employeeList.add(e1);  
    10.     employeeList.add(e2);  
    11.     try{  
    12.         EmployeeMapperDynamic mapper = openSession.getMapper(EmployeeMapperDynamic.class);  
    13.         mapper.addEmps(employeeList);  
    14.     }finally {  
    15.         openSession.close();  
    16.     }  
    17. }  

    我们还可以通过<property>标签,自定义一些属性

    1. <insert id="addEmps">  
    2.     <foreach collection="emps" item="emp" separator=";">  
    3.         INSERT INTO tb_employee(  
    4.             
    5.         <include refid="column">  
    6.             <property name="testColumn" value="test"/>  
    7.         </include>  
    8.         ) VALUES  
    9.         (#{emp.lastName},#{emp.email},#{emp.gender},#{emp.department.id})  
    10.     </foreach>  
    11. </insert> 

    注意这里是用${}取值的

    1. <sql id="column">  
    2.       last_name,email,gender,d_id,${testColumn}  
    3. </sql>  

    DEBUG [main] - ==> Preparing: INSERT INTO tb_employee( last_name,email,gender,d_id,test ) VALUES (?,?,?,?) ; INSERT INTO tb_employee( last_name,email,gender,d_id,test ) VALUES (?,?,?,?)

  • 相关阅读:
    HTML DOM 06 节点关系
    HTML DOM 05 事件(三)
    HTML DOM 05 事件(二)
    HTML DOM 05 事件(一)
    html DOM 04 样式
    html DOM 03 节点的属性
    html DOM 02 获取节点
    html DOM 01 节点概念
    JavaScript 29 计时器
    JavaScript 28 弹出框
  • 原文地址:https://www.cnblogs.com/figsprite/p/10749905.html
Copyright © 2011-2022 走看看