iBatis入手案例
第一部分,iBatis组织架构分析
1.1 组织架构图

1.2 架构分析
DAO层上面,DAO类通过SqlMapConfig文件,来构建iBatis提供的SqlMapClient,SqlMapConfig文件的作用就是:将操作行为以iBatis约定的方式配置到文件中;由iBatis提供的解析类SqlMapClientBuilder来进行解析并构建出SqlMapClient对象,如下所示:

应用层通过SqlMapClient对象来执行之前通过配置文件定义的操作;所以iBatis沿用的是Java第三方框架 一贯沿用的"面向配置"的思路。
iBatis处理提供了一个对象用来执行操作,使得操作更加集中,提高了工作效率之外,还做了一件更重要的事情,就是实现了和DTO互操作,也是就是O/R Mapping。这里的提到了"互操作"是指:iBatis接收DTO的形式作为参数容器,底层采用反射的方式根据命名进行参数映射;另一方面iBatis可以将(查询)结果自动映射到指定的DTO中。
第二部分,入手案例
创建数据表
创建数据库表,入手案例为链接Mysql,sql如下:
DROP TABLE IF EXISTS `tbl_student`;
CREATE TABLE `tbl_student` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(100) DEFAULT NULL,
`score` float DEFAULT NULL,
`birth` date DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
创建DTO:
import java.sql.Date;
public
class Student {
private
int
id;
private String name;
private
float
score;
private Date birth;
private
int
getId() {
return
id;
}
private
void
setId(int id) {
this.id = id;
}
private String getName() {
return
name;
}
private
void
setName(String name) {
this.name = name;
}
private
float
getScore() {
return
score;
}
private
void
setScore(float score) {
this.score = score;
}
private Date getBirth() {
return
birth;
}
private
void
setBirth(Date birth) {
this.birth = birth;
}
}
创建一个Dao接口
创建一个Dao接口,里面定义了Dao操作;
import java.util.List;
public
interface StudentDao {
public
void createStudent(Student pStudent);
public
void updateStudent(Student pStudent);
public
void deleteStudent(int pStudentId);
public List<Student> selectAllStudent();
}
创建DaoImpl
创建核心数据访问层,DaoImpl:
public
class StudentDaoImpl implements StudentDao {
private
static SqlMapClient sqlMapClient = null;
static{
try {
Reader reader = Resources.getResourceAsReader("iBatis/Demo/SqlMapConfig.xml");
sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public
void createStudent(Student pStudent) {
try {
Object ret = sqlMapClient.insert("insertStudent", pStudent);
System.out.println("Add student return value: " + ret);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public
void updateStudent(Student pStudent) {
try {
Object ret = sqlMapClient.update("updateStudent", pStudent);
} catch (SQLException e) {
e.printStackTrace();
}
}
@Override
public
void deleteStudent(int pStudentId) {
try {
Object ret = sqlMapClient.delete("deleteStudent", pStudentId);
System.out.println("delete Student return value: " + ret);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
@Override
public List<Student> selectAllStudent() {
try {
List<Student> stus = sqlMapClient.queryForList("getAllStudent");
System.out.println("Get All student Count(s): " + stus.size());
} catch (SQLException e) {
e.printStackTrace();
}
return
null;
}
创建配置sqlMapConfig
config文件中在iBatis里面扮演着一个头文件的角色,里面定义了对于jdbc资源文件(Properties的resource属性)的引用以及框架中需要加载的包含SQL的DAO的文件(sqlMap节点中定义);
<?xml
version="1.0"
encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig
PUBLIC
"-//ibatis.apache.org//DTD SQL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd">
<sqlMapConfig>
<properties
resource="myibatis/study/SqlMap.properties"/>
<transactionManager
type="JDBC">
<dataSource
type="SIMPLE">
<property
name="JDBC.Driver"
value="${driver}"
/>
<property
name="JDBC.ConnectionURL"
value="${url}"
/>
<property
name="JDBC.Username"
value="${username}"
/>
<property
name="JDBC.Password"
value="${password}"
/>
</dataSource>
</transactionManager>
<sqlMap
resource="myibatis/study/Student.xml"
/>
</sqlMapConfig>
创建关联的Properties文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
username=root
password=root
创建关联的DAO文件
<?xml
version="1.0"
encoding="UTF-8"?>
<!DOCTYPE sqlMap
PUBLIC
"-//ibatis.apache.org//DTD SQL Map 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-2.dtd">
<sqlMap>
<!-- 通过typeAlias使得我们在下面使用Student实体类的时候不需要写包名 -->
<typeAlias
alias="Student"
type="iBatis.Demo.Student"
/>
<!-- 这样以后改了sql,就不需要去改java代码了 -->
<!-- id表示select里的sql语句,resultClass表示返回结果的类型 -->
<select
id="selectAllStudent"
resultClass="Student">
select * from
tbl_student
</select>
<!-- 注意这里的resultClass类型,使用Student类型取决于queryForList还是queryForObject -->
<select
id="selectStudentByName"
parameterClass="String"
resultClass="Student">
select name,birth,score from tbl_student where name like
'%$name$%'
</select>
<insert
id="insertStudent"
parameterClass="Student">
insert into
tbl_student(name,birth,score) values
(#name#,#birth#,#score#)
<!--<selectKey resultClass="int" keyProperty="id">
select @@identity as inserted
这里需要说明一下不同的数据库主键的生成,对各自的数据库有不同的方式: -->
<!-- mysql:SELECT LAST_INSERT_ID() AS VALUE -->
<!-- mssql:select @@IDENTITY as value -->
<!-- oracle:SELECT STOCKIDSEQUENCE.NEXTVAL AS VALUE FROM DUAL -->
<!-- 还有一点需要注意的是不同的数据库生产商生成主键的方式不一样,有些是预先生成 (pre-generate)主键的,如Oracle和PostgreSQL。
有些是事后生成(post-generate)主键的,如MySQL和SQL Server 所以如果是Oracle数据库,则需要将selectKey写在insert之前
</selectKey> -->
</insert>
<delete
id="deleteStudent"
parameterClass="int">
<!-- #id#里的id可以随意取,但是上面的insert则会有影响,因为上面的name会从Student里的属性里去查找 -->
<!-- 我们也可以这样理解,如果有#占位符,则ibatis会调用parameterClass里的属性去赋值 -->
delete from tbl_student where id=#id#
</delete>
<update
id="updateStudent"
parameterClass="Student">
update tbl_student set
name=#name#,birth=#birth#,score=#score# where id=#id#
</update>
</sqlMap>
测试入口
创建Main函数进行测试:
public
class StudentEntry {
public
static
void main(String[] args) {
StudentDaoImpl dao = new StudentDaoImpl();
Student s = new Student();
s.setName("Lorry");
s.setScore(99);
dao.createStudent(s);
dao.deleteStudent(1);
}
}
调试后记:
"在处理指令目标和数据之间需要有空格",报的异常地方是"SqlMapConfig.xml"文件,但是其实是因为ibastis会校验config的xml文件节点中sqlMap节点文件关联到的资源文件DAO的xml。这里也是在讲述对于第三方应用工具调试的思路:很多时候报错不是在报错出,还可能是报错处所引用到的深层内内容,你所看到的问题,可能"水很深"。
iBatis入手案例的更多相关文章
- ibatis新手入门
ibatis 是什么 iBATIS是以SQL为中心的持久化层框架. 能支持懒载入.关联查询.继承等特性. iBATIS不同于一般的OR映射框架. OR映射框架,将数据库表.字段等映射到类.属性,那是一 ...
- What is NodeJS(学习过程)
为什么要学习node.首先是听说了这个和前后端分离有很大的关系.node作为一个基础的技术,需要提前学习.学习node,不打算直接先跟着视频去学习老师们的课程.因为想自己找到一种适合自己的学习方法.之 ...
- zTree的调用设使用(跨两个系统,两类技术实现的项目案例SpringMVC+Spring+MyBatis和Struts2+Spring+ibatis框架组合)
1.从zTree官网上下载zTree的包,zTree的官方网址是:http://www.ztree.me/v3/main.php#_zTreeInfo 2.引入zTree所需的依赖,例如(jQuery ...
- Ibatis 返回datatable数据类型案例
/// <summary> /// 查询实体 [DataSet数据集] /// </summary> /// <param name="statementNam ...
- Ibatis配置存储过程xml文件案例
-- <parameterMaps> <!--注意:parameterMap中的参数个数和顺序要和ProcGetPersonByName存储过程中的一致--> <para ...
- Ibatis根据id获取拼接好的sql语句案例
//得到sql语句: public virtual string GetSqlStatement(string statementName, object paramObject) { ISqlMap ...
- Ibatis ISqlMapper工厂类案例
namespace Model{ public class MapperFactory { //声明一个ISqlMapper接口类型的数据映射器 _mapper,其初始值为null private s ...
- 浅析MyBatis(一):由一个快速案例剖析MyBatis的整体架构与运行流程
MyBatis 是轻量级的 Java 持久层中间件,完全基于 JDBC 实现持久化的数据访问,支持以 xml 和注解的形式进行配置,能灵活.简单地进行 SQL 映射,也提供了比 JDBC 更丰富的结果 ...
- SQL Server内存遭遇操作系统进程压榨案例
场景: 最近一台DB服务器偶尔出现CPU报警,我的邮件报警阈(请读yù)值设置的是15%,开始时没当回事,以为是有什么统计类的查询,后来越来越频繁. 探索: 我决定来查一下,究竟是什么在作怪,我排查的 ...
随机推荐
- 在Linux下查看系统版本信息命令总结
每次在想查看系统是多少位的时候.总是记不清究竟用哪个命令.所以做个总结. vonzhou@de16-C6100:~$ lsb_release -a No LSB modules are availab ...
- mysql优化之索引优化
Posted by Money Talks on 2012/02/23 | 第一篇 序章第二篇 连接优化第三篇 索引优化第四篇 查询优化第五篇 到实战中去 索引优化 索引优化涉及到几个方面,包括了索引 ...
- orczhou----MYSQL
https://yq.aliyun.com/users/1597777588650149?spm=5176.blog11192.yqblogcon1.2.5mdGQb
- careercup-树与图 4.7
4.7 设计并实现一个算法,找出二叉树中某两个结点的第一个共同祖先.不得将额外的结点储存在另外的数据结构中.注意:这不一定是二叉查找树. 解答 本题的关键应当是在Avoid storing addit ...
- iOS开发中常见的语句@synthesize obj=obj的意义详解
我们在进行iOS开发时,经常会在类的声明部分看见类似于@synthesize window=_window; 的语句,那么,这个window是什么,_ window又是什么,两个东西分别怎么用,这是一 ...
- VS C# 快捷键
解决VS2010中工具箱的的不见的问题:按快捷键Ctrl+Alt+X 全屏:Shift+Alt+Enter注释选定内容:Ctrl+E+C/Crtr+E+U代码格式化:ctrl+E+F ======== ...
- Android主题切换方案总结
所谓的主题切换,就是能够根据不同的设定,呈现不同风格的界面给用户,也就是所谓的换肤. 1.将主题包(图片与配置)存到SD卡上(可通过下载或手动放入指定目录),在代码里强制从本地文件创建图片与配置文字大 ...
- 使用nexus创建maven私有仓库
nexus安装 nexus下载 wget https://sonatype-download.global.ssl.fastly.net/nexus/oss/nexus-2.11.1-01-bundl ...
- Linux coredump学习笔记
初学者笔记:linux的程序在发生异常情况下,会导致进程down,多数服务器会设置生成core文件,本人在实际运营过程中发生过进程不断core,被自动监控拉起,过段时间有core的情况,进而导致磁盘被 ...
- ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值
检查插入的值是否大于该字段数据类型约束的长度. 这个异常是指,用户向数据库执行插入数据操作时,某条数据的某个字段值过长,如 果是varchar2类型的,当长度超过2000,--4000(最大值)之间的 ...