近日,由于公司项目应用开发的逻辑层使用的是iBatis。上网查了些资料,自己写了点demo入门。感觉良好。iBatis实在是比Hibernate很容易入门,贡献出来与各路菜鸟分享(后文附源码),希望得到大神指教。转载请保留本文出处:http://itred.cnblogs.com ; 作者:itRed

  ORM框架中操作数据库的逻辑层中,Hibernate和iBatis相对来说是比较受欢迎的。Hibernate是“全自动”的,能够完全生成SQL语句;而iBatis是“半自动化”的,需要程序员根据自己的应用程序写相应的SQL语句。但是,在实际的开发过程中还是应根据实际情况进行选择。(iBatis的优缺点比较)

                                                   优点                                              缺点

与JDBC相比减少了很多的代码量;入门简单;架构级性能较强;

Sql语句和程序代码的分离;简化项目中的分工;

增强了移植性。

Sql语句需要程序员自己写;

参数数量只能一个,但是如果需要多个参数时,

需要将参数打包封装成Map等;

  

在进行iBatis应用程序开发之前首先需要对iBatis这个技术有一定的了解。iBatis是apache下的一个开源项目,因为其小巧,上手很快深受程序员的喜爱。iBatis的核心是SqlMap。

  本案例将详细介绍iBatis操作MySQL数据库。 利用iBatis对数据库中的记录进行简单的增删改查操作。测试方法main,显示结果到控制台。部分结果直接查看数据库信息。虽然demo比较简单,但是很能起到抛砖引玉的作用。

  数据准备:

数据库名称:ibatis

表名称:student

本人数据库中的数据信息:

案例解析及源码:

在正式操作数据库之前需要做一些准备工作,部分备注详见源码注释中:

首先需要导入ibatis的相关jar包,以及连接数据库的驱动jar包;在新建的项目文件下建一个Student的实体Bean。

package com.red;

import java.util.Date;
/**
* Student实体类
* @author Red
*
*/
public class Student {
//保证一个无参数方法。反射机制
private int sid=0;
private String sname=null;
private String major=null;
private Date birth=null;
private int score=0; public int getSid() {
return sid;
}
public void setSid(int sid) {
this.sid = sid;
}
public String getSname() {
return sname;
}
public void setSname(String sname) {
this.sname = sname;
}
public String getMajor() {
return major;
}
public void setMajor(String major) {
this.major = major;
}
public Date getBirth() {
return birth;
}
public void setBirth(Date birth) {
this.birth = birth;
}
public int getScore() {
return score;
}
public void setScore(int score) {
this.score = score;
}
@Override
public String toString() { //重写toString方法,方便控制台显示
String content="sid="+sid+"\tsname:"+sname+"\tmajor:"+major+"\tbirth:"+birth+"\tscore:"+score;
return content;
} }

Student.java

建一个接口以及它的实现类,为了测试方便直接将main方法放到该接口实现类中;

package com.red;

import java.util.List;
/**
* 接口
* @author Red
*
*/
public interface IStudentDAO {
public void addStudent(Student student);
public void deleteStudentById(int id);
public void updateStudentById(Student studnet);
public List<Student> queryAllStudent();
public List<Student> queryStudentByName(String name);
public Student queryStudentById(int id);
}

IStudentDAO

package com.red;

import java.io.Reader;
import java.sql.SQLException;
import java.util.List; import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder; public class IStudentDAOImpl implements IStudentDAO { private static SqlMapClient sqlMapClient=null;
static{
try{
Reader reader=Resources.getResourceAsReader("com/red/SqlMapConfig.xml");
sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);
reader.close();
}catch (Exception e) {
e.printStackTrace();
}
} public void addStudent(Student student) {
try {
sqlMapClient.insert("insertStudent", student);
} catch (SQLException e) {
e.printStackTrace();
} } public void deleteStudentById(int id) {
try {
sqlMapClient.delete("deleteStudentById",id);
} catch (SQLException e) {
e.printStackTrace();
}
} public List<Student> queryAllStudent() {
List<Student> studentList=null;;
try {
studentList=sqlMapClient.queryForList("selectAllStudent");
} catch (SQLException e) {
e.printStackTrace();
}
return studentList;
} public Student queryStudentById(int id) {
Student student=null;
try {
student=(Student) sqlMapClient.queryForObject("selectStudentById",id);
} catch (SQLException e) {
e.printStackTrace();
}
return student;
} /**
* 模糊查询
*/
public List<Student> queryStudentByName(String name) {
List<Student> studentList=null;
try {
studentList=sqlMapClient.queryForList("selectStudentByName", name);
} catch (SQLException e) {
e.printStackTrace();
}
return studentList;
} public void updateStudentById(Student student) {
try {
sqlMapClient.update("updateStudentById", student);
} catch (SQLException e) {
e.printStackTrace();
} } public static void main(String[] args) {
IStudentDAO dao=new IStudentDAOImpl();
/**
* 查询所有的学生对象*/
for(Student student:dao.queryAllStudent()){//遍历student对象
System.out.println(student);
} /**
* 查询指定id的学生对象
Student student=dao.queryStudentById(1);
System.out.println(student);
//以上两行代码可缩写为:
System.out.println(dao.queryStudentById(1));
*/ /**
* 插入学生对象数据
Student student=new Student();
student.setSid(3);
student.setSname("小明");
student.setMajor("应用化学");
student.setBirth(Date.valueOf("2013-09-09"));
student.setScore(88);
dao.addStudent(student);
*/ /**
* 删除指定id的学生数据
dao.deleteStudentById(1);
*/ /**
* 修改数据对象 Student student=new Student();
student.setSid(3);
student.setSname("朱小明");
student.setMajor("嵌入式开发");
student.setBirth(Date.valueOf("2013-09-09"));
student.setScore(68);
dao.updateStudentById(student);
*/ /**
* 模糊查询 for(Student student:dao.queryStudentByName("t")){
System.out.println(student);
}
*/
}
}

