今天這一章要緊接上一講中的東西,本章中創建基于單表操作的CRUD與GetList操作,此示例中以Visitor表為范例,為了創建一點測試數據我們先弄個Add方法吧 繼續在上次的IVisitorOperation接口類中添加add,delete,update,query與getList接口方法,如下所示:  IVisitorOperation接口類 /* * 基礎查詢 */ 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。
 VisitorMapper配置 <?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> 對于Visitor的Mapper類如下:  VisitorMapper類CRUD配置 <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的類存放各類測試方法,如下:  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()); }
運行一下后一個簡單的基于單表CRUD,DEMO就完成啦
 下周會繼續更新下一章,講述基于多表聯合查詢下的Mybatis用法~^0^,一天不能發太多.....因為連續規定不能發表太多所以,今天就暫時到這里啦~ 如果你覺得這篇文章對你有用,歡迎推薦[推薦]
如果你覺得文章內有錯誤歡迎指出^0^~
如果您想轉載本博客,請注明出處
如果您對本文有意見或者建議,歡迎留言 本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,否則作者保留追究法律責任的權利。
|
|
|
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
---|
24 | 25 | 26 | 27 | 28 | 29 | 30 | 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 | 1 | 2 | 3 | 4 |
|
導航
統計
常用鏈接
留言簿
隨筆分類
隨筆檔案
搜索
最新評論

閱讀排行榜
評論排行榜
|
|