iBatis是像Hibernate, JDO和EJB一样的数据持久框架,它将对象映射为SQL语句.它是个轻量级的框架并且持久性API适合持久化POJO.iBatis也与Hibernate, JDO不同,因为它使用存储过程和现有的SQL来处理数据库.
本节我们将向你讲述如何配置iBatis来运行一个小型程序.既然一次性将所有知识全部解释很难,我们索性把本教程分为几个单独的例子来陈述.该例是关于如何从数据库读取数据并将结果显示在你的命令提示符上.在第二个例子中你将会到如何添加更多的数据到数据库中,在此之后的第三个例子将会向你展示如何通过iBatis从记录中删除数据.
现在的第一个例子将会向你展示如何从数据库中读取记录,我们需要一个数据库来执行查询,所以我们使用Oracle作为这个例子的数据库.
这里我们将要检索一些人的contact的信息, contact的表结构给出如下 :
-- Create table
create table contact(id NUMBER(4) not null,firstName VARCHAR2(10),lastName VARCHAR2(9),email VARCHAR2(9))tablespace USERSpctfree 10initrans 1maxtrans 255storage(initial 64Kminextents 1maxextents unlimited);
根据Contact表我们需要创建一个POJO类,在我们的例子中,数据库scott有一个表Contact,包括四个字段 :
Contact.java
package com.ztesoft.domain;
/**
* @author yangshangwei**/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 getFirstName() {
return firstName;
}public void setFirstName(String firstName) {this.firstName = firstName;
}public String getLastName() {
return lastName;
}public void setLastName(String lastName) {this.lastName = lastName;
}public String getEmail() {
return email;
}public void setEmail(String email) {this.email = email;
}public int getId() {return id;
}public void setId(int id) {this.id = id;
}}
搭建iBatis 开发环境:
1 、导入相关的jar 包,ibatis-2.3.0.677.jar 、ojdbc14-10.2.0.2.jar
2 、编写配置文件:
Jdbc 连接的属性文件SqlMap.properties
总配置文件, SqlMapConfig.xml
关于每个实体的映射文件(Map 文件)
sqlMap.properties
driver=oracle.jdbc.driver.OracleDriverurl=jdbc:oracle:thin:@localhost:1521:orclusername=scottpassword=tiger
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>
<properties resource="SqlMap.properties" /><settingscacheModelsEnabled="true"enhancementEnabled="true"lazyLoadingEnabled="true"errorTracingEnabled="true"maxRequests="32"maxSessions="10"maxTransactions="5"useStatementNamespaces="false"/>
<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}" /><property name="Pool.MaximumActiveConnections"value="10"/><property name="Pool.MaximumIdleConnections" value="5"/><property name="Pool.MaximumCheckoutTime"value="120000"/><property name="Pool.TimeToWait" value="500"/><property name="Pool.PingQuery" value="select 1 from contact"/><property name="Pool.PingEnabled" value="false"/><property name="Pool.PingConnectionsOlderThan" value="1"/><property name="Pool.PingConnectionsNotUsedFor"value="1"/>dataSource>
transactionManager>
<sqlMap resource="com/ztesoft/domain/Contact.xml" />sqlMapConfig>
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">
<typeAlias alias="Contact" type="com.ztesoft.domain.Contact" />
<select id="selectAllContact" resultClass="Contact">select * from contactselect>
<select id="selectContactById" parameterClass="int" resultClass="Contact">select firstName ,lastName ,email from contact where id=#id#select>
<select id="selectContactByName" parameterClass="String" resultClass="Contact">select id,email,lastName from contact where firstName like '%$name$%'select>
<insert id="insertContact" parameterClass="Contact" ><selectKey resultClass="int" keyProperty="id">SELECT contact_sequence.NEXTVAL AS id FROM DUAL
selectKey>
insert into contact(id,firstName,lastName,email) values(#id#,#firstName#,#lastName#,#email#)insert>
<update id="updateContact" parameterClass="Contact" >update Contact set firstName=#firstName#, lastName=#lastName#,email=#email# where id=#id#update >
<delete id="deleteContactById" parameterClass="int">
delete from contact where id=#id#delete>
sqlMap>
ContactDao.java
package com.ztesoft.dao;
import java.util.List;
import com.ztesoft.domain.Contact;
/**
* @author yangshangwei**/public interface ContactDao {/**
* 添加学生信息** @param contact* 学生实体* @return 返回是否添加成功*/public boolean addContact(Contact contact);/**
* 根据学生id删除学生信息** @param id* 学生id* @return 删除是否成功*/public boolean deleteContactById(int id);/**
* 更新学生信息** @param Contact* 学生实体* @return 更新是否成功*/public boolean updateContact(Contact contact);/**
* 查询全部学生信息** @return 返回学生列表*/public List selectAllContact();
/**
* 根据学生姓名模糊查询学生信息** @param name* 学生姓名* @return 学生信息列表*/public List selectContactByName(String name);
/**
* 根据学生id查询学生信息** @param id* 学生id* @return 学生对象*/public Contact selectContactById(int id);}
ContactDaoImpl.java
package com.ztesoft.daoImpl;
import java.io.IOException;
import java.io.Reader;
import java.sql.SQLException;
import java.util.List;
import org.apache.log4j.Logger;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import com.ztesoft.dao.ContactDao;
import com.ztesoft.domain.Contact;
public class ContactDaoImpl implements ContactDao {
private static Logger logger = Logger.getLogger(Contact.class);
private static SqlMapClient sqlMapClient = null;
// 读取配置文件
static {
try {
Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
public boolean addContact(Contact contact) {
// TODO Auto-generated method stub
boolean flag = false;
Object obj = null;
try {
obj = sqlMapClient.insert("insertContact",contact);
} catch (SQLException e) {
e.printStackTrace();
}
if (obj != null) {
flag = true;
}
return flag;
}
@Override
public boolean deleteContactById(int id) {
boolean flag = false;
Object obj = null;
try {
obj = sqlMapClient.delete("deleteContactById", id);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
if (obj != null) {
flag = true;
}
return flag;
}
@Override
public List
selectAllContact() {
// TODO Auto-generated method stub
List
contacts =
null;
try {
contacts = sqlMapClient.queryForList("selectAllContact");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return contacts;
}
@Override
public Contact selectContactById(int id) {
// TODO Auto-generated method stub
Contact contact = null;
try {
contact = (Contact) sqlMapClient.queryForObject(
"selectContactById", id);
} catch (SQLException e) {
logger.debug("selectContactById发生异常", e);
e.printStackTrace();
}
return contact;
}
@SuppressWarnings("unchecked")
@Override
public List
selectContactByName(String name) {
List
contacts =
null;
try {
contacts = sqlMapClient.queryForList("selectContactByName", name);
} catch (SQLException e) {
logger.debug("selectContactByName发生异常", e);
e.printStackTrace();
}
return contacts;
}
@Override
public boolean updateContact(Contact contact) {
boolean flag = false;
Object object = false;
try {
object = sqlMapClient.update("updateContact", contact);
System.out.println("更新学生信息的返回值:" + object + ",返回影响的行数");
} catch (SQLException e) {
logger.debug("update发生了异常", e);
e.printStackTrace();
}
if (object != null) {
flag = true;
}
return flag;
}
}
IbatisExample.java
package com.ztesoft.test;
import java.io.IOException;
import java.io.Reader;
import java.sql.SQLException;
import java.util.List;
import org.apache.log4j.Logger;
import com.ibatis.common.resources.Resources;
import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapClientBuilder;
import com.ztesoft.daoImpl.ContactDaoImpl;
import com.ztesoft.domain.Contact;
/**
* @author yangshangwei**/public class IbatisExample {private static Logger logger = Logger.getLogger(IbatisExample.class);public static void main(String[] args) throws IOException, SQLException {ContactDaoImpl contactDaoImpl = new ContactDaoImpl();
Reader reader = Resources.getResourceAsReader("SqlMapConfig.xml");
SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);// Output all contacts
List contacts = (List ) sqlMap.queryForList(" selectAllContact");
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(" ");
}logger.debug("selectAllContact:"+contactDaoImpl.selectAllContact());
logger.debug("selectContactById:"+contactDaoImpl.selectContactById(1));
logger.debug("selectContactByName:"+contactDaoImpl.selectContactByName("David"));contact.setFirstName("Jrare");
contact.setLastName("Leyd");
contact.setEmail("ZZZ");
logger.debug("updateContact:"+contactDaoImpl.updateContact(contact));
logger.debug("deleteContactById:"+contactDaoImpl.deleteContactById(1));
logger.debug("insertContact:"+contactDaoImpl.addContact(contact));
}}