程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> 在Java的MyBatis框架中樹立接口停止CRUD操作的辦法

在Java的MyBatis框架中樹立接口停止CRUD操作的辦法

編輯:關於JAVA

在Java的MyBatis框架中樹立接口停止CRUD操作的辦法。本站提示廣大學習愛好者:(在Java的MyBatis框架中樹立接口停止CRUD操作的辦法)文章只能為提供參考,不一定能成為您想要的結果。以下是在Java的MyBatis框架中樹立接口停止CRUD操作的辦法正文


以接口操作的方法編程
普通來說,我們樹立映照SQL接口的類時平日會如許:

 public static void testBasicQuery(int id) {
    SqlSession session = MybatisUtils.getSqlSession();
    try {
      /*
       * 此處的david.mybatis.demo.IVisitorOperation.basicQuery必需和下圖中設置裝備擺設外面的namespace對應
       */
      Visitor visitor = (Visitor) session.selectOne("david.mybatis.demo.IVisitorOperation.basicQuery", id);
      MybatisUtils.closeSession(session);
      System.out.println(visitor);
    } catch (Exception e) {
      // TODO: handle exception
    }
  }
<!-- 此處namespace對應的就是你所傳的String參數 -->
<mapper namespace="david.mybatis.demo.IVisitorOperation">
<!-- 此處的resultType就是對應方才你在typeAlias節點外面劃定的別號 -->
  <select id="basicQuery" parameterType="int" resultType="Visitor">
    select * from visitor where id=#{id} and
    Status>0 order by Id
  </select>
</mapper>

如許其其實真實的開辟進程中假如雙方的名字一不當心沒有對應上,就會湧現異常。為了不如許的情形我們可以采用接口的方法來停止響應的操作,上面我們來修正這段器械。

起首我們在包名為david.mybatis.demo的上面新建一個IVisitOperation類,表現往後將要操作數據庫一切辦法的接口,以下所示:

package david.mybatis.demo;

import java.util.List;

import david.mybatis.model.PagenateArgs;
import david.mybatis.model.Visitor;

public interface IVisitorOperation {  
  /*
   * 基本查詢
   */
  public Visitor basicQuery(int id);
}

  public static void testBasicQueryByInterfaceWay(int id) {
    SqlSession session = MybatisUtils.getSqlSession();
    try {
      IVisitorOperation vOperation = session.getMapper(IVisitorOperation.class);
      Visitor visitor = vOperation.basicQuery(id);
      MybatisUtils.closeSession(session);
      System.out.println(visitor);
    } catch (Exception e) {
      // TODO: handle exception
    }
  }

如許就年夜功樂成了,如許我們就不用為手動書寫辦法名能夠招致的不婚配而懊惱了。

CRUD操作
上面將講授創立基於單表操作的CRUD與GetList操作,為了創立一點測試數據我們先弄個Add辦法吧

持續在前次的IVisitorOperation接口類中添加add,delete,update,query與getList接口辦法,以下所示:

  /*
   * 基本查詢
   */
  public Visitor basicQuery(int id);

  /*
   * 添加拜訪者
   */
  public int add(Visitor visitor);
  
  /*
   * 刪除拜訪者
   */
  public int delete(int id);
  
  /*
   * 更新拜訪者
   */
  public int update(Visitor visitor);
  
  /*
   * 查詢拜訪者
   */
  public Visitor query(int id);
  
  /*
   * 查詢拜訪者List
   */
  public List<Visitor> getList();

關於響應的CRUD操作,在VisitorMapper.xml的<mapper>節點下分離對應insert,update,delete,select節點,詳細設置裝備擺設概況參數解釋課參照官網 http://mybatis.github.io/mybatis-3/sqlmap-xml.html
這個示例中要的設置裝備擺設以下,傳遞的參數用#{parameter_name},固然也可直接用${parameter_name},

