MyBatis的接口式编程Demo
很久没细看过MyBatis了,时间一长就容易忘记。
下面是一个接口式编程的例子。
这里的例子一共分为4步:
1 首先要有一个namespace为接口的全类名的映射文件,该例中是 IMyUser.xml
2 然后在mybatis的容器(就是总的配置文件)里的mappers标签内
引入第1步中的映射文件,这里是 IMyUser.xml
3 通过SqlSession对象的getMapper(IMyUserDao.class)
获取一个接口的代理对象
4 调用代理对象的具体方法,也就是对应着 IMyUser.xml中的各个select,insert
等标签,这些标签的id属性同时必须与接口中的方法名一一对应
所需要的数据库表:
-- Create table
create table MYUSER
(
id NUMBER not null,
username VARCHAR2(32) not null,
password VARCHAR2(128) not null,
administrator VARCHAR2(5) not null
); insert into myuser (ID, USERNAME, PASSWORD, ADMINISTRATOR)
values ('', 'weiyongle01', 'hr', 'hr'); insert into myuser (ID, USERNAME, PASSWORD, ADMINISTRATOR)
values ('', 'weiyongle352', 'hr', 'hr'); insert into myuser (ID, USERNAME, PASSWORD, ADMINISTRATOR)
values ('', 'weiyongle353', 'hr', 'hr'); insert into myuser (ID, USERNAME, PASSWORD, ADMINISTRATOR)
values ('', '', 'hr', 'hr'); insert into myuser (ID, USERNAME, PASSWORD, ADMINISTRATOR)
values ('', 'weiyongle355', 'hr', 'hr'); insert into myuser (ID, USERNAME, PASSWORD, ADMINISTRATOR)
values ('', 'weiyongle359', 'hr', 'hr'); insert into myuser (ID, USERNAME, PASSWORD, ADMINISTRATOR)
values ('', 'weiyongle360', 'hr', 'wyl'); insert into myuser (ID, USERNAME, PASSWORD, ADMINISTRATOR)
values ('', 'weiyongle361', 'hr', 'hr'); insert into myuser (ID, USERNAME, PASSWORD, ADMINISTRATOR)
values ('', 'weiyongle362', 'hr', 'hr'); insert into myuser (ID, USERNAME, PASSWORD, ADMINISTRATOR)
values ('', 'weiyongle363', 'hr', 'hr'); insert into myuser (ID, USERNAME, PASSWORD, ADMINISTRATOR)
values ('', 'weiyongle364', 'hr', 'hr'); insert into myuser (ID, USERNAME, PASSWORD, ADMINISTRATOR)
values ('', 'weiyongle365', 'hr', 'hr'); insert into myuser (ID, USERNAME, PASSWORD, ADMINISTRATOR)
values ('', 'weiyongle359', 'hr', 'hr');
1 MyBatis配置文件,Configuration.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!-- Copyright 2009-2016 the original author or authors. Licensed under the
Apache License, Version 2.0 (the "License"); you may not use this file except
in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed
under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
OR CONDITIONS OF ANY KIND, either express or implied. See the License for
the specific language governing permissions and limitations under the License. -->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration>
<settings>
<setting name="useGeneratedKeys" value="false" />
<setting name="useColumnLabel" value="true" />
</settings> <!-- <typeAliases> <typeAlias alias="UserAlias" type="org.apache.ibatis.submitted.complex_property.User"/>
</typeAliases> --> <environments default="development">
<environment id="development">
<transactionManager type="JDBC">
<property name="" value="" />
</transactionManager>
<dataSource type="UNPOOLED">
<!-- Oracle数据库配置 -->
<property name="driver" value="oracle.jdbc.driver.OracleDriver" />
<property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl2" />
<property name="username" value="hr" />
<property name="password" value="hr" />
</dataSource>
</environment>
</environments> <!-- 配置的实体类 20161106添加 -->
<mappers>
<!-- <mapper resource="org/apache/ibatis/submitted/complex_property/User.xml" /> -->
<!-- 这个路径是从src下开始的,即以src作为根目录的,
这点和Resources.getResourcesAsStream("xx")里的xx一样,都是指向的具体文件的路径
,都是以src为根目录 -->
<mapper resource="com/test/mybatis/config/MyUser.xml" />
<!-- 接口式编程 -->
<!-- <mapper class="com.test.mybatis.dao.interf.IMyUserDao"/> -->
<mapper resource="com/test/mybatis/config/IMyUser.xml" />
</mappers> </configuration>
2 IMyUser.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- Copyright 2009-2016 the original author or authors. Licensed under the
Apache License, Version 2.0 (the "License"); you may not use this file except
in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software distributed
under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES
OR CONDITIONS OF ANY KIND, either express or implied. See the License for
the specific language governing permissions and limitations under the License. -->
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- MyBatis接口式编程 -->
<!-- 这里的namespace一定要是接口的全类名,这样就能够保证该mapper的唯一性 -->
<mapper namespace="com.test.mybatis.dao.interf.IMyUserDao">
<!-- select标签里的id属性值 getUser 对应着 上面namespace里的方法,
实际上就是接口里定义的方法 -->
<select id="getUser" resultType="com.test.mybatis.entity.MyUser" parameterType="int">
select * from MyUser where id = #{id}
</select>
<!-- select标签里的id属性值 getUserbyUser 对应着 上面namespace里的方法,
实际上就是接口里定义的方法 -->
<select id="getUserbyUser" parameterType="com.test.mybatis.entity.MyUser" resultType="com.test.mybatis.entity.MyUser" >
select * from MyUser
where 1=1
<!-- if 标签里的 test的属性值 username实际上是指的是
parameterType的属性值 com.test.mybatis.entity.MyUser
这个类里的一个成员属性,用于getter和setter方法,
不是之前理解的对应于数据库里的字段,还有username !=''
一定要写上,如果不写的话那么这个String类型的username成员变量
就会被MyBatis框架默认为"",从而可能会影响这里配置的slq的逻辑,
从而查询出来的结果可能会与我们自己设想中的不一样 -->
<if test="username != null and username !='' ">
AND username = #{username}
</if>
<if test="administrator != null and username !='' ">
AND administrator = #{administrator}
</if>
</select> <delete id="deleteUser" parameterType="String">
delete from MyUser where id = #{id}
</delete>
</mapper>
3.IMyUserDao.java
package com.test.mybatis.dao.interf; import com.test.mybatis.entity.MyUser; /**
* MyBatis接口式编程Demo
* @author Wei
* @time 2017年3月23日 下午1:26:21
*/
public interface IMyUserDao {
public MyUser getUser(int id);
public MyUser getUserbyUser(MyUser user);
public void deleteUser(String username);
}
4. IMyUserTest.java
package com.test.mybatis.dao.interf; import java.io.IOException;
import java.io.InputStream; import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import com.test.mybatis.entity.MyUser; /**
* 接口式编程的测试类
* @author Wei
* @time 2017年3月23日 下午2:26:22
*/
public class IMyUserTest { public IMyUserTest() {
// TODO Auto-generated constructor stub
} public static void main(String[] args) {
InputStream is = null;
SqlSessionFactory factory = null;
SqlSession sqlsession = null;
try {
is = Resources.getResourceAsStream("com/test/mybatis/config/Configuration.xml");
factory = new SqlSessionFactoryBuilder().build(is);
sqlsession = factory.openSession();
/**
* 获取接口,实际上是通过代理模式来获取的代理对象
* 1 首先要有一个namespace为接口的全类名的映射文件,该例中是 IMyUser.xml
* 2 然后在mybatis的容器(就是总的配置文件)里的mappers标签内
* 引入第1步中的映射文件,这里是 IMyUser.xml
* 3 通过SqlSession对象的getMapper(IMyUserDao.class)
* 获取一个接口的代理对象
* 4 调用代理对象的具体方法,也就是对应着 IMyUser.xml中的各个select,insert
* 等标签,这些标签的id属性同时必须与接口中的方法名一一对应
*/
IMyUserDao dao = sqlsession.getMapper(IMyUserDao.class);
MyUser user = new MyUser();
user.setUsername("weiyongle363");
// user.setAdministrator("wyl");
//调用接口的方法
user = dao.getUserbyUser(user);//正常
// user = dao.getUser(361);//正常运行
// user = dao.getUser(355);
// MyUser user = sqlsession.selectOne("com.test.mybatis.dao.interf.IMyUserDao.getUser",1);
if(user!=null){
System.out.println(user.toString());
}else{
System.out.println("没有查询到结果");
} } catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
执行结果:

MyBatis的接口式编程Demo的更多相关文章
- Mybatis面向接口式编程
Mybatis面向接口编程 1.xml文件书写格式 <?xml version="1.0" encoding="UTF-8" ?> <!DOC ...
- MyBatis源码解析【7】接口式编程
前言 这个分类比较连续,如果这里看不懂,或者第一次看,请回顾之前的博客 http://www.cnblogs.com/linkstar/category/1027239.html 修改例子 在我们实际 ...
- mybaits接口式编程
Mybatis是接口式编程实现对.xml中sql语句的执行,其过程如下(取自慕课网视频<通过自动回复机器人学Mybatis---加强版>): 1.加载配置信息2.通过加载配置信息加载一个代 ...
- Mybatis笔记二:接口式编程
目录 旧方法的弊端 接口式编程 接口式编程的好处 接口式编程的增删改查 旧方法的弊端 在Mybatis笔记一中,我们使用命名空间+id的方式实现了Mybatis的执行,不过这里的命名空间是我们随便写的 ...
- 通过自动回复机器人学Mybatis 笔记:接口式编程
[接口式编程]尚未遇见Spring --> 代码量反而增加 1.增加约定,减少犯错的可能(不用直接去写字符串 修改点1:命名空间 修改点2:增加接口,方法名与配置文件中的id对应 package ...
- 通过自动回复机器人学Mybatis笔记:接口式编程
[接口式编程]尚未遇见Spring --> 代码量反而增加 1.增加约定,减少犯错的可能(不用直接去写字符串 修改点1:命名空间 修改点2:增加接口,方法名与配置文件中的id对应 package ...
- MyBatis3-topic04,05 -接口式编程
笔记要点 /**接口式编程: * 1. 原生: Dao 接口-->Dao接口的实现类 * mybatis: Mapper --> 有一个与之对应的 XXMapper.xml * 2. Sq ...
- MyBatis接口式编程
MyBatis使用接口连接数据库 之前学习了如何传统的使用MyBatis连接数据库,今天学习如何使用更方便快捷的方式练级数据库.使用接口连接数据库 https://www.cnblogs.com/li ...
- MyBatis源码解析【8】简单demo理解接口式编程
前言 这个分类比较连续,如果这里看不懂,或者第一次看,请回顾之前的博客 http://www.cnblogs.com/linkstar/category/1027239.html 上一次我们经过源码的 ...
随机推荐
- C# Word文档中插入、提取图片,文字替换图片
Download Files:ImageOperationsInWord.zip 简介 在这篇文章中我们可以学到在C#程序中使用一个Word文档对图像的各种操作.图像会比阅读文字更有吸引力,而且图像是 ...
- SQL中# 与$ 的区别
区别: (1)#将传入的数据都当成一个字符串,会对自动传入的数据加一个双引号.如:order by #user_id#,如果传入的值是id,则解析成的sql为order by "id&quo ...
- Canvas:时钟
这个时钟是将钟盘的圆心点移到了 canvas 画布中心点.以方便后面的方位计算 ctx.translate(width/2,height/2); 现定义一个圆盘来显出这个时钟的基本位置 ctx.sav ...
- splay详解(一)
前言 Spaly是基于二叉查找树实现的, 什么是二叉查找树呢?就是一棵树呗:joy: ,但是这棵树满足性质—一个节点的左孩子一定比它小,右孩子一定比它大 比如说 这就是一棵最基本二叉查找树 对于每次插 ...
- 浏览器登录Dynamics 365 CE没毛病,程序连接却报错。
摘要: 微软动态CRM专家罗勇 ,回复308或者20190308可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 今天我做实验 ...
- 关于ArcMap中打开ArcToolbox导致闪退的解决办法
最近好久不用ArcGis的小编要用到ArcMap去发送一个GP服务,发现按照套路打开ArcMap点击ArcToolbox时,发生了ArcMap的闪退现象,几经周折终于解决了问题. 希望也遇到这类问题的 ...
- Fragment与Activity的生命周期对比
因为fragment是依赖于activity的,所以activity的创建相关都是先于fragment的,fragment的销毁相关都是先于activity的.
- dotNet core 应用部署至 centos(超详解附截图)
文章来源:公众号-智能化IT系统. 需要安装的插件以及支撑架构 1.dotnetSDK dotnet 相关命令是属于 .NET Core command-line (CLI) 的一部分,Microso ...
- location.origin不兼容IE8解决方案
最近项目中遇到一个问题,在ajax跟后台交互时需要传一个全路径url.项目上线后,在谷歌,火狐,360等浏览器访问一切正常.但唯独IE8下出现问题,提示url:undefined ! 这就尴尬了!!! ...
- 前后端分离djangorestframework—— 接入第三方的验证码平台
关于验证码部分,在我这篇文章里说的挺详细的了:Python高级应用(3)—— 为你的项目添加验证码 这里还是再给一个前后端分离的实例,因为极验官网给的是用session作为验证的,而我们做前后端分离的 ...