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 上一次我们经过源码的 ...
随机推荐
- ArcGIS for JavaScript学习(一)
一 API准备 从网上下载开发包:ArcGIS for JavaScript(百度网盘地址) sdk中含有API的帮助和例子 2.离线部署(以IIS为例) 配置IIS(详见网络):解压离线包,包中的 ...
- Ubuntu 16.04安装Zabbix 3.2 版本
系统环境:ubuntu16.04 注意:为了便于实验测试,需要关闭防火墙: parallels@zabbix-server:~$ sudo systemctl stop ufw parallels ...
- Android studio,第一个生成,调用成功的jni(说多了都是泪)
0x01 序言: 泪从何处说起呢?其实很早以前就用过android studio写过c++,但是,但是一直没有成功生成过so文件,所以心中一直有一个纠结...为什么不成功呢... 直到今天,由于工作的 ...
- java线程介绍
文章讲解要点 1.线程创建几种方式2.线程常见设置方法,包括优先级.优先级休眠.停止等3.多线程间的数据交互与锁机制4.项目源码下载 线程介绍.png 一.线程创建方式 常见的线程创建方法以下三种 ...
- No module named "Crypto",如何安装Python三方模块Crypto
前两天公司公司老总让我研究怎么用企业微信第三方应用进行官网对接,完成URL回调验证问题. 具体如何进行Python 的Django网站与企业微信第三方应用进行回调验证的博客地址为:https://ww ...
- 记阿里云SLB后配置Nginx反向代理百度地图API的坑
需求: 百度的原始请求:https://api.map.baidu.com/place/v2/suggestion?query=s®ion=sc&city_limit=true& ...
- vs2015启动崩溃,wpfgfx_v0400.dll加载D3DCompiler_47.dll失败
有一段时间没有用vs2015,今天一启动就crash,尝试了以下办法: 1. 卸载掉这段时间安装的一些软件和vs插件 2. 修复安装 3. 卸载.重新安装vs2015 sp2版本 4. devenv. ...
- SQL Server 更新统计信息出现严重错误,应放弃任何可能产生的结果
一台SQL Server 2008 R2版本(具体版本如下所示)的数据库,最近几天更新统计信息的作业出错,错误如下所示: Microsoft SQL Server 2008 R2 (SP2) - ...
- 转:sql server锁知识及锁应用
sql server锁(lock)知识及锁应用 提示:这里所摘抄的关于锁的知识有的是不同sql server版本的,对应于特定版本时会有问题. 一 关于锁的基础知识 (一). 为什么要引入锁 当多个用 ...
- c/c++ 继承与多态 容器与继承3
c/c++ 继承与多态 容器与继承2 巩固了容器里放智能指针的用法,但是有个问题,对于使用Basket类的用户来说,必须添加的是智能指针,如果能直接添加一个普通的类的对象的话,用起来就方便的多了,所以 ...