前者的方法,Mybatis會把它轉化為參數化的情勢例如 insert into table (name) values (#{name}) => insert into table (name) values ( ? ) (Mysql情形下)

後者的方法,Mybatis會原封不動的不做任何操作把參數傳過去,例如  insert into table (name) values (${name}) => insert into table (name) values ( [你所傳的值] ),傳aa,這裡就是aa,傳'aa'這裡就是'aa'。

<?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="david.mybatis.demo.IVisitorOperation">
  <!-- 
    useGeneratedKeys="true"代表能否應用自增加序列, 
    keyProperty="Id"指定自增加列是哪一列, 
    parameterType="Visitor"指定IVisitorOperation接口類中界說中所傳的響應類型
    resultType 表現前往的類型,例如query中的visitor
    resultMap 自界說的前往類型,是前往龐雜類型是的最好首選,也是mybatis裡最壯大的兵器
   -->
  <insert id="add" parameterType="Visitor" useGeneratedKeys="true"
    keyProperty="Id">
    insert into Visitor (Name, Email, Status, CreateTime)
    values (#{name}, #{email}, #{status}, #{createTime})
  </insert>
  <delete id="delete" parameterType="int">
    delete from Visitor where
    status>0 and id = #{id}
  </delete>
  <update id="update" parameterType="Visitor">
    update Visitor set Name =
    #{name}, Email=#{email}, Status=#{status} where id=#{id} and Status>0;
  </update>
  <select id="query" parameterType="int" resultType="Visitor">
    select Id,
    Name, Email, Status, CreateTime from visitor where id=#{id} and
    Status>0 order by Id
  </select>
  <select id="basicQuery" parameterType="int" resultType="Visitor">
    select * from visitor where id=#{id} and
    Status>0 order by Id
  </select>
  <select id="getList" resultMap="visitorRs">
    <include refid="getListSql" />
  </select>
  <resultMap type="Visitor" id="visitorRs">
    <id column="Id" property="id" />
    <result column="Name" property="name" />
    <result column="Email" property="email" />
    <result column="Status" property="status" />
    <result column="CreateTime" property="createTime" />
  </resultMap>
  <sql id="getListSql">
    select * from Visitor where
    status>0
  </sql>
</mapper>

此處留意的一點是:操作節點中的ID要對應接口界說中的接口名字,參數類型也要響應對應,例如接口裡是add(Visitor visitor),那末在設置裝備擺設insert節點的時刻id="add",parameterType="Visitor"

不然會報響應的異常,例如id節點纰謬應接口稱號會湧現以下異常:

年夜家可以留意到在VisitorMapper.xml這個設置裝備擺設文件中在獲得list的時刻,應用的是resultMap,應用resultMap的情形下你可以指定你本身的sql語句與哪些字段相映照,由於有時刻你可以不須要那末多列,那你在設置裝備擺設映照的時刻也不須要設置裝備擺設那末多映照,或許說你的列有起過別號,那末就不克不及直接應用resultType="Visitor"的方法停止映照,由於Mybatis默許映照方法是經由過程Javabean的屬性名與表的字段能否分歧來婚配的,也能夠經由過程設置裝備擺設<configuration>節點下的<settings>屬性值來掌握能否映照的時刻以Javabean中的駝峰定名方法設置裝備擺設以下。

<settings>
  <setting name="mapUnderscoreToCamelCase" value="false" />
</settings>

詳細其他修正Mapper的其他設置裝備擺設可以經由過程 http://mybatis.github.io/mybatis-3/configuration.html#settings 檢查。
關於Visitor的Mapper類以下:

<mapper namespace="david.mybatis.demo.IVisitorOperation">
  <sql id="getListSql">
    select id as visitor_id, name, email, status, createtime from Visitor where
    status>0
  </sql>
  <select id="getList" resultMap="visitorRs">
    <include refid="getListSql" />
  </select>
  <!-- 
    這裡指的留意的處所是property屬性,外面的字段必定要和你在實體外面界說的屬性一樣,此處辨別年夜小寫
    不然會湧現默許setter為屬性賦值的時刻找不到響應屬性的異常,年夜家可以試下
    column屬性對應於查詢語句前往成果集的名字,假如無為響應字段起過別號例如吧id變成了visitor_id
    那末響應的column名字也要對應上
  -->
  <resultMap type="Visitor" id="visitorRs">
    <id column="visitor_id" property="id" />
    <result column="Name" property="name" />
    <result column="Email" property="email" />
    <result column="Status" property="status" />
    <result column="CreateTime" property="createTime" />
  </resultMap>
</mapper>

這裡要年夜家還會留意到有一個節點<sql>節點,這個的用途就是提取公用的sql語句或許說字段,以便其他處所復用,其他具體解釋用法可以參照 http://mybatis.github.io/mybatis-3/sqlmap-xml.html。
剩下的就是和方才一樣的操作了,年夜家可以在demo法式裡樹立一個DemoRun的類寄存各類測試辦法,以下:

package david.mybatis.demo;

import java.util.Arrays;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import david.mybatis.model.BasicQueryArgs;
import david.mybatis.model.CRUD_Enum;
import david.mybatis.model.Channel;
import david.mybatis.model.PagenateArgs;
import david.mybatis.model.Visitor;
import david.mybatis.model.Website;

public class DemoRun {

  public static void testBasicQuery(int id) {
    SqlSession session = MybatisUtils.getSqlSession();
    try {
      /*
       * 此處的david.mybatis.demo.IVisitorOperation.basicQuery必需和下圖中設置裝備擺設外面的namespace對應
       */
      Visitor visitor = (Visitor) session.selectOne("david.mybatis.demo.IVisitorOperation.basicQuery", id);
      MybatisUtils.closeSession(session);
      System.out.println(visitor);
    } catch (Exception e) {
      // TODO: handle exception
      e.printStackTrace();
    }
  }
  
  public static void testBasicQueryByInterfaceWay(int id) {
    SqlSession session = MybatisUtils.getSqlSession();
    try {
      IVisitorOperation vOperation = session.getMapper(IVisitorOperation.class);
      Visitor visitor = vOperation.basicQuery(id);
      MybatisUtils.closeSession(session);
      System.out.println(visitor);
    } catch (Exception e) {
      // TODO: handle exception
      e.printStackTrace();
    }
  }

  /*
   * 批量添加拜訪者記載
   */
  public static void addVisitors() {
    SqlSession session = MybatisUtils.getSqlSession();
    List<Visitor> visitors = Arrays.asList(new Visitor[] { new Visitor("mongodb", "[email protected]"),
        new Visitor("redis", "[email protected]"), new Visitor("memcached", "[email protected]"),
        new Visitor("CouchDB", "[email protected]"), new Visitor("HBase", "[email protected]"),
        new Visitor("Bigtable", "[email protected]"), new Visitor("Hive", "[email protected]"),
        new Visitor("MapReduce", "[email protected]"), });

    for (Visitor visitor : visitors) {
      addVisitor(visitor, session);
    }
    MybatisUtils.closeSession(session);
    MybatisUtils.showMessages(CRUD_Enum.List, visitors.size());
  }

  /*
   * 添加拜訪者信息
   */
  @SuppressWarnings("unused")
  private static void addVisitor(Visitor visitor, SqlSession session) {
    if (session == null)
      session = MybatisUtils.getSqlSession();
    IVisitorOperation vOperation = session.getMapper(IVisitorOperation.class);
    int recordCount = vOperation.add(visitor);
    session.commit();
    if (session == null)
      MybatisUtils.closeSession(session);
    MybatisUtils.showMessages(CRUD_Enum.Add, recordCount);
  }

  /*
   * 重載添加拜訪者
   */
  public static void addVisitor(Visitor visitor) {
    addVisitor(visitor, null);
  }

  /*
   * 刪除拜訪者信息
   */
  public static void deleteVisitor(int id) {
    SqlSession session = MybatisUtils.getSqlSession();
    IVisitorOperation vOperation = session.getMapper(IVisitorOperation.class);
    int recordCount = vOperation.delete(id);
    session.commit();
    MybatisUtils.closeSession(session);
    MybatisUtils.showMessages(CRUD_Enum.Delete, recordCount);
  }

  /*
   * 更新拜訪者信息
   */
  public static void updateVisitor(int id) {
    SqlSession session = MybatisUtils.getSqlSession();
    IVisitorOperation vOperation = session.getMapper(IVisitorOperation.class);
    Visitor visitor = vOperation.query(id);
    System.out.println("原始對象:" + visitor);
    String name = visitor.getName();
    if (name.contains("updated")) {
      visitor.setName(name.substring(0, name.indexOf("updated")));
    } else {
      visitor.setName(name + "updated");
    }
    int recordCount = vOperation.update(visitor);
    session.commit();
    MybatisUtils.closeSession(session);
    MybatisUtils.showMessages(CRUD_Enum.Update, recordCount);
    System.out.println("更新後對象:" + visitor);
  }

  /*
   * 查詢拜訪者信息
   */
  public static void queryVisitor(int id) {
    SqlSession session = MybatisUtils.getSqlSession();
    IVisitorOperation vOperation = session.getMapper(IVisitorOperation.class);
    Visitor visitor = vOperation.query(id);
    MybatisUtils.closeSession(session);
    MybatisUtils.showMessages(CRUD_Enum.Query, 1);
    System.out.println(visitor);
  }

  /*
   * 查詢拜訪者列表
   */
  public static void queryVisitorList() {
    SqlSession session = MybatisUtils.getSqlSession();
    IVisitorOperation vOperation = session.getMapper(IVisitorOperation.class);
    List<Visitor> visitors = vOperation.getList();
    for (Visitor visitor : visitors) {
      System.out.println(visitor);
    }
    MybatisUtils.closeSession(session);
    MybatisUtils.showMessages(CRUD_Enum.List, visitors.size());
  }  
}

DemoRun類
運轉一下後一個簡略的基於單表CRUD,DEMO就完成啦

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved