iBatis快速入门教程中文版
1.?显示数据库所有数据
iBatis是个像Hibernate, JDO,EJB一类的数据持久框架,它能将对象映射为SQL语句.它是个轻量级的框架并且持久性API适合持久化POJO.iBatis也与Hibernate, JDO不同,因为它使用存储过程和现有的SQL来处理数据库.
本节我们将向你讲述如何配置iBatis来运行一个小型程序.既然一次性将所有知识全部解释很难,我们索性把本教程分为几个单独的例子来陈述.该例是关于如何从数据库读取数据并将结果显示在你的命令提示符上.在第二个例子中你将学习如何添加更多的数据到数据库中,在此之后的第三个例子将会向你展示如何通过iBatis从记录中删除数据.
现在的第一个例子将会向你展示如何从数据库中读取记录,我们需要一个数据库来执行查询,所以我们使用MySQL5.0作为这个例子的数据库.
这里我们将要检索一些人的contact的信息, contact的表结构给出如下 :
DROP TABLE IF EXISTS `contact`;
CREATE TABLE `contact` (
?????? `id` int(11) NOT NULL auto_increment,
?????? `firstName` varchar(20) default NULL,
?????? `lastName` varchar(20) default NULL,
?????? `email` varchar(20) default NULL,
?????? PRIMARY KEY (`id`)
);
根据Contact表我们需要创建一个POJO类,在我们的例子中,数据库vin有一个表Contact,包括四个字段 :
??id
??firstName
??lastName
??email
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来指定如下信息 :
??针对映射语句的命名空间前缀
??我们的数据库将使用JDBC来进行访问
??针对MySQL的JDBC驱动为" com.mysql.jdbc.Driver"
??连接URL为"jdbc:mysql://192.168.10.112:3306/vin"
??用户名与密码分别为"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://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>
映射文件在下面给出,它主要负责为我们的程序执行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" result+ c.getId());
????? System.out.print("? " + c.getFirstName());
????? System.out.print("? " + c.getLastName());
????? System.out.print("? " + c.getEmail());
??????? contact = c;
????? System.out.println("");
????? }???
? }
}
为了运行该例,你需要遵循如下步骤 :
??在你的MySQL数据库中创建表Contact
??下载iBatis的JAR文件(ibatis-common-2.jar,ibatis-dao-2.jar,ibatis-sqlmap-2.jar),并将其放置在你的lib目录中
??设置类路径
??创建Contact.java将其编译
??创建Contact.java
??创建SqlMapConfig.xml
??创建IbatisExample.java并将其编译
??执行IbatisExample文件
输出 :
你的命令提示符应该有像这样的输出 :?
?
2.向数据库插入数据
iBatis最棒的特点就是它的简洁,这也是唯一令它在任何数据库程序中更容易使用的原因.iBatis使得通过Java或者任何其它的Microsoft的程序来使用数据库变得非常简单.本章我们将会通过一个例子向你介绍如何向数据库插入一行数据.我们使用MySQL作为本例的数据库,和我们上一章中使用的是一样的.这是"Contact"表和我们上一章使用过的两个文件:"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>
我们使用<insert>标签来映射SQL语句,在该标签中我们定义了一个"id",它将在IbatisInsertion.java文件中用来执行数据库插入,查询操作.
<selectKey resultkeyProperty="id">
?? select last_insert_id() as id
</selectKey>
上面的代码意味着表中被插入数据的下一行.
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">
<!--- Inserting data in table -->
<insert id="insert" parameterkeyProperty="id">
??????????????? select last_insert_id() as id
?????????? </selectKey>
</insert>
<!--- Showing all data of table -->
<select id="getAll" result+ c.getId());
????? System.out.print("? " + c.getFirstName());
????? System.out.print("? " + c.getLastName());
????? System.out.print("? " + c.getEmail());
??????? contact = c;
????? System.out.println("");
??? }
????? System.out.println("===============================================");
????? }???
}
如何执行本例 :
1.创建Contact.java并将其编译
2.创建Contact.xml和SqlMapConfig.xml
3.创建IbatisInsertion.java
4.执行IbatisInsertion类文件,结果将在你的命令提示符上输出如下 :
"Record Inserted Successfully"
输出 :
?
3.iBatis删除操作教程
我希望通过上面的例子,你能完全懂得如何向数据库执行插入或者查询操作.所以在本例中你将学习到如何通过iBatis在数据库中删除数据.所以你需要分析代码并清楚的理解在这些代码里到底发生了什么.然而你绝对不需要再创建一个不同的数据库,虽然你知道我们使用上一个MySQL作为数据库而且你已经知道了我们的表名是Contact.但你可以选择是使用这个数据库还是再创建一个,这都由你决定!你唯一需要确定的就是你定义的表名是正确的,否则将会产生Bug.如果你从本iBatis教程的开始学下来的,那么你是不需要修改代码的.仅仅将给定的代码拷贝到文件夹并执行,最终删除数据库表中的数据.
正如我之前提到的,在iBatis的本章,我们将要从Ctract表中删除记录,我们使用MySQL的数据库"vin"
我们的Contact.java和SqlMapConfig.xm与上一个例子中的是一样的.
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>
?
在Contract.xml文件中我们使用<delete>标签删除Contract表中的全部记录.
<delete id="deleteAll" parameterencoding="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">
<!--- Delete data from Contact table -->
<delete id="deleteAll" parameterresult+ c.getId());
??????? System.out.print("? " + c.getFirstName());
????? System.out.print("? " + c.getLastName());
????? System.out.print("? " + c.getEmail());
??????? contact = c;
????? System.out.println("");
??? }
??? System.out.println("============================================");
????? }???
}
按照如下步骤执行本例 :
创建Contact.xml和SqlMapConfig.xml
创建Contract.java并将其编译
创建IbatisDeletion.java并将其编译
执行IbatisDeletion你将会在你的命令提示符中得到如下输出 :
?
4.更新表中的数据
对任何数据库程序来说,添加,更新,删除都是十分常见且必要的特性.在该教程里我们已经讲解了使用iBatis在Java中进行插入和删除操作,现在本章将讲述如何使用iBatis在数据表中更新数据.在iBatis中执行一条更新语句是非常简单的.为了更新数据你得在SQL映射文件"Contact.xml"中添加SQL的update语句.
iBatis更新语句例子 :
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>
?
iBatis更新查询
在我们的例子中,我们通过参数中指定的id更新了表中的数据,因此对于"id"我们将"parameterClass"的属性值分配为"long".
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" resultparameter+ c.getId());
????? System.out.print("? " + c.getFirstName());
????? System.out.print("? " + c.getLastName());
????? System.out.print("? " + c.getEmail());
??????? contact = c;
????? System.out.println("");
??? }
??? System.out.println("============================================");
?? }???
}
为了执行update的例子,遵照如下步骤 :
? 创建Contact.java和SqlMapConfig.xml
? 编译Contact.java
? 创建Contact.xml
? 创建IbatisUpdate.java并将其编译
? 执行IbatisUpdate类文件,你会得到如下输出 :
?
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" 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" resultencoding="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" result+ 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信息将在你的命令提示符下显示 :
?