- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章在Java的MyBatis框架中建立接口进行CRUD操作的方法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
以接口操作的方式编程 一般来讲,我们建立映射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节点不对应接口名称会出现如下异常:
大家可以注意到在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", "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就完成啦 。
最后此篇关于在Java的MyBatis框架中建立接口进行CRUD操作的方法的文章就讲到这里了,如果你想了解更多关于在Java的MyBatis框架中建立接口进行CRUD操作的方法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我需要开发一个简单的网站,我通常使用 bootstrap CSS 框架,但是我想使用 Gumbyn,它允许我使用 16 列而不是 12 列。 我想知道是否: 我可以轻松地改变绿色吗? 如何使用固定布局
这个问题在这里已经有了答案: 关闭 13 年前。 与直接编写 PHP 代码相比,使用 PHP 框架有哪些优点/缺点?
我开发了一个 Spring/JPA 应用程序:服务、存储库和域层即将完成。 唯一缺少的层是网络层。我正在考虑将 Playframework 2.0 用于 Web 层,但我不确定是否可以在我的 Play
我现有的 struts Web 应用程序具有单点登录功能。然后我将使用 spring 框架创建一个不同的 Web 应用程序。然后想要使用从 struts 应用程序登录的用户来链接新的 spring 应
我首先使用Spark框架和ORMLite处理网页上表单提交的数据,在提交中文字符时看到了unicode问题。我首先想到问题可能是由于ORMLite,因为我的MySQL数据库的字符集已设置为使用utf8
我有一个使用 .Net 4.5 功能的模块,我们的应用程序也适用于 XP 用户。所以我正在考虑将这个 .net 4.5 依赖模块移动到单独的项目中。我怎样才能有一个解决方案,其中有两个项目针对不同的版
我知道这是一个非常笼统的问题,但我想我并不是真的在寻找明确的答案。作为 PHP 框架的新手,我很难理解它。 Javascript 框架,尤其是带有 UI 扩展的框架,似乎通过将 JS 代码与设计分开来
我需要收集一些关于现有 ORM 解决方案的信息。 请随意编写任何编程语言。 你能谈谈你用过的最好的 ORM 框架吗?为什么它比其他的更好? 最佳答案 我使用了 NHibernate 和 Entity
除了 Apple 的 SDK 之外,还有什么强大的 iPhone 框架可供开始开发?有没有可以加快开发时间的方法? 最佳答案 此类框架最大的是Three20 。 Facebook 和许多其他公司都使用
有人可以启发我使用 NodeJS 的 Web 框架吗?我最近开始从免费代码营学习express js,虽然一切进展顺利,但我对express到底是什么感到困惑。是全栈框架吗?纯粹是为了后端吗?我发现您
您可以推荐哪种 Ajax 框架/工具包来构建使用 struts 的 Web 应用程序的 GUI? 最佳答案 我会说你的 AJAX/javascript 库选择应该较少取决于你的后端是如何实现的,而更多
我有生成以下错误的 python 代码: objc[36554]: Class TKApplication is implemented in both /Library/Frameworks/Tk.
首先,很抱歉,如果我问的问题很明显,因为我没有编程背景,那我去吧: 我想运行一系列测试场景并在背景部分声明了几个变量(我打印它们以仔细检查它们是否已正确声明),第一个是整数,另外两个字符串为你可以看到
在我们承担的一个项目中,我们正在寻找一个视频捕获和录制库。我们的基础工作(基于 google 搜索)表明 vlc (libvlc)、ffmpeg (libavcodec) 和 gstreamer 是三
我试过没有运气的情况下寻找某种功能来杀死/中断Play中的正常工作!框架。 我想念什么吗?还是玩了!实际没有添加此功能? 最佳答案 Java stop类中没有像Thread方法那样的东西,由于种种原因
我们希望在我们的系统中保留所有重大事件的记录。例如,在数据库可能存储当前用户状态的地方,事件日志应记录对该状态的所有更改以及更改发生的时间。 事件记录工具应该尽可能接近于事件引发器的零开销,应该容纳结
那里有 ActionScript 2.0/3.0 的测试框架列表吗? 最佳答案 2010-05-18 更新 由于这篇文章有点旧,而且我刚刚收到了赞成票,因此可能值得提供一些更新的信息,这样人们就不会追
我有一个巨大的 numpy 数组列表(一维),它们是不同事件的时间序列。每个点都有一个标签,我想根据其标签对 numpy 数组进行窗口化。我的标签是 0、1 和 2。每个窗口都有一个固定的大小 M。
我是 Play 的新手!并编写了我的第一个应用程序。这个应用程序有一组它依赖的 URL,从 XML 响应中提取数据并返回有效的 URL。 此应用程序需要在不同的环境(Dev、Staging 和 Pro
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 4年前关闭。 Improve thi
我是一名优秀的程序员,十分优秀!