在Java的MyBatis框架中建立接口進(jìn)行CRUD操作的方法
以接口操作的方式編程
一般來講,我們建立映射SQL接口的類時(shí)通常會(huì)這樣:
public static void testBasicQuery(int id) {
SqlSession session = MybatisUtils.getSqlSession();
try {
/*
* 此處的david.mybatis.demo.IVisitorOperation.basicQuery必須和下圖中配置里面的namespace對(duì)應(yīng)
*/
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對(duì)應(yīng)的就是你所傳的String參數(shù) -->
<mapper namespace="david.mybatis.demo.IVisitorOperation">
<!-- 此處的resultType就是對(duì)應(yīng)剛剛你在typeAlias節(jié)點(diǎn)里面規(guī)定的別名 -->
<select id="basicQuery" parameterType="int" resultType="Visitor">
select * from visitor where id=#{id} and
Status>0 order by Id
</select>
</mapper>
這樣其實(shí)在真正的開發(fā)過程中如果兩邊的名字一不小心沒有對(duì)應(yīng)上,就會(huì)出現(xiàn)異常。為了避免這樣的情況我們可以采取接口的方式來進(jìn)行相應(yīng)的操作,下面我們來修改這段東西。
首先我們?cè)诎麨閐avid.mybatis.demo的下面新建一個(gè)IVisitOperation類,表示今后將要操作數(shù)據(jù)庫所有方法的接口,如下所示:
package david.mybatis.demo;
import java.util.List;
import david.mybatis.model.PagenateArgs;
import david.mybatis.model.Visitor;
public interface IVisitorOperation {
/*
* 基礎(chǔ)查詢
*/
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
}
}
這樣就大功告成了,這樣我們就不必為手動(dòng)書寫方法名可能導(dǎo)致的不匹配而煩惱了。
CRUD操作
下面將講解創(chuàng)建基于單表操作的CRUD與GetList操作,為了創(chuàng)建一點(diǎn)測(cè)試數(shù)據(jù)我們先弄個(gè)Add方法吧
繼續(xù)在上次的IVisitorOperation接口類中添加add,delete,update,query與getList接口方法,如下所示:
/* * 基礎(chǔ)查詢 */ public Visitor basicQuery(int id); /* * 添加訪問者 */ public int add(Visitor visitor); /* * 刪除訪問者 */ public int delete(int id); /* * 更新訪問者 */ public int update(Visitor visitor); /* * 查詢?cè)L問者 */ public Visitor query(int id); /* * 查詢?cè)L問者List */ public List<Visitor> getList();
對(duì)于相應(yīng)的CRUD操作,在VisitorMapper.xml的<mapper>節(jié)點(diǎn)下分別對(duì)應(yīng)insert,update,delete,select節(jié)點(diǎn),具體配置詳情參數(shù)說明課參照官網(wǎng) http://mybatis.github.io/mybatis-3/sqlmap-xml.html
這個(gè)示例中要的配置如下,傳遞的參數(shù)用#{parameter_name},當(dāng)然也可直接用${parameter_name},
前者的方式,Mybatis會(huì)把它轉(zhuǎn)化為參數(shù)化的形式例如 insert into table (name) values (#{name}) => insert into table (name) values ( ? ) (Mysql情況下)
后者的方式,Mybatis會(huì)原封不動(dòng)的不做任何操作把參數(shù)傳過來,例如 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"代表是否使用自增長(zhǎng)序列,
keyProperty="Id"指定自增長(zhǎng)列是哪一列,
parameterType="Visitor"指定IVisitorOperation接口類中定義中所傳的相應(yīng)類型
resultType 表示返回的類型,例如query中的visitor
resultMap 自定義的返回類型,是返回復(fù)雜類型是的最佳首選,也是mybatis里最強(qiáng)大的武器
-->
<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>
此處注意的一點(diǎn)是:操作節(jié)點(diǎn)中的ID要對(duì)應(yīng)接口定義中的接口名字,參數(shù)類型也要相應(yīng)對(duì)應(yīng),例如接口里是add(Visitor visitor),那么在配置insert節(jié)點(diǎn)的時(shí)候id="add",parameterType="Visitor"
否則會(huì)報(bào)相應(yīng)的異常,例如id節(jié)點(diǎn)不對(duì)應(yīng)接口名稱會(huì)出現(xiàn)如下異常:

大家可以注意到在VisitorMapper.xml這個(gè)配置文件中在獲取list的時(shí)候,使用的是resultMap,使用resultMap的情況下你可以指定你自己的sql語句與哪些字段相映射,因?yàn)橛袝r(shí)候你可以不需要那么多列,那你在配置映射的時(shí)候也不需要配置那么多映射,或者說你的列有起過別名,那么就不能直接使用resultType="Visitor"的方式進(jìn)行映射,因?yàn)镸ybatis默認(rèn)映射方式是通過Javabean的屬性名與表的字段是否一致來匹配的,也可以通過配置<configuration>節(jié)點(diǎn)下的<settings>屬性值來控制是否映射的時(shí)候以Javabean中的駝峰命名方式配置如下。
<settings> <setting name="mapUnderscoreToCamelCase" value="false" /> </settings>
具體其他修改Mapper的其他配置可以通過 http://mybatis.github.io/mybatis-3/configuration.html#settings 查看。
對(duì)于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屬性,里面的字段一定要和你在實(shí)體里面定義的屬性一樣,此處區(qū)分大小寫
否則會(huì)出現(xiàn)默認(rèn)setter為屬性賦值的時(shí)候找不到相應(yīng)屬性的異常,大家可以試下
column屬性對(duì)應(yīng)于查詢語句返回結(jié)果集的名字,如果有為相應(yīng)字段起過別名例如吧id變?yōu)榱藇isitor_id
那么相應(yīng)的column名字也要對(duì)應(yīng)上
-->
<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>
這里要大家還會(huì)注意到有一個(gè)節(jié)點(diǎn)<sql>節(jié)點(diǎn),這個(gè)的用處就是提取公用的sql語句或者說字段,以便其他地方復(fù)用,其他詳細(xì)說明用法可以參照 http://mybatis.github.io/mybatis-3/sqlmap-xml.html。
剩下的就是和剛剛一樣的操作了,大家可以在demo程序里建立一個(gè)DemoRun的類存放各類測(cè)試方法,如下:
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對(duì)應(yīng)
*/
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("原始對(duì)象:" + 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("更新后對(duì)象:" + visitor);
}
/*
* 查詢?cè)L問者信息
*/
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);
}
/*
* 查詢?cè)L問者列表
*/
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類
運(yùn)行一下后一個(gè)簡(jiǎn)單的基于單表CRUD,DEMO就完成啦

