作者:empty 出版社:empty |
iBatis简易教程
iBatis是个像Hibernate, JDO,EJB一类的数据持久框架,它能将对象映射为SQL语句.它是个轻量级的框架并且持久性API适合持久化POJO.iBatis也与Hibernate, JDO不同,因为它使用存储过程和现有的SQL来处理数据库.
我们将向你讲述如何配置iBatis来运行一个小型程序.既然一次性将所有知识全部解释很难,我们索性把本教程分为几个单独的例子来陈述.
第一个例子是关于如何从数据库读取数据并将结果显示.
第二个例子中你将学习如何添加更多的数据到数据库中.
第三个例子将会向你展示如何通过iBatis从记录中删除数据.
1.显示数据库所有数据
现在的第一个例子将会向你展示如何从数据库中读取记录,我们需要一个数据库来执行查询,所以我们使用MySQL5.0作为这个例子的数据库.
这里我们将要检索一些人的contact的信息, contact的表结构给出如下 :
DROP TABLE IF EXISTS `contact`;
CREATE TABLE `contact` (
`contactid` int(11) NOT NULL auto_increment,
`firstame` varchar(20) default NULL,
`lastname` varchar(20) default NULL,
`email` varchar(20) default NULL,
PRIMARY KEY (`contactid`)
);
根据Contact表我们需要创建一个POJO类,
在我们的例子中,数据库test有一个表Contact,包括四个字段 :
•contactid
•firstName
•lastName
POJO类的字段请与数据库建表字段相同,这样可以使用eclipse或myeclipse的自动生成方法。因为字段虽然不要求和数据库相同,但是要求getter 和setters方法里的名字相同。比如getId(),那么数据库里的就是id
Contact.java
public class Contact {
private String firstName;
private String lastName;
private String email;
private int contactid;
public Contact() {}
//放3个属性就行了,暂时不用contactid
public Contact(String firstName, String lastName,String email) {
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public int getContactid() {
return contactid;
}
public void setContactid(int id) {
this.contactid = id;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
为了映射配置我们需要创建SqlMapConfig.xml来指定如下信息 :
针对映射语句的命名空间前缀
我们的数据库将使用JDBC来进行访问
针对MySQL的JDBC驱动为 com.mysql.jdbc.Driver
连接URL为 jdbc:mysql://localhost:3306/test
用户名与密码分别为 root 和 root ,根据你自己情况填写
我们的SQL语句描述在 Contact.xml
SqlMapConfig.xml
?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>
settings useStatementNamespaces= true />
transactionManager type= JDBC >
dataSource type= SIMPLE >
property name= JDBC.Driver value= com.mysql.jdbc.Driver />
property name= JDBC.ConnectionURL
value= jdbc:mysql://localhost:3306/test />
property name= JDBC.Username value= root />
property name= JDBC.Password value= root />
/dataSource>
/transactionManager>
sqlMap resource= Contact.xml />
/sqlMapConfig>
映射文件在下面给出,它主要负责为我们的程序执行SQL查询. Contact.xml的代码如下 :
?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 namespace= Contact >
!--- Showing all data of table -->
select id= getAll resultClass= Contact >
select * from contact
/select>
select id= getById resultClass= Contact >
select * from contact where contact id = #contactid#
/select>
/sqlMap>
现在为了显示数据库中的数据我们需要创建一个类----IbatisExample,它从SqlMapConfig.xml中读取配置并在你的控制台输出所有数据. IbatisExample.java的代码如下 :
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import java.io.*;
import java.sql.SQLException;
import java.util.*;
public class IbatisExample{
public static void main(String[] args)
throws IOException,SQLException{
Reader reader = Resources.getResourceAsReader( SqlMapConfig.xml );
SqlMapClient sqlMap =
SqlMapClientBuilder.buildSqlMapClient(reader);
//Output all contacts
System.out.println( All Contacts );
List Contact> contacts =
sqlMap.queryForList( Contact.getAll ,null);
for (Contact c : contacts) {
System.out.print( + c.getId());
System.out.print( + c.getFirstName());
System.out.print( + c.getLastName());
System.out.print( + c.getEmail());
System.out.println( );
System.out.println( n按条件查询 Contacts );
int contactid = 1;
List Contact> contacts1 = sqlMap.queryForList( Contact.getById , contactid);
for(Contact c : contacts1){
System.out.print( +c.getcontactid());
System.out.print( +c.getFirstName());
System.out.print( +c.getLastName());
System.out.print( +c.getEmail());
System.out.println();
}
}
}
}
在你的MySQL数据库中创建表Contact
下载iBatis的JAR文件(ibatis-common-2.jar,ibatis-dao-2.jar,ibatis-sqlmap-2.jar),并将其放置在你的lib目录中
把jar添加到路径
创建Contact.java
创建SqlMapConfig.xml
创建IbatisExample.java
执行IbatisExample文件
输出 :
你的Console应该有像这样的输出 :
2.向数据库插入数据
Contact.xml增加红色字体部分
………
………
sqlMap namespace= Contact >
insert id= insert parameterClass= Contact >
insert into contact (firstName,lastName,email)
values (#firstName#, #lastName#, #email#)
/insert>
select id= getAll resultClass= Contact >
select * from contact
/select>
/sqlMap>
Sample.java的代码增加红色字体部分
public class IbatisInsertion{
public static void main(String[] args) throws IOException,SQLException{
Reader reader = Resources.getResourceAsReader( SqlMapConfig.xml );
SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
Contact contact=new Contact( Amit , Kumar , amit@roseindia.net );
sqlMap.insert( Contact.insert ,contact);
……
输出 : 对比第一个例子,增加了红色矩形中的部分
3.iBatis删除操作教程
类似第二个例子,在Contract.xml文件中插入如下部分。
我们使用 delete>标签按条件删除Contact表中的某些记录.
delete id= deleteById >
delete from Contact where contactid = #contactid#
/delete>
在sample.java中增加下面部分,另外,可以选择把第二个例子中增加的insert部分注释掉先,当然不注释也没关系。
int contactid = 1;
sqlMap.delete( Contact.deleteById ,contactid);
输出:
如上图所示,查询全部记录没有了第一条ID,按条件查询内容为空,因为id为1的记录刚才被删掉了。
4.更新表中的数据
在Contact.xml里增加如下代码
update id= updateById parameterClass= Contact >
update Contact set
firstName = #firstName#,
lastName = #lastName#,
email = #email#
where contactid = #contactid#
/update>
呃,在Contact.java里增加一个构造方法,将4个属性都放进去
public Contact(int contactid,
String firstName, String lastName, String email) {
this.contactid = contactid;
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
}
在sample.java里增加如下代码
//更新
Contact contact=new Contact(2, update , update , update@update.com );
sqlMap.update( Contact.updateById , contact);
输出结果如下:
==========================================
5.iBatis ResultMap例子
如果你使用iBatis的Result Map来工作,那么你一定知道iBatis的Result Map是用来提供数据库查询结果和它的对象属性之间的映射的,这是iBatis最常见且重要的特性了.本章仅是一个ResultMap的简单介绍.我们的Contact.java and SqlMapConfig.xml文件和我们的上一个例子是一样的,没有任何变化. Contact POJO的代码如下 :
Contact.java
public class Contact {
private String firstName;
private String lastName;
private String email;
private int id;
public Contact() {}
public Contact(
String firstName,
String lastName,
String email) {
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
SqlMapConfig.xml
?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>
settings useStatementNamespaces= true />
transactionManager type= JDBC >
dataSource type= SIMPLE >
property name= JDBC.Driver value= com.mysql.jdbc.Driver />
property name= JDBC.ConnectionURL
value= jdbc:mysql://192.168.10.112:3306/vin />
property name= JDBC.Username value= root />
property name= JDBC.Password value= root />
/dataSource>
/transactionManager>
sqlMap resource= Contact.xml />
/sqlMapConfig>
要想使用ResultMap我们得使用 resultMap> /resultMap>标签.它由一个id组成,该id需要在 select>标签下的resultMap属性中运行resultMap.这是Contact.xml的代码
?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 namespace= Contact >
!--- Showing data by ID -->
resultMap id= result class= Contact >
result property= id column= id />
result property= firstName column= firstName />
result property= lastName column= lastName />
result property= email column= email />
/resultMap>
select id= getById resultMap= result >
select * from contact where id=#id#
/select>
/sqlMap>
为了执行resultMap例子,我们需要将下面的Java代码引入进来.
sqlMap.queryForObject( Contact.getById ,new Integer(1));
这里我们传递值为1的id来显示所有该id的信息.
IbatisResultMap.java
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import java.io.*;
import java.sql.SQLException;
import java.util.*;
public class IbatisResultMap{
public static void main(String[] args)
throws IOException,SQLException{
Reader reader = Resources.getResourceAsReader( SqlMapConfig.xml );
SqlMapClient sqlMap =
SqlMapClientBuilder.buildSqlMapClient(reader);
//Output all contacts
System.out.println( *------Information by Contact Id--------* );
Contact contact =
(Contact)sqlMap.queryForObject( Contact.getById ,new Integer(1));
System.out.println( |Id = + contact.getId());
System.out.println( |First Name = + contact.getFirstName());
System.out.println( |Last Name = + contact.getLastName());
System.out.println( |Email Id = + contact.getEmail());
System.out.println( ========================================== );
}
}
为了运行该程序 :
创建Contact.xml和SqlMapConfig.xml
创建并编译Contact.java
创建并编译IbatisResultMap.java
在执行IbatisResultMap类文件的时候,该id的所有信息将会显示出来 :
6.iBatis存储过程例子
正如你在本教程上面部分看到的,通过iBatis我们可以在数据库表中执行内嵌的insert , delete, update SQL命令.本例中你将看到如何在iBatis中调用存储过程.
就像我在上一个例子中提到的,我们使用MySQL数据库,并且使用和上一个例子中一样的Contact表.
我们在数据库 vin 中创建了一个叫showData()的存储过程,它将显示Contract表中的所有的contact信息.为了创建存储过程,我们打开MySQL并创建如下定义的过程 :
DELIMITER $$
DROP PROCEDURE IF EXISTS `vin`.`showData`$$
CREATE PROCEDURE `vin`.`showData`()
BEGIN
select * from Contact;
END$$
DELIMITER ;
Contact.java 和 SqlMapConfig.xml 与上一个例子中的是一样的 :
Contact.java
public class Contact {
private String firstName;
private String lastName;
private String email;
private int id;
public Contact() {}
public Contact(
String firstName,
String lastName,
String email) {
this.firstName = firstName;
this.lastName = lastName;
this.email = email;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
}
SqlMapConfig.xml
?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>
settings useStatementNamespaces= true />
transactionManager type= JDBC >
dataSource type= SIMPLE >
property name= JDBC.Driver value= com.mysql.jdbc.Driver />
property name= JDBC.ConnectionURL
value= jdbc:mysql://192.168.10.112:3306/vin />
property name= JDBC.Username value= root />
property name= JDBC.Password value= root />
/dataSource>
/transactionManager>
sqlMap resource= Contact.xml />
/sqlMapConfig>
我们只需修改 Contact.xml 并使用 procedure>标签来调用存储过程
procedure id= storedInfo resultClass= Contact >
{ call showData() }
/procedure>
上面几行代码调用了存储过程并集合了contract表.下面是Contact.xml的代码 :
?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 namespace= Contact >
!--- Calling stored procedure -->
procedure id= storedInfo resultClass= Contact >
{ call showData()}
/procedure>
/sqlMap>
现在我们可以这样调用存储过程 :
sqlMap.queryForList( Contact.storedInfo ,null); sqlMap 是SqlMapClient类的一个对象. IbatisStoredProcedure.java的代码如下 :
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import java.io.*;
import java.sql.SQLException;
import java.util.*;
public class IbatisStoredProcedure{
public static void main(String[] args)
throws IOException,SQLException{
Reader reader =
Resources.getResourceAsReader( SqlMapConfig.xml );
SqlMapClient sqlMap =
SqlMapClientBuilder.buildSqlMapClient(reader);
System.out.println( All Contacts );
List Contact> contacts = (List Contact>)
sqlMap.queryForList( Contact.storedInfo ,null);
Contact contact = null;
for (Contact c : contacts) {
System.out.print( + c.getId());
System.out.print( + c.getFirstName());
System.out.print( + c.getLastName());
System.out.print( + c.getEmail());
contact = c;
System.out.println( );
}
}
}
请依照如下步骤执行本例 :
创建Contact.xml和SqlMapConfig.xml
创建Contact.java并将其编译
创建IbatisStoredProcedure.java并将其编译
执行IbatisStoredProcedure类文件,所有的Contract信息将在你的命令提示符下显示 :