第一部分,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中。

第二部分,入手案例

  1. 创建数据表

创建数据库表,入手案例为链接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;

  1. 创建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;

    }

}

  1. 创建一个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();

}

  1. 创建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;

    }

  1. 创建配置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>

  1. 创建关联的Properties文件

driver=com.mysql.jdbc.Driver

url=jdbc:mysql://localhost:3306/test

username=root

password=root

  1. 创建关联的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>

  1. 测试入口

创建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入手案例的更多相关文章

  1. ibatis新手入门

    ibatis 是什么 iBATIS是以SQL为中心的持久化层框架. 能支持懒载入.关联查询.继承等特性. iBATIS不同于一般的OR映射框架. OR映射框架,将数据库表.字段等映射到类.属性,那是一 ...

  2. What is NodeJS(学习过程)

    为什么要学习node.首先是听说了这个和前后端分离有很大的关系.node作为一个基础的技术,需要提前学习.学习node,不打算直接先跟着视频去学习老师们的课程.因为想自己找到一种适合自己的学习方法.之 ...

  3. zTree的调用设使用(跨两个系统,两类技术实现的项目案例SpringMVC+Spring+MyBatis和Struts2+Spring+ibatis框架组合)

    1.从zTree官网上下载zTree的包,zTree的官方网址是:http://www.ztree.me/v3/main.php#_zTreeInfo 2.引入zTree所需的依赖,例如(jQuery ...

  4. Ibatis 返回datatable数据类型案例

    /// <summary> /// 查询实体 [DataSet数据集] /// </summary> /// <param name="statementNam ...

  5. Ibatis配置存储过程xml文件案例

    -- <parameterMaps> <!--注意:parameterMap中的参数个数和顺序要和ProcGetPersonByName存储过程中的一致--> <para ...

  6. Ibatis根据id获取拼接好的sql语句案例

    //得到sql语句: public virtual string GetSqlStatement(string statementName, object paramObject) { ISqlMap ...

  7. Ibatis ISqlMapper工厂类案例

    namespace Model{ public class MapperFactory { //声明一个ISqlMapper接口类型的数据映射器 _mapper,其初始值为null private s ...

  8. 浅析MyBatis(一):由一个快速案例剖析MyBatis的整体架构与运行流程

    MyBatis 是轻量级的 Java 持久层中间件,完全基于 JDBC 实现持久化的数据访问,支持以 xml 和注解的形式进行配置,能灵活.简单地进行 SQL 映射,也提供了比 JDBC 更丰富的结果 ...

  9. SQL Server内存遭遇操作系统进程压榨案例

    场景: 最近一台DB服务器偶尔出现CPU报警,我的邮件报警阈(请读yù)值设置的是15%,开始时没当回事,以为是有什么统计类的查询,后来越来越频繁. 探索: 我决定来查一下,究竟是什么在作怪,我排查的 ...

随机推荐

  1. Linux守护进程的编程实现

    Linux 守护进程的编程方法 守护进程(Daemon)是执行在后台的一种特殊进程.它独立于控制终端而且周期性地执行某种任务或等待处理某些发生的事件.守护进程是一种非常实用的进程.Linux的大多数s ...

  2. oracle drop table and purge

    一.drop表 执行drop table xx 语句 drop后的表被放在回收站(user_recyclebin)里,而不是直接删除掉.这样,回收站里的表信息就可以被恢复,或彻底清除. 通过查询回收站 ...

  3. cocos2dx下最大纹理大小取决于平台

    原文:http://www.cocos2d-x.org/wiki/Max_size_of_textures_in_cocos2d-x_depends_on_each_platform 在理论上,coc ...

  4. C#泛型对类型参数的推断

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  5. Linux 普通用户su命令切换控制

    1.编辑配置文件/etc/pam.d/su .将下面配置文件"#“去掉: # auth           required        pam_wheel.so use_uid 改成 a ...

  6. R-大数据分析挖掘(2-R爬虫)

    RCurl作者:

  7. java Spring 在WEB应用中的实例化

    .前面讲解的都是通过直接读取配置文件,进行的实例化ApplicationContext AbstractApplicationContext app = new ClassPathXmlApplica ...

  8. 谨以此错误警醒自己---java.lang.ClassNotFoundException:

    今天在做一个小型的实例,用了面向接口编程,采用了工厂来获取数据源和实例,在从配置文件读取实例时,报了个错误如下图: 于是一个一个的类去找错误,最后也没找到,以为工厂代码出错了,看了好几次也没看出来错误 ...

  9. EasyUI中combotree允许多选的时候onSelect事件会重复触发onCheck事件

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgEAAADkCAIAAACOkmAuAAAgAElEQVR4nO2dW2wc15nnO0EQBJsdzA

  10. 最新的 cocoapods 安装与使用(2016.11)

    cocoapods简介: cocoapods 是iOS的类库管理工具,可以让开发者很方便集成各种第三方库,而不用去网站上一个个下载,再一个个文件夹的拖进项目中,还得添加相关的系统依赖库.只需要安装好c ...