- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章MyBatis 与 Spring 的完美整合方法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
mybatis—spring 项目 。
目前大部分的 java 互联网项目,都是用 spring mvc + spring + mybatis 搭建平台的.
使用 spring ioc 可以有效的管理各类的 java 资源,达到即插即拔的功能;通过 spring aop 框架,数据库事务可以委托给 spring 管理,消除很大一部分的事务代码,配合 mybatis 的高灵活、可配置、可优化 sql 等特性,完全可以构建高性能的大型网站.
毫无疑问,mybatis 和 spring 两大框架已经成了 java 互联网技术主流框架组合,它们经受住了大数据量和大批量请求的考验,在互联网系统中得到了广泛的应用。使用 mybatis-spring 使得业务层和模型层得到了更好的分离,与此同时,在 spring 环境中使用 mybatis 也更加简单,节省了不少代码,甚至可以不用 sqlsessionfactory、 sqlsession 等对象,因为 mybatis-spring 为我们封装了它们.
摘自:《java ee 互联网轻量级框架整合开发》 。
第一步:创建测试工程 。
第一步,首先在 idea 中新建一个名为【mybatisandspring】的 webproject 工程:
然后在【src】中创建 4 个空包:
接着新建源文件夹【config】,用于放置各种资源配置文件:
再在【web】文件夹下新建一个【web-inf】默认安全文件夹,并在其下创建一个【classes】和【lib】,并将项目的输出位置,改在【classes】下:
工程的完整初始结构如下:
第二步:引入依赖 jar 包 。
第二步,就是要准备项目的依赖 jar 包:
在【web-inf】文件夹下的【lib】文件夹中放置上面列举的 jar 包,然后添加依赖.
第三步:编写 spring 配置文件 。
第三步,编写 spring 的配置文件:
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
|
<?xml version=
"1.0"
encoding=
"utf-8"
?>
<beans xmlns=
"http://www.springframework.org/schema/beans"
xmlns:xsi=
"http://www.w3.org/2001/xmlschema-instance"
xmlns:context=
"http://www.springframework.org/schema/context"
xsi:schemalocation="http:
//www.springframework.org/schema/beans
http:
//www.springframework.org/schema/beans/spring-beans.xsd
http:
//www.springframework.org/schema/context
http:
//www.springframework.org/schema/context/spring-context.xsd">
<!-- 加载配置文件 -->
<context:property-placeholder location=
"classpath:db.properties"
/>
<!-- 配置数据源 -->
<bean id=
"datasource"
class
=
"org.springframework.jdbc.datasource.drivermanagerdatasource"
>
<property name=
"driverclassname"
value=
"${jdbc.driver}"
/>
<property name=
"url"
value=
"${jdbc.url}"
/>
<property name=
"username"
value=
"${jdbc.username}"
/>
<property name=
"password"
value=
"${jdbc.password}"
/>
</bean>
<!-- sqlsessionfactory -->
<bean id=
"sqlsessionfactory"
class
=
"org.mybatis.spring.sqlsessionfactorybean"
>
<!-- 加载 mybatis 的配置文件 -->
<property name=
"configlocation"
value=
"mybatis/sqlmapconfig.xml"
/>
<!-- 数据源 -->
<property name=
"datasource"
ref=
"datasource"
/>
</bean>
</beans>
|
第四步:编写 mybatis 配置文件 。
第四步,在【mybatis】包下编写 mybatis 的全局配置文件 sqlmapconfig.xml :
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
|
<?xml version=
"1.0"
encoding=
"utf-8"
?>
<!doctype configuration
public
"-//mybatis.org//dtd config 3.0//en"
"http://mybatis.org/dtd/mybatis-3-config.dtd"
>
<configuration>
<!-- settings -->
<settings>
<!-- 打开延迟加载的开关 -->
<setting name=
"lazyloadingenabled"
value=
"true"
/>
<!-- 将积极加载改为消极加载(即按需加载) -->
<setting name=
"aggressivelazyloading"
value=
"false"
/>
<!-- 打开全局缓存开关(二级缓存)默认值就是
true
-->
<setting name=
"cacheenabled"
value=
"true"
/>
</settings>
<!-- 别名定义 -->
<typealiases>
<
package
name=
"cn.wmyskxz.pojo"
/>
</typealiases>
<!-- 加载映射文件 -->
<mappers>
<!-- 通过 resource 方法一次加载一个映射文件 -->
<mapper resource=
"sqlmap/usermapper.xml"
/>
<!-- 批量加载mapper -->
<
package
name=
"cn.wmyskxz.mapper"
/>
</mappers>
</configuration>
|
在该配置文件中:
第五步:编写 mapper 以及其他配置文件 。
第五步,编写 mapper 映射文件,这里依然定义 mapper 映射文件的名字为 “usermapper.xml” (与 sqlmapconfig.xml 中配置一致),为了测试效果,只配置了一个查询类 sql 映射:
1
2
3
4
5
6
7
8
9
|
<?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=
"test"
>
<select id=
"finduserbyid"
parametertype=
"_int"
resulttype=
"user"
>
select * from user where id = #{id}
</select>
</mapper>
|
在该配置中,输出参数的映射为 “user” ,这是因为之前在 sqlmapconfig.xml 中配置了 “cn.wmyskxz.pojo” 包下的实体类使用别名(即首字母小写的类名),所以这里只需在 “cn.wmyskxz.pojo” 包下,创建 “finduserbyid” 对应的 java 实体类 user:
1
2
3
4
5
6
7
|
package
cn.wmyskxz.pojo;
import
java.io.serializable;
public
class
user
implements
serializable {
private
int
id;
private
string username;
/* getter and setter */
}
|
实现 serializable 接口是为之后使用 mapper 动态代理做准备,这里没有使用动态代理.
在数据库资源 “db.properties” 中配置了数据库的连接信息,以 “key=value” 的形式配置,string 正是使用 “${}” 获取其中 key 对应的 value 配置的:
1
2
3
4
|
jdbc.driver=com.mysql.jdbc.driver
jdbc.url=jdbc:mysql:
//localhost:3306/mybatis?characterencoding=utf-8
jdbc.username=root
jdbc.password=root
|
另外日志配置和之前的配置一样,我就直接黏贴了:
1
2
3
4
5
6
7
|
# global logging configuration
# 在开发环境下日志级别要设置成 debug ,生产环境设为 info 或 error
log4j.rootlogger=debug, stdout
# console output...
log4j.appender.stdout=org.apache.log4j.consoleappender
log4j.appender.stdout.layout=org.apache.log4j.patternlayout
log4j.appender.stdout.layout.conversionpattern=%5p [%t] - %m%n
|
第六步:编写 dao 层 。
第六步,进行数据库交互(data access object)层的编写.
由于该项目只对 user 用户查询,所以 dao 层就只有一个类,在 “cn.wmyskxz” 包下创建 dao 层的 interface 接口,其中定义了 finduserbyid 方法,参数为用户的 id 值(int 类型):
1
2
3
4
5
6
|
package
cn.wmyskxz.dao;
import
cn.wmyskxz.pojo.user;
public
interface
userdao {
// 根据 id 查询用户信息
public
user finduserbyid(
int
id)
throws
exception;
}
|
然后在同一个包下创建 userdao 接口的实现类 userdaoimpl
1
2
3
4
5
6
7
8
9
10
11
12
13
|
package
cn.wmyskxz.dao;
import
cn.wmyskxz.pojo.user;
import
org.apache.ibatis.session.sqlsession;
import
org.mybatis.spring.support.sqlsessiondaosupport;
public
class
userdaoimpl
extends
sqlsessiondaosupport
implements
userdao {
@override
public
user finduserbyid(
int
id)
throws
exception {
// 继承 sqlsessiondaosupport 类,通过 this.getsqlsession() 得到 sqlsession
sqlsession sqlsession =
this
.getsqlsession();
user user = sqlsession.selectone(
"test.finduserbyid"
, id);
return
user;
}
}
|
有几点解释:
1
2
3
4
|
<!-- 原始 dao 接口 -->
<bean id=
"userdao"
class
=
"cn.wmyskxz.dao.userdaoimpl"
>
<property name=
"sqlsessionfactory"
ref=
"sqlsessionfactory"
/>
</bean>
|
注意: dao 实现类继承了 sqlsessiondaosupport 父类后,就无须自己定义获取 sqlsession 会话实例类方法了,该父类会默认加载数据源信息并提供获取 sqlsession 类的方法.
第七步:编写 service 测试类 。
在 “cn.wmyskxz.test” 包下创建【userservicetest】测试类:
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
|
package
cn.wmyskxz.test;
import
cn.wmyskxz.dao.userdao;
import
cn.wmyskxz.pojo.user;
import
org.junit.before;
import
org.junit.test;
import
org.springframework.context.applicationcontext;
import
org.springframework.context.support.classpathxmlapplicationcontext;
public
class
userservicetest {
private
applicationcontext applicationcontext;
// 在执行测试方法之前首先获取 spring 配置文件对象
// 注解@before在执行本类所有测试方法之前先调用这个方法
@before
public
void
setup()
throws
exception {
applicationcontext =
new
classpathxmlapplicationcontext(
"classpath:spring/applicationcontext.xml"
);
}
@test
public
void
testfinduserbyid()
throws
exception {
// 通过配置资源对象获取 userdao 对象
userdao userdao = (userdao) applicationcontext.getbean(
"userdao"
);
// 调用 userdao 的方法
user user = userdao.finduserbyid(
1
);
// 输出用户信息
system.out.println(user.getid() +
":"
+ user.getusername());
}
}
|
运行测试方法,输出结果如下:
动态代理 + 注解实现 。
上面的实例程序并没有使用 mapper 动态代理和注解来完成,下面我们就来试试如何用动态代理和注解:
第一步:编写 userquerymapper 。
在【mapper】下新建一个【userquerymapper】代理接口,并使用注解:
1
2
3
4
5
6
7
8
9
10
|
package
cn.wmyskxz.mapper;
import
cn.wmyskxz.pojo.user;
import
org.apache.ibatis.annotations.select;
public
interface
userquerymapper {
@select
(
"select * from user where id = #{id}"
)
public
user finduserbyid(
int
id)
throws
exception;
}
|
注意: 在默认情况下,该 bean 的名字为 userquerymapper(即首字母小写) 。
现在有了代理类,我们需要通知 spring 在这里来扫描到该类,mapper 扫描配置对象需要用专门的扫描器:
1
2
3
4
5
|
<!-- mapper 扫描器 -->
<bean
class
=
"org.mybatis.spring.mapper.mapperscannerconfigurer"
>
<!-- 扫描 cn.wmyskxz.mapper 包下的组件 -->
<property name=
"basepackage"
value=
"cn.wmyskxz.mapper"
/>
</bean>
|
第二步:编写测试类 。
这一次我们获取的不再是 userdao 对象,而是定义的 mapper 代理对象 userquerymapper:
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
|
package
cn.wmyskxz.test;
import
cn.wmyskxz.mapper.userquerymapper;
import
cn.wmyskxz.pojo.user;
import
org.junit.before;
import
org.junit.test;
import
org.springframework.context.applicationcontext;
import
org.springframework.context.support.classpathxmlapplicationcontext;
public
class
userservicetest {
private
applicationcontext applicationcontext;
// 在执行测试方法之前首先获取 spring 配置文件对象
// 注解@before在执行本类所有测试方法之前先调用这个方法
@before
public
void
setup()
throws
exception {
applicationcontext =
new
classpathxmlapplicationcontext(
"classpath:spring/applicationcontext.xml"
);
}
@test
public
void
testfinduserbyid()
throws
exception {
// 通过配置资源对象获取 userdao 对象
userquerymapper userquerymapper = (userquerymapper) applicationcontext.getbean(
"userquerymapper"
);
// 调用 userdao 的方法
user user = userquerymapper.finduserbyid(
1
);
// 输出用户信息
system.out.println(user.getid() +
":"
+ user.getusername());
}
}
|
运行测试方法,得到正确结果:
可以看到,查询结果和之前非 mapper 代理的查询结果一样.
总结 。
以上所述是小编给大家介绍的mybatis 与 spring 的完美整合方法,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我网站的支持! 。
原文链接:https://www.cnblogs.com/wmyskxz/p/8879513.html 。
最后此篇关于MyBatis 与 Spring 的完美整合方法的文章就讲到这里了,如果你想了解更多关于MyBatis 与 Spring 的完美整合方法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
前言 这个东西有啥用,好玩? 确实, 好玩归好玩,其实很有使用场景。 可以自己选则一些业务节点触发这个机器人助手的消息推送; 简单举例: 有人给你的系统留下反馈意见了,推送到运营群去; 2.项目部署成
1. JWT 简介 JSON Web Token(JWT) 是一个开放标准(RFC 7519),它定义了一种紧凑的、自包含的方式,用于作为 JSON 对象在各方之间安全地传输信息。该信息可以被验证和信
我的页面上有多个 ajax 调用,我想将它们合并为一个函数。 目前我在几个地方都有这种类型的功能: function AjaxCallOne () { //do something $.ajax(
我的 Facebook 集成基本上可以在我的应用程序中运行:出现 Facebook 对话框,用户可以选择“允许”或“不允许”。但是,我不明白 API 是如何工作的!我有一个使用此代码的 Activit
我必须将文件夹结构从我的应用程序共享到 OneDrive。 我已经检查了一个驱动器的 sdk,但在那个 sdk 中只能共享文件而不是文件夹,并且没有在该 sdk 中创建文件夹的选项 https://g
我是支付网关集成方面的新手。我必须在我的项目 (CORE PHP) 中集成 CCAvenue 支付网关集成。但是我不知道如何为开发人员测试创建商户帐户,如何获取商户 key 等。我已经进行了研发,但是
我正在尝试将“社交选项”集成到我的应用程序中。 我有 iOS6,但我的想法是有一个适用于 iOS5 的应用程序。使用 Twitter 框架非常简单,并且可以在 r.0 版本和 6.0 版本的设备上运行
我正在尝试将 flurryAds 集成到我的 iPhone 应用程序中,但我无法做到这一点。我导入名为 的 .h 文件 #import "Flurry.h" #import "FlurryAds.h"
我正在尝试在我的网站中实现类似 facebook 的按钮和评论,但我在 IE7 中遇到了评论框问题。 COMMENT USING 下拉框不知何故没有显示其他可用选项。这是我用来实现它的代码片段:
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 11 年前。 Improve th
我正在使用 SOAP API 进行 PayPal 集成(Express Checkout)。在 DoExpressCheckout 调用后,我调用 GetExpressCheckoutDetails。
我正在尝试将 paypal 作为支付网关之一集成到我的应用程序中,但在我点击支付按钮后它会返回以下错误。 错误 java.lang.RuntimeException:无法使用 Intent { cmp
我目前正在尝试将 paypal 结账与我们的在线商店集成。我们正在针对 Sandbox 进行测试。除了 IPN(即时付款通知)之外的所有内容都有效。 我们阅读了很多有关 Paypal 更改其安全模型的
我正在开发一个 android 应用程序,我想在其中集成 facebook 之类的。我正在浏览链接 http://developers.facebook.com/docs/guides/mobile/
所以我正在尝试构建一个集成了 FitBit 的 iOS 应用程序 (Swift 2)。 一旦用户打开“步行”页面,用户应该能够看到他每天的步数。 理想情况下,我们不希望每个用户都注册到 FitBit。
我是集成投递箱的新手,但我不太确定如何生成调用以获取请求 token secret 。 https://www.dropbox.com/developers/reference/api#request
我已经成功集成了 PayPal。一切正常。但我希望我的表格在成功付款后重定向到我的网站。另一个问题:如何从 PayPal 得到回应?这是我的 Paypal 表格。谢谢。 `
我在我的 Android 应用程序中集成了 Paypal 。我有一个主要 Activity - 和关于 Activity ,我在其中显示 Paypal 按钮。关于从主 Activity 访问的 Act
前言: 小编引入的图片和文字描述都是来自于尚硅谷的视频讲解,在此感谢尚硅谷的老师,同时也结合 seata文档官方文档进行整合 项目地址(gitee): https://gitee.com/qine
目录 1. demo project 1.1 接口准备 1.2 配置准备 2. docker 开启远程连接
我是一名优秀的程序员,十分优秀!