通常称为数据映射器(data mapper),ibatis把SQL语句的参数与结果映射为类。
ibatis在类和数据库表之间建立一个额外的间接层。(SQL)
1. 映射SQL语句
<select id="getAddress"
parameterClass="int"
resultClass="Address">
SELECT
ADR_ID as id,
ADR_DESCRIPTION as description,
ADR_STREET as street,
ADR_CITY as city,
ADR_PROVINCE as province,
ADR_POSTAL_CODE as postalCode
FROM ADDRESS
WHERE ADR_ID = #id#
</select>
执行时需要下列语句:
Address address = (Address) sqlMap.queryForObject("getAddress",new Integer(5));
2. ibatis如何工作
使用JDBC
public Employee getEmployee(int id) throws SQLException {
Employee employee = null;
String sql = "SELECT * FROM EMPLOYEE " + "WHERE EMPLOYEE_NUMBER = ?";
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = dataSource.getConnection();
ps = conn.prepareStatement(sql);
ps.setInt(1, id);
rs = ps.executeQuery();
employee = null;
while (rs.next()) {
employee = new Employee();
employee.setId(rs.getInt("ID"));
employee.setEmployeeNumber(rs.getInt("EMPLOYEE_NUMBER"));
employee.setFirstName(rs.getString("FIRST_NAME"));
employee.setLastName(rs.getString("LAST_NAME"));
employee.setTitle(rs.getString("TITLE"));
}
} finally {
try {
if (rs != null)
rs.close();
} finally {
try {
if (ps != null)
ps.close();
} finally {
if (conn != null)
conn.close();
}
}
}
return employee;
}
使用ibatis运行相同的SQL语句时:
<select id="getEmployee"
parameterClass="java.lang.Integer"
resultClass="Employee">
SELECT ID as id,
EMPLOYEE_NUMBER as employeeNumber,
FIRST_NAME as firstName,
LAST_NAME as lastName,
TITLE as title
FROM EMPLOYEE
WHERE EMPLOYEE_NUMBER = #empNum#
</select>
2.1 ibatis与小型、简单系统
ibatis非常适合于小型应用程序:
- ibatis本身就很小并简单。
- ibatis不会对应用程序或者数据库的现有设计强加任何影响
- ibatis同样非常适合于大型系统,甚至可以扩展以满足企业级应用程序的需要
2.2 ibatis与大型、企业级系统
- ibatis没有对数据库模型或对象模型的设计做任何假设。
- ibatis的某些特征使得它能够非常高效的处理大型数据集。
- ibatis允许使用多种方式建立对象到数据库的映射关系
3.为何使用ibatis
3.1 简单性
3.2 生产效率
3.3 性能
3.4 关注点分离
3.5 明确分工
3.6 可移植性:java、.NET及其他
3.7 开源和诚实
4. 何时不该使用ibatis
4.1 当永远拥有完全控制权时
可使用O/RM,提高生产效率
4.2 当应用程序需要完全动态地SQL时
最好使用原始的JDBC
4.3 当没有使用关系数据库时
jdbc,或I/O API
4.4 当ibatis不起作用时
5 用ibatis创建应用程序
输出目标:
java -classpath <…> Main
Selected 2 records.
{USERNAME=LMEADORS, PASSSWORD=PICKLE, USERID=1, GROUPNAME=EMPLOYEE}
{USERNAME=JDOE, PASSSWORD=TEST, USERID=2, GROUPNAME=EMPLOYEE}
5.1 数据库(mysql)
#
# Table structure for table 'user'
#
CREATE TABLE USER_ACCOUNT (
USERID INT(3) NOT NULL AUTO_INCREMENT,
USERNAME VARCHAR(10) NOT NULL,
PASSSWORD VARCHAR(30) NOT NULL,
GROUPNAME VARCHAR(10),
PRIMARY KEY (USERID)
);
#
# Data for table 'user'
#
INSERT INTO USER_ACCOUNT (USERNAME, PASSSWORD, GROUPNAME)
<span style="white-space:pre"> </span>VALUES ('LMEADORS', 'PICKLE', 'EMPLOYEE');
INSERT INTO USER_ACCOUNT (USERNAME, PASSSWORD, GROUPNAME)
<span style="white-space:pre"> </span>VALUES ('JDOE', 'TEST', 'EMPLOYEE');
COMMIT;
5.2 编写代码
import com.ibatis.sqlmap.client.*;
import com.ibatis.common.resources.Resources;
import java.io.Reader;
import java.util.List;
public class Main {
public static void main(String arg[]) throws Exception {
String resource = "SqlMapConfig.xml";
Reader reader = Resources.getResourceAsReader(resource);
SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
List list = sqlMap.queryForList("getAllUsers", "EMPLOYEE");
System.out.println("Selected " + list.size() + " records.");
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}
5.3 配置ibatis
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>
<transactionManager type="JDBC">
<dataSource type="SIMPLE">
<property name="JDBC.Driver" value="com.mysql.jdbc.Driver" />
<property name="JDBC.ConnectionURL" value="jdbc:mysql://localhost/test" />
<property name="JDBC.Username" value="root" />
<property name="JDBC.Password" value="blah" />
</dataSource>
</transactionManager>
<sqlMap resource="SqlMap.xml" />
</sqlMapConfig>
映射文件:
<?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>
<select id="getAllUsers" parameterClass="string" resultClass="hashmap">
SELECT * FROM USER_ACCOUNT WHERE GROUPNAME = #groupName#
</select>
</sqlMap>
5.4 构建应用程序
javac -classpath <your-path>ibatis-common-2.jar;
<your-path>ibatis-sqlmap-2.jar Main.java
<your-path>ibatis-sqlmap-2.jar Main.java
5.5 运行应用程序
java -classpath <your-path>;mysql-connector.jar;commons-logging.jar;
ibatis-common-2.jar;ibatis-sqlmap-2.jar;.
Main
ibatis-common-2.jar;ibatis-sqlmap-2.jar;.
Main
<select id="getAddress"
parameterClass="int"
resultClass="Address">
SELECT
ADR_ID as id,
ADR_DESCRIPTION as description,
ADR_STREET as street,
ADR_CITY as city,
ADR_PROVINCE as province,
ADR_POSTAL_CODE as postalCode
FROM ADDRESS
WHERE ADR_ID = #id#
</select>