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 (?,?,?,?)

  • 相关阅读:
    Jboss下jaxws的开发
    Jboss as 服务器基本设置
    classloader常见问题总结
    Servlet容器 Jetty
    Jetty 的工作原理以及与 Tomcat 的比较
    resin设置jvm参数
    Solr4.0使用
    Solr 4.0部署
    Solr 搜索功能使用
    HttpSolrServer 实例管理参考,来自org.eclipse.smila.solr
  • 原文地址:https://www.cnblogs.com/figsprite/p/10749905.html
Copyright © 2011-2022 走看看