ibatis简单开发程序
1、首先在数据库test内创建一个表,表名:t_user,有3个字段,id(这个是主键设置为自动增量),user,date,并向表中插入2行数据
如果是mysql,执行
drop table if exists 't_user';
CREATE TABLE 't_user' (
'id' int(12) NOT NULL auto_increment, 'name' varchar(50) default NULL, 'date' date default NULL,
PRIMARY KEY ('id') ) ENGINE=InnoDB DEFAULT CHARSET=GBK;
Insertinto 't_user'(name,date) values('ok','2007-03-15'),('ok2','2007-05-15');
如果是sql,执行脚本
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[t_user]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[t_user]
GO
CREATE TABLE [dbo].[t_user] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[name] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[date] [datetime] NULL
) ON [PRIMARY]
GO
2、创建完数据表后,就创建一个SqlMapConfig.xml配置文件(这个名字不能改,因为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>
<!-- cacheModelsEnabled:是否启动SqlMapClient的缓存机制enhancementEnabled:是否针对POJO启用字节码增加机制以提升getER/setER的调用效用,为延迟加载带来了及大的性能提升lazyLoadingEnabled:是否启用延迟加载机制。
maxRequests:最大并大请求数。
maxSessions:最大Session数,即当前最大允许的开发SqlMapClient数
maxTransactions:最大并发事务数-->
<settings cacheModelsEnabled="true"
enhancementEnabled="true"
lazyLoadingEnabled="true"
maxRequests="32"
maxSessions="10"
maxTransactions="5"
useStatementNamespaces="true" />
<transactionManager type="JDBC">
<dataSource type="SIMPLE">
<!--JDBC驱动-->
<property name="JDBC.Driver" value="sun.jdbc.odbc.JdbcOdbcDriver" />
<property name="JDBC.ConnectionURL" value="jdbc:odbc:ok" />
<property name="JDBC.Username" value="数据库用户" />
<property name="JDBC.Password" value="数据库密码" />
</dataSource>
</transactionManager>
<!--加载SqlMap文件-->
<sqlMap resource="com/study/xiaofeng/maps/User.xml" />
</sqlMapConfig>
备注:我使用的是JDBC驱动的odbc的数据源连接,连接的是SQLServer,个人的理解就是sql server提供ODBC接口,jdbc调用ODBC提供的jdbc接口调用,sql server->sqlserver odbc接口->odbc jdbc接口->jdbc,使用JDBC连接数据库步骤为
(1)、装载并注册数据库的jdbc驱动程序
class.forname("JDBC驱动")
下面列出几种数据库的JDBC驱动,其他的请大家在网上找下
(1)SQL :
class.forname("com.microsoft.jdbc.sqlserverdriver")
(2)mysql
class.forname("com.mysql.jdbc.driver")
(3)数据源连接方式
class.forname("sun.jdbc.odbc.jdbcOdbcDriver")
(2)、建立数据库的连接
connection cnn=java.sql.driverManager.getConnection(JDBC数据源,数据库用户名,数据库密码)
下面列出几种数据库的JDBC数据源
格式:jdbc:驱动程序:驱动子项
(1)SQL(microsoft:sqlserver这里算是一个整体)
jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=数据库
(2)Mysql
jdbc:mysql://localhost:3306/数据库名
(3)数据源连接方式
jdbc:odbc:数据源名
ibatis里代码看不到驱动初始化的forname这些方法,原因是SqlMapClient这个对象创建时,根据传递过来的数据库参数自动进行数据库驱动的装载以及连接
3、再创建一个数据表t_user的映射类User.java(不是一定要取名:表名.java,只是为了方便记而已,文件user.xml里<typeAlias alias="UserObject" type="com.study.xiaofeng.User" />,只要保持映射类名跟这里的type一致就行 )
package com.study.xiaofeng;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable{
private int id;
private String name;
private Date date;
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
4、创建一个包括所有需要进行SQL执行的xml文件,User.xml(这里的文件名也不是一定要取名:表名.xml,例如user2.xml也可以,只要文件名跟SqlMapConfig.xml中<sqlMap resource="com/study/xiaofeng/maps/User2xml" /> 这里的名字一致就行
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE sqlMap PUBLIC "-//iBATIS.com//DTD SQL Map 2.0//EN"
"http://www.ibatis.com/dtd/sql-map-2.dtd">
<sqlMap namespace="User">
<typeAlias alias="UserObject" type="com.study.xiaofeng.User" />
<resultMap id="userResult" class="UserObject">
<result property="id" column="id" jdbcType="NUMBER" />
<result property="name" column="name" jdbcType="VARCHAR2" />
<result property="date" column="date" jdbcType="DATE" />
</resultMap>
<select id="getByPK" resultMap="userResult" parameterClass="UserObject">
<![CDATA[
select
id,
name,
date
from t_user
where id = #id#
]]>
</select>
<select id="getById" resultMap="userResult" parameterClass="java.lang.String">
<![CDATA[
select
id,
name,
date
from t_user
where id = $String$
]]>
</select>
<sql id="Dy_SC">
<dynamic prepend="WHERE">
<isNotNull prepend="AND" property="id">id like #id#</isNotNull>
<isNotNull prepend="AND" property="name">name like #name#</isNotNull>
</dynamic>
</sql>
<select id="getUser" resultMap="userResult">
<![CDATA[
select
id,
name,
date
from t_user
]]>
<include refid="Dy_SC" />
</select>
<insert id="insertUser" parameterClass="UserObject">
INSERT INTO t_user (name,date) VALUES (#name#,#date#)
</insert>
<insert id="insertUserTest" parameterClass="UserObject">
INSERT INTO t_user (id,name,date) VALUES (#id#,#name#,#date#)
</insert>
<update id="updateUser" parameterClass="UserObject">
<![CDATA[
UPDATE t_user
SET
name=#name#,
date=#date#
WHERE id = #id#
]]>
</update>
<delete id="deleteUser" parameterClass="java.lang.String">
delete from t_user where id=#value#
</delete>
<statement id="getMaxId" resultClass="java.lang.Integer">
select Max(id) from t_user
</statement>
<statement id="getMax" resultClass="java.util.HashMap">
select Max(id) as id,Max(name) as name,Max(date) as date from t_user
</statement>
</sqlMap>
5、到现在再理清下思路,我们创建了数据表t_user,数据表的映射类User.class,数据表操作类user.xml,配置文件SqlMapConfig.xml
ibatis架构就完成了
整个工程只需要引入ibatis-2.3.0.667.jar一个库,当使用ibatis,首先读取SqlMapConfig.xml文件,根据这个配置文件创建一个SqlMapClient对象,引用的是com.ibatis.sqlmap.client.SqlMapClient,这个对象读取SqlMapConfig.xml配置,装载以及连接数据库,连接成功后,并指向user.xml,将user.xml内的设置读取到SqlMapClient对象内
当使用SqlMapClient进行操作时,这个对象也有数据库的insert以及update等操作,比如SqlMapClient.queryForList(调用的操作,传递的对象)sqlMap.queryForList("User.getUser", params)其中后面的params是将数据封装成对象,User.getUser的User是命名空间名,然后找getUser,找到后执行里面的select语句,返回记录集userResult,
<select id="getUser" resultMap="userResult">
<![CDATA[
select
id,
name,
date
from t_user
]]>
<include refid="Dy_SC" />
</select>
然后知道这个记录集名userResult,对应的是com.study.xiaofeng.User,这个记录集的列对应User.java类的属性
<sqlMap namespace="User">
<typeAlias alias="UserObject" type="com.study.xiaofeng.User" />
<resultMap id="userResult" class="UserObject">
<result property="id" column="id" jdbcType="NUMBER" />
<result property="name" column="name" jdbcType="VARCHAR2" />
<result property="date" column="date" jdbcType="DATE" />
</resultMap>
那么就相当于将select返回的结果数据集保存在User类中,那么只需要对User类进行处理,可以封装成任何自己需要的数据类型,SqlMapClient.Select是封装成一个list并返回它,调用者只需要对list进行读取就可以!