相關(guān)文章
idea打開項(xiàng)目后無法顯示目錄結(jié)構(gòu),只能顯示.iml文件問題
這篇文章主要介紹了idea打開項(xiàng)目后無法顯示目錄結(jié)構(gòu),只能顯示.iml文件問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
簡(jiǎn)單的理解java集合中的HashSet和HashTree幾個(gè)重寫方法
這篇文章主要介紹了簡(jiǎn)單的理解java集合中的HashSet和HashTree幾個(gè)重寫方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-10-10
knife4j+springboot3.4異常無法正確展示文檔
本文主要介紹了knife4j+springboot3.4異常無法正確展示文檔,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-01-01
SpringBoot中使用JWT的實(shí)戰(zhàn)
本文主要介紹了SpringBoot中使用JWT的實(shí)戰(zhàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
SpringBoot后端進(jìn)行數(shù)據(jù)校驗(yàn)JSR303的使用詳解
這篇文章主要介紹了SpringBoot后端進(jìn)行數(shù)據(jù)校驗(yàn)JSR303的使用詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-03-03
SpringBoot項(xiàng)目中如何解決跨域問題的最新方案?
跨域問題是瀏覽器為了保護(hù)用戶的信息安全,實(shí)施了同源策略(Same-Origin Policy),即只允許頁面請(qǐng)求同源(相同協(xié)議、域名和端口)的資源,當(dāng) JavaScript 發(fā)起的請(qǐng)求跨越了同源策略,即請(qǐng)求的目標(biāo)與當(dāng)前頁面的域名、端口、協(xié)議不一致時(shí),瀏覽器會(huì)阻止請(qǐng)求的發(fā)送或接收2025-03-03
Spring?MVC?請(qǐng)求映射路徑的配置實(shí)現(xiàn)前后端交互
在Spring?MVC中,請(qǐng)求映射路徑是指與特定的請(qǐng)求處理方法關(guān)聯(lián)的URL路徑,這篇文章主要介紹了Spring?MVC?請(qǐng)求映射路徑的配置,實(shí)現(xiàn)前后端交互,需要的朋友可以參考下2023-09-09