IStudentDAOImpl

建立一个SqlMap.properties的文件,该属性文件主要负责数据库的链接

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/ibatis
username=root
password=123456

SqlMap.properies

建立一个SqlMapConfig.xml文件,主要负责ibatis的配置

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMapConfig
PUBLIC "-//ibatis.apache.org//DTD SQLL Map Config 2.0//EN"
"http://ibatis.apache.org/dtd/sql-map-config-2.dtd"> <sqlMapConfig>
<properties resource="com/red/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="com/red/Student.xml"/>
</sqlMapConfig>

SqlMapConfig.xml

建立实体类的映射文件(SQL语句就在其中)

<?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 alias="student" type="com.red.Student"/>
<!-- 配置表和实体之间的映射关系 -->
<resultMap class="com.red.Student" id="student">
<result property="sname" column="SNAME"/>
<result property="major" column="MAJOR"/>
<result property="birth" column="BIRTH"/>
<result property="score" column="SCORE"/>
</resultMap> <select id="selectAllStudent" resultClass="student">
SELECT SID,SNAME,MAJOR,BIRTH,SCORE FROM `ibatis`.`student`
</select> <select id="selectStudentById" parameterClass="int" resultClass="student">
SELECT SID,SNAME,MAJOR,BIRTH,SCORE FROM `ibatis`.`student`
WHERE SID=#sid#
</select> <insert id="insertStudent" parameterClass="student">
INSERT INTO `ibatis`.`student`(SID,SNAME,MAJOR,BIRTH,SCORE)
values(#sid#,#sname#,#major#,#birth#,#score#)
</insert> <delete id="deleteStudentById" parameterClass="int">
DELETE FROM `ibatis`.`student`
WHERE sid=#sid#
</delete> <update id="updateStudentById" parameterClass="student">
UPDATE `ibatis`.`student` SET
SNAME=#sname#,MAJOR=#major#,BIRTH=#birth#,SCORE=#score#
WHERE sid=#sid#
</update> <select id="selectStudentByName" parameterClass="String" resultClass="student">
SELECT SID,SNAME,MAJOR,BIRTH,SCORE FROM `ibatis`.`student`
WHERE SNAME LIKE '%$sname$%'
</select>
</sqlMap>

Student.xml

ibatis查询数据库所有数据(重点解析本查询案例,另外的几个操作很简单,源码附注释,很容易看懂。不懂可以Email我。)

 public List<Student> queryAllStudent() {
List<Student> studentList=null;;
try {
studentList=sqlMapClient.queryForList("selectAllStudent");
} catch (SQLException e) {
e.printStackTrace();
}
return studentList;
}

Student中的SQL语句:

前几日刚在公司学到的经验,程序员在写SQL语句中的字段和关键字时尽量大写,显得专业,而且提高数据库的查询效率。

<select id="selectAllStudent" resultClass="student">
SELECT SID,SNAME,MAJOR,BIRTH,SCORE FROM `ibatis`.`student`
</select>

Main方法中的测试代码:

IStudentDAO dao=new IStudentDAOImpl();
for(Student student:dao.queryAllStudent()){//遍历student对象
System.out.println(student);
}

运行结果:

iBatis 模糊查询

iBatis 添加数据记录

iBatis 修改数据记录

iBatis 删除数据记录

这些操作都可以依葫芦画瓢,后文附本DEMO的源码,欢迎各位来邮交流学习心得。E-mail: it_red@sina.com

测试时,只需要去除要运行部分的注释。右击测试main方法就可顺利在控制台看到运行结果。

本文源码下载链接

   作者:itRed
出处:http://itred.cnblogs.com
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段说明,且在文章明显位置给出原文链接,否则保留追究法律责任的权利。

ibatis轻松入门的更多相关文章

  1. ibatis 轻松入门

    1.总中的配置文件 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE sqlMapConfig ...

  2. iBatis.net入门指南

    iBatis.net入门指南    - 1 - 什么是iBatis.net ?    - 3 - iBatis.net的原理    - 3 - 新人指路    - 3 - iBatis.net的优缺点 ...

  3. Groovy轻松入门——通过与Java的比较,迅速掌握Groovy (更新于2008.10.18)

    摘自: http://www.blogjava.net/BlueSUN/archive/2007/03/10/103014.html Groovy轻松入门--通过与Java的比较,迅速掌握Groovy ...

  4. Groovy轻松入门——搭建Groovy开发环境

    摘自: http://www.blogjava.net/BlueSUN/archive/2007/03/17/104391.html Groovy轻松入门--搭建Groovy开发环境 多日来,我发表了 ...

  5. C++ STL编程轻松入门基础

    C++ STL编程轻松入门基础 1 初识STL:解答一些疑问 1.1 一个最关心的问题:什么是STL 1.2 追根溯源:STL的历史 1.3 千丝万缕的联系 1.4 STL的不同实现版本 2 牛刀小试 ...

  6. Swift轻松入门——基本语法介绍和详细地Demo讲解(利用WebView打开百度、新浪等网页)

    转载请务必注明出处(all copyright reserved by iOSGeek) 本文主要分为两个部分,第一部分介绍Swift的基本语法,第二部分讲解一个利用WebView来打开百度.sina ...

  7. JavaScript面向对象轻松入门之封装(demo by ES5、ES6、TypeScript)

    本章默认大家已经看过作者的前一篇文章 <JavaScript面向对象轻松入门之抽象> 为什么要封装? 封装(Encapsulation)就是把对象的内部属性和方法隐藏起来,外部代码访问该对 ...

  8. asp.net core轻松入门之MVC中Options读取配置文件

    接上一篇中讲到利用Bind方法读取配置文件 ASP.NET Core轻松入门Bind读取配置文件到C#实例 那么在这篇文章中,我将在上一篇文章的基础上,利用Options方法读取配置文件 首先注册MV ...

  9. AngularJs轻松入门

    AngularJs轻松入门系列博文:http://blog.csdn.net/column/details/angular.html AngularJs轻松入门(一)创建第一个应用 AngularJs ...

随机推荐

  1. PHP路径常量和函数解释

    文件目录:

  2. Apache HttpAsyncClient 如何设置per request timeout

    最近做一个项目时用到HttpAsyncClient:因项目所需,要求能对一个具体的request 设置连接和读写超时:但发现在HttpAsyncClient中,只有在创建一个HttpAsyncClie ...

  3. 微信公共平台开发-(.net实现)1--成为开发者

    刚换了个新环境,哎这都快一个月了,还没适应过来,还是怀念老地方呀.老板让开发一个基于微信平台的开发项目,而且是用net实现.当时就蒙了,微信就用了一会个人赶脚不好,所以果断不用,现在让开发,而且查了一 ...

  4. 【腾讯Bugly干货分享】深入理解 ButterKnife,让你的程序学会写代码

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/578753c0c9da73584b025875 0.引子 话说我们做程序员的,都 ...

  5. linux 2.6 驱动笔记(三)

    驱动的并发与应用的并发实现一样,以信号量为例,修改基本字符驱动代码如下: 1. 增加sem定义 struct globalmem_dev{ struct cdev cdev; /*linux 2.6 ...

  6. FusionCharts简单教程(四)-----基本数字格式

          在统计图例中什么是最基本,最重要的元素?那就是数据.一个数据的统计图像那就是一堆空白.但是数据存在多种形式,比如小数,比如千分位等等.又如若一个数据是12.000000001,对于数据要求 ...

  7. Linux 数组

    200 ? "200px" : this.width)!important;} --> :介绍 在shell4.0之后支持普通数组和关联数组,普通数组只能使用整数作为索引,关 ...

  8. 分享一些Hadoop环境搭建所用到的软件

    本来想用土的掉渣的语言说说hadoop配置的,因为最近总有人问我,环境搭建老出莫名其妙的问题,可是写到一半,还是决定不写了,网上教程好多好多,而大家遇到问题有很多是软件版本不对应造成的,因此我就把大家 ...

  9. Senparc.Weixin.MP SDK 微信公众平台开发教程(十):多客服接口说明

    微信官方的多客服接口原理是通过用户发送的信息,开发者服务器返回一条指定类型的响应信息,使用户的对话状态切换到官方的多客服状态(持续一段时间),这段时间内用户发送的所有信息都不会到达开发者的服务器,而是 ...

  10. 搭建jekyll博客

    使用jekyll将markdown文件生成静态的html文件,并使用主题有序的进行布局,形成最终的博客页面. 特点 基于ruby 使用Markdown书写文章 无需数据库 可以使用GitHub Pag ...