iBatis学习笔记

来源:互联网 发布:通货膨胀率 知乎 编辑:程序博客网 时间:2024/06/15 13:54
iBatis学习笔记

SqlMapConfig.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"

"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">

<sqlMapConfig>
     <settings useStatementNamespaces="true"/>
     <transactionManager type="JDBC">
        <dataSource type="SIMPLE">
          <property name="JDBC.Driver" 
               value="com.mysql.jdbc.Driver"/>
          <property name="JDBC.ConnectionURL"
               value="jdbc:mysql://localhost:3306/mybatis"/>
          <property name="JDBC.Username" value="root"/>
          <property name="JDBC.Password" value="123456"/>
        </dataSource>
      </transactionManager>
     <sqlMap resource="com/config/Employee.xml"/> 
</sqlMapConfig>

Employee.xml文件
<!--创建插入操作-->
<sqlMap namespace="Employee">
<insert id="insert" parameterClass="Employee">
      insert into EMPLOYEE(first_name, last_name, salary)
      value(#first_name#, #last_name#, #salary#)
    <selectKey resultClass="int" keyProperty="id">
          select last_insert_id() as id
    </selectKey>
</insert>
</sqlMap>
这里parameterClass:可以采取一个值作为字符串,整型,浮点型,double或根据要求任何类的对象。在这个例子中,我们将通过Employee对象作为参数而调用SqlMap类的insert方法。
如果您的数据库表使用IDENTITY,AUTO_INCREMENT或串行列或已定义的SEQUENCE/GENERATOR,可以使用<selectKey>元素在的<insert>语句中使用或返回数据库生成的值。

IbatisInsert.java文件:

public class IbatisInsert{
  public static void main(String[] args) throws IOException,SQLException{

Reader rd = Resources.getResourceAsReader("SqlMapConfig.xml");

    SqlMapClient smc = SqlMapClientBuilder.buildSqlMapClient(rd);

   /* This would insert one record in Employee table. */
   System.out.println("Going to insert record.....");
   Employee em = new Employee("Zara", "Ali", 5000);

    smc.insert("Employee.insert", em);

   System.out.println("Record Inserted Successfully ");

  }


<!--读取操作-->
<select id="getAll" resultClass="Employee">
    select * from EMPLOYEE
</select>

    List <Employee> employeeList = (List<Employee>)smc.queryForList("Employee.getAll", null);

<!--更新操作-->

<update id="update" parameterClass="Employee">
    UPDATE EMPLOYEE
    SET   first_name = #first_name#
    where id=#id#
</update>

    Employee employee1 = new Employee();
    employee1.setId(1);
    employee1.setFirstName("roma");
    smc.update("Employee.update", employee1); 

<!--删除操作-->
<delete id="delete" parameterClass="int">
    DELETE FORM EMPLOYEE
    WHERE id=#id#
</delete>

    int id = 1;
    smc.delete("Employee.delete", id);

在这里,我们将修改Employee.xml文件介绍<resultMap></ resultMap>标记。

这个标签就必须在我们<select>标记的resultMap属性运行此结果映射这是需要一个id。


<!--using ResultMap结果映射-->
<resultMap id="result" class="Employee">
    <result property="id" column="id"/>
    <result property="first_name" column="first_name"/>
    <result property="last_name" column="last_name"/>
    <result property="salary" column="salary"/>
</resultMap>
<select id="useResultMap" resultMap="result">
    SELECT * FROM EMPLOYEE
    WHERE id=#id#
</select>

int id = 1;
Employee employee3 = smc.queryForObject("Employee.useResult", id);


<!--存储过程-->


MySQL创建存储过程

  DELIMITER $$

  DROP PROCEDURE IF EXISTS `testdb`.`getEmp` $$
  CREATE PROCEDURE `testdb`.`getEmp` 
     (IN empid INT)
  BEGIN
     SELECT * FROM EMPLOYEE
     WHERE ID = empid;
  END $$

  DELIMITER;

在这里,我们将修改Employee.xml文件介绍<procedure></procedure>和<parameterMap></parameterMap>标记。
这里<procedure></procedure>标签将有一个id,我们会用我们的应用程序来调用存储过程。

<!--使用存储过程-->
<procedure id="getEmpInfo" resultMap="Employee" parameterMap="getEmpInfoCall">
    { call getEmp(#accID#) }
</procedure>
<parameterMap id="getEmpInfoCall" class="map">
    <parameter property="accID" jdbcType="INT" javaType="java.lang.Integer" mode="IN"/>
</parameterMap>

int id = 1;
Employee employee6 = smc.queryForObject("Employee.getEmpInfo", id);

<!--动态SQL-->
使用动态查询是iBatis一个非常强大的功能。有时你已经改变WHERE子句条件的基础上你的参数对象的状态。
在这种情况下的iBATIS提供了一组可以映射语句中使用,以提高SQL语句的重用性和灵活性的动态SQL标签。
有的逻辑是使用一些额外的标签放在:XML文件。下面是一个例子,其中的SELECT语句将努力在两个方面:
如果想传递一个ID,然后它会返回所有与该ID的记录,
否则,将返回所有雇员ID为NULL的记录。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap 
PUBLIC "-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">

<sqlMap namespace="Employee">
<select id="findByID" resultClass="Employee">
   SELECT * FROM EMPLOYEE
   <dynamic prepend="WHERE ">
      <isNull property="id">
         id IS NULL
      </isNull>
      <isNotNull property="id">
         id = #id#
      </isNotNull>
   </dynamic>
</select>
</sqlMap>

可以使用<isNotEmpty>标签如下检查条件。在此条件下将增加,只有当通过属性不为空。
..................
<select id="findByID" resultClass="Employee">
   SELECT * FROM EMPLOYEE
   <dynamic prepend="WHERE ">
      <isNotEmpty property="id">
           id = #id#
      </isNotEmpty>
   </dynamic>
</select>
..................

如果想查询对id和/或雇员的名字选取。SELECT语句如下:

..................
<select id="findByID" resultClass="Employee">
   SELECT * FROM EMPLOYEE
   <dynamic prepend="WHERE ">
      <isNotEmpty prepend="AND" property="id">
           id = #id#
      </isNotEmpty>
      <isNotEmpty prepend="OR" property="first_name">
           first_name = #first_name#
      </isNotEmpty>
   </dynamic>
</select>
..................

要定义使用iBATIS SQL映射语句,我们将增加在以下文件Employee.xml修改<select>标记和这个标签定义,
我们将定义一个“id”,这将被用于IbatisReadDy.java文件上执行动态SQL的SELECT查询数据库。
<sqlMap namespace="Employee">
    <select id="findByID" resultClass="Employee">
SELECT * FROM EMPLOYEE
<dynamic prepend="WHERE">
   <isNotNull property="id">
id=#id#
   </isNotNull>
</dynamic>
    </select>
</sqlMap>
上面的SELECT 语句有两方面的功能:
一、如果想传递一个ID,则返回响应的对象
Employee rec = new Empployee();
rec.setID(1);
Employee employee7 = smc.select("Employee.findByID", rec);
二、如果没有传递ID,则返回所有记录
EMployee rec = new Employee();
List<Employee> employeeList = (List<Employee>)smc.select("Employee.findByID", rec);

iBatis OGNL表达式

if语句
<select id="findByBlogWithTitle" parameterType="Blog" resultClass="Blog">
    select * from BLOG
    WHERE state = 'ACTIVE'
    <if test="title!=null">
AND title like #{title}
    </if>
</select>

这条语句会提供功能的可选的文本搜索类型。如果没有传递title,那么所有激活的博客将被退回。但是,如果传递一个标题,它会寻找标题以like 给定的条件。 

可以包括多个if条件如下:


最常见的事情在动态SQL是有条件地包括一个where子句的一部分。例如:

<select id="findActiveBlogWithTitleLike"
           parameterType="Blog" resultType="Blog">
   SELECT * FROM BLOG
   WHERE state = 'ACTIVE.
   <if test="title != null">
      AND title like #{title}
   </if>
   <if test="author != null">
      AND author like #{author}
   </if>

</select>

choose, when, otherwise 语句类似于java的switch
<select id="findByBlogWithTitleLike" parameterType="Blog" resultType="Blog">
    SELECT * FROM BLOG
    WHERE state = 'ACTIVE.
    <choose>
<when test="title!=null">
   AND title like #{title}
</when>
<when test="author != null and author.name != null">
   AND author like #{author}
</when>
<otherwise>
   AND featured = 1
</otherwise>
    </choose>

</select>


where 语句:
如果我们看一下前面的例子中,如果没有一个条件满足会发生什么事?最终SQL看起来像这样:
SELECT * FROM BLOG
WHERE
这会失败,但iBATIS有一个简单的改变一个简单的解决方案,让一切工作正常:
<select id="findActiveBlogLike"
           parameterType="Blog" resultType="Blog">
   SELECT * FROM BLOG
   <where>
      <if test="state != null">
         state = #{state}
      </if>
      <if test="title != null">
         AND title like #{title}
      </if>
      <if test="author != null>
         AND author like #{author}
      </if>
   </where>
</select>


foreach语句:
foreach元素是非常强大的,并允许你指定一个集合,声明可以在元素的体内可用于项目和索引变量。
它也允许你指定打开和关闭的字符串,并添加一个分隔符放置在迭代之间。可以建立一个IN条件如下:

<select id="selectPostIn" resultType="domain.blog.Post">
   SELECT *
   FROM POST P
   WHERE ID in
   <foreach item="item" index="index" collection="list"
      open="(" separator="," close=")">
         #{item}
   </foreach>
</select>