国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

在Java的MyBatis框架中建立接口進行CRUD操作的方法

2019-11-26 14:27:27
字體:
來源:轉載
供稿:網友

以接口操作的方式編程
一般來講,我們建立映射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節(jié)點里面規(guī)定的別名 -->  <select id="basicQuery" parameterType="int" resultType="Visitor">    select * from visitor where id=#{id} and    Status>0 order by Id  </select></mapper>

這樣其實在真正的開發(fā)過程中如果兩邊的名字一不小心沒有對應上,就會出現異常。為了避免這樣的情況我們可以采取接口的方式來進行相應的操作,下面我們來修改這段東西。

首先我們在包名為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操作
下面將講解創(chuàng)建基于單表操作的CRUD與GetList操作,為了創(chuàng)建一點測試數據我們先弄個Add方法吧

繼續(xù)在上次的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>節(jié)點下分別對應insert,update,delete,select節(jié)點,具體配置詳情參數說明課參照官網 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>

此處注意的一點是:操作節(jié)點中的ID要對應接口定義中的接口名字,參數類型也要相應對應,例如接口里是add(Visitor visitor),那么在配置insert節(jié)點的時候id="add",parameterType="Visitor"

否則會報相應的異常,例如id節(jié)點不對應接口名稱會出現如下異常:

201646145316272.png (1228×153)

大家可以注意到在VisitorMapper.xml這個配置文件中在獲取list的時候,使用的是resultMap,使用resultMap的情況下你可以指定你自己的sql語句與哪些字段相映射,因為有時候你可以不需要那么多列,那你在配置映射的時候也不需要配置那么多映射,或者說你的列有起過別名,那么就不能直接使用resultType="Visitor"的方式進行映射,因為Mybatis默認映射方式是通過Javabean的屬性名與表的字段是否一致來匹配的,也可以通過配置<configuration>節(jié)點下的<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屬性,里面的字段一定要和你在實體里面定義的屬性一樣,此處區(qū)分大小寫    否則會出現默認setter為屬性賦值的時候找不到相應屬性的異常,大家可以試下    column屬性對應于查詢語句返回結果集的名字,如果有為相應字段起過別名例如吧id變?yōu)榱藇isitor_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>

這里要大家還會注意到有一個節(jié)點<sql>節(jié)點,這個的用處就是提取公用的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", "mongodb@gmail.com"),        new Visitor("redis", "redis@gmail.com"), new Visitor("memcached", "memcached@gmail.com"),        new Visitor("CouchDB", "CouchDB@gmail.com"), new Visitor("HBase", "HBase@gmail.com"),        new Visitor("Bigtable", "Bigtable@gmail.com"), new Visitor("Hive", "Hive@gmail.com"),        new Visitor("MapReduce", "MapReduce@gmail.com"), });    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就完成啦

201646145447423.png (741×644)

發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 仁怀市| 精河县| 东乌| 迁安市| 西乌| 罗城| 电白县| 女性| 巫山县| 竹山县| 仁寿县| 龙陵县| 包头市| 霍林郭勒市| 囊谦县| 米泉市| 巴楚县| 泉州市| 濮阳市| 罗源县| 沧州市| 沂南县| 西城区| 萍乡市| 丹凤县| 巴林左旗| 鹰潭市| 邵武市| 广德县| 阳山县| 图木舒克市| 眉山市| 内乡县| 中方县| 独山县| 华容县| 民勤县| 安平县| 洛宁县| 红河县| 靖远县|