一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|JAVA教程|ASP教程|

服務器之家 - 編程語言 - JAVA教程 - 在Java的MyBatis框架中建立接口進行CRUD操作的方法

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

2020-04-15 11:45紅燒獅子頭 JAVA教程

這篇文章主要介紹了在Java的MyBatis框架中建立接口進行CRUD操作的方法,CRUD是指在做計算處理時的增加(Create)、重新取得數據(Retrieve)、更新(Update)和刪除(Delete)幾個單詞的首字母簡寫,需要的朋友可以參考下

以接口操作的方式編程
一般來講,我們建立映射SQL接口的類時通常會這樣:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
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
   }
 }
?
1
2
3
4
5
6
7
8
<!-- 此處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類,表示今后將要操作數據庫所有方法的接口,如下所示:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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接口方法,如下所示:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
/*
 * 基礎查詢
 */
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'。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
<?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節點不對應接口名稱會出現如下異常:

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

大家可以注意到在VisitorMapper.xml這個配置文件中在獲取list的時候,使用的是resultMap,使用resultMap的情況下你可以指定你自己的sql語句與哪些字段相映射,因為有時候你可以不需要那么多列,那你在配置映射的時候也不需要配置那么多映射,或者說你的列有起過別名,那么就不能直接使用resultType="Visitor"的方式進行映射,因為Mybatis默認映射方式是通過Javabean的屬性名與表的字段是否一致來匹配的,也可以通過配置<configuration>節點下的<settings>屬性值來控制是否映射的時候以Javabean中的駝峰命名方式配置如下。

?
1
2
3
<settings>
  <setting name="mapUnderscoreToCamelCase" value="false" />
</settings>

具體其他修改Mapper的其他配置可以通過 http://mybatis.github.io/mybatis-3/configuration.html#settings 查看。
對于Visitor的Mapper類如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<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的類存放各類測試方法,如下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
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就完成啦

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 好男人资源免费播放 | 国产成人高清视频 | 成年无限观看onlyfans | 欧美成人aaaa免费高清 | 国产欧美久久一区二区 | 无码射肉在线播放视频 | 国产在线伊人 | 欧美精品久久久久久久影视 | 明星ai人脸替换脸忘忧草 | 五月婷婷丁香色 | 亚洲精品123区在线观看 | fuqer日本 | 乳环调教| 国产在线一区二区视频 | 日韩精品一二三区 | 国产在线观看精品香蕉v区 国产在线观看a | 亚洲精品国产在线观看 | 亚洲 欧美 中文 日韩 视频 | 国产精品毛片高清在线完整版 | 天天色天天综合 | 久久精品123 | 亚洲欧洲日产国码 最新 | 青春草在线观看精品免费视频 | 欧美男男gaygaysxxx | 精品国产乱码久久久久久软件 | 国产麻豆在线观看网站 | 四虎精品免费视频 | 91精品国产91热久久久久福利 | 美女免费观看一区二区三区 | 国产精品午夜国产小视频 | 免费看a视频 | 国产三级跑 | 91精品国产麻豆国产自产在线 | 免费观看国产精品 | 色吧欧美| 99九九国产精品免费视频 | pregnantsexxx临盆孕妇 | 日韩精品 欧美 | 天天综合色天天综合色sb | 日本中文字幕一区二区三区不卡 | 涩涩国产精品福利在线观看 |