很久没细看过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的更多相关文章

  1. Mybatis面向接口式编程

    Mybatis面向接口编程 1.xml文件书写格式 <?xml version="1.0" encoding="UTF-8" ?> <!DOC ...

  2. MyBatis源码解析【7】接口式编程

    前言 这个分类比较连续,如果这里看不懂,或者第一次看,请回顾之前的博客 http://www.cnblogs.com/linkstar/category/1027239.html 修改例子 在我们实际 ...

  3. mybaits接口式编程

    Mybatis是接口式编程实现对.xml中sql语句的执行,其过程如下(取自慕课网视频<通过自动回复机器人学Mybatis---加强版>): 1.加载配置信息2.通过加载配置信息加载一个代 ...

  4. Mybatis笔记二:接口式编程

    目录 旧方法的弊端 接口式编程 接口式编程的好处 接口式编程的增删改查 旧方法的弊端 在Mybatis笔记一中,我们使用命名空间+id的方式实现了Mybatis的执行,不过这里的命名空间是我们随便写的 ...

  5. 通过自动回复机器人学Mybatis 笔记:接口式编程

    [接口式编程]尚未遇见Spring --> 代码量反而增加 1.增加约定,减少犯错的可能(不用直接去写字符串 修改点1:命名空间 修改点2:增加接口,方法名与配置文件中的id对应 package ...

  6. 通过自动回复机器人学Mybatis笔记:接口式编程

    [接口式编程]尚未遇见Spring --> 代码量反而增加 1.增加约定,减少犯错的可能(不用直接去写字符串 修改点1:命名空间 修改点2:增加接口,方法名与配置文件中的id对应 package ...

  7. MyBatis3-topic04,05 -接口式编程

    笔记要点 /**接口式编程: * 1. 原生: Dao 接口-->Dao接口的实现类 * mybatis: Mapper --> 有一个与之对应的 XXMapper.xml * 2. Sq ...

  8. MyBatis接口式编程

    MyBatis使用接口连接数据库 之前学习了如何传统的使用MyBatis连接数据库,今天学习如何使用更方便快捷的方式练级数据库.使用接口连接数据库 https://www.cnblogs.com/li ...

  9. MyBatis源码解析【8】简单demo理解接口式编程

    前言 这个分类比较连续,如果这里看不懂,或者第一次看,请回顾之前的博客 http://www.cnblogs.com/linkstar/category/1027239.html 上一次我们经过源码的 ...

随机推荐

  1. C# 操作Excel图形——绘制、读取、隐藏、删除图形

    简介 本篇文章将介绍C# 如何处理Excel图形相关的问题,包括以下内容要点: 1.绘制图形 1.1 绘制图形并添加文本到图形 1.2 添加图片到图形 1.3 设置图形阴影效果 1.4 设置图形透明度 ...

  2. 收集的博客网址springboot、cloud

    纯洁的微笑(spring-boot,cloud等)

  3. 大型网站架构演进(6)使用NoSQL和搜索引擎

    随着网站业务越来越复杂,对数据存储和检索的需求也越来越复杂,网站需要采用一些非关系型数据库技术(即NoSQL)和非数据库查询技术如搜索引擎.NoSQL数据库一般使用MongoDb,搜索引擎一般使用El ...

  4. vue遍历数组和对象的方法以及他们之间的区别

    前言:vue不能直接通过下标的形式来添加数据,vue也不能直接向对象中插值,因为那样即使能插入值,页面也不会重新渲染数据 一,vue遍历数组   1,使用vue数组变异方法 pop() 删除数组最后一 ...

  5. Android各版本特性

    此篇文章可以利用碎片化时间进行消化和了解,针对Android各个版本特性,并没有把所有列出,只是抽出了比较常用重要的特性作为提示,同时在面试中只要牢记重要的几个点即可,其他特性直接查找官方文档即可. ...

  6. asp.net core 2.1 部署 centos7

    asp.net core 2.1 部署 centos7 Kestrel 非常适合从 ASP.NET Core 提供动态内容. 但是,Web 服务功能不像服务器(如 IIS.Apache 或 Nginx ...

  7. 【笔记】两个根因分析方法:5WHY&10WHY

    什么是问题根因分析 根本原因分析(root cause analysis):通过调查和分析问题哪里出错.为什么出错,寻求防止差错事故再次发生的必要措施,从而提高服务安全和质量. 根因分析目标 问题(发 ...

  8. Integer a= 127 与 Integer b = 128相关

    Integer a = 127; Integer b = 127; Integer c = 128; Integer d = 128; a == b 与 c == d 的比较结果是什么? a == b ...

  9. c/c++ 重载运算符 类型转换运算符

    重载运算符 类型转换运算符 问题:能不能把一个类型A的对象a,转换成另一个类型B的对象b呢?? 是可以的.这就必须要用类型A的类型转换运算符(conversion operator) 下面的opera ...

  10. Linux中输入输出重定向的问题

      Linux 命令默认从标准输入设备(stdin)获取输入,将结果输出到标准输出设备(stdout)显示.一般情况下,标准输入设备就是键盘,标准输出设备就是终端,即显示器. 输出重定向:命令的输出不 ...