iBatis的优缺点:
1. iBatis封装了JDBC API的调用细节,自动将结果集转换成Java Bean对象,简化了Java数据库编程的重复工作。
2. iBatis把SQL语句从Java源程序中分离出来,放在XML中编写。
3. iBatis实用,易于学习,易于使用。
4. iBatis需要自己编写SQL可以结合数据库自身的特点灵活控制SQL语句,能完成复杂查询。
5. iBatis实现方法只能带一个参数。
6. SQL需要手动写,容易出错。
iBatis的配置和实现:
1. 导入相关的jar包:
1)数据库驱动(如oracle的ojbc14.jar)
2)iBatis的jar包:ibatis-2.3.3.720.jar
2. iBatis主要包括三种配置文件:
1)总配置文件: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 cacheModelsEnabled="true" enhancementEnabled="true"
lazyLoadingEnabled="true" errorTracingEnabled="true" maxRequests="32"
maxSessions="10" maxTransactions="5" useStatementNamespaces="false" />
<!-- cacheModelsEnabled="true" 是否启用缓存机制 -->
<!-- lazyLoadingEnabled="true" 是否启用延迟加载机制 -->
<!-- enhancementEnabled="true" 是否启用字节码增强机制 -->
<!-- errorTracingEnabled="true" 是否启用错误处理机制 -->
<!-- maxRequests="32" 最大并发请求数 -->
<!-- maxSessions="10" 最大Session数 -->
<!-- maxTransactions="5" 最大并发事务数 -->
<!-- useStatementNamespaces="true" 是否启用名称空间 -->
<properties resource="SqlMap.properties" />
<transactionManager type="JDBC">
<dataSource type="SIMPLE">
<property name="${driver}" value="JDBC.Driver" />
<property name="${url}" value="JDBC.ConnectionURL" />
<property name="${username}" value="JDBC.Username" />
<property name="${password}" value="JDBC.Password" />
<property name="JDBC.DefaultAutoCommit" value="true" />
<!-- 数据库连接池可维持的最大容量。缺省值: 10 -->
<property name="Pool.MaximumActiveConnections" value="10" />
<!-- 数据库连接池中允许的挂起(idle)连接数。缺省值: 5 -->
<property name="Pool.MaximumIdleConnections" value="5" />
<!-- 数据库联接池中,连接被某个任务所允许占用的最大时间, 如果超过这个时间限定,连接将被强制收回(单位:毫秒)。 缺省值: 20000 -->
<property name="Pool.MaximumCheckoutTime" value="180000" />
<!-- 当线程试图从连接池中获取连接时,连接池中无可用连接可供使用, 此时线程将进入等待状态,直到池中出现空闲连接。 此参数设定了线程所允许等待的最长时间(单位:毫秒)缺省值:10 -->
<property name="Pool.TimeToWait" value="10000" />
<!-- 数据库连接状态检测语句。 某些数据库在连接在某段时间持续处于空闲状态时会将其断开。 而连接池管理器将通过此语句检测池中连接是否可用。它对性能的影响较大,应小心使用。检测语句应该是一个最简化的无逻辑SQL, 如:select 1 from dual缺省值: N/A -->
<property name="Pool.PingQuery" value="select 1 from dual" />
<!-- 是否允许检测连接状态。缺省值: false -->
<property name="Pool.PingEnabled" value="true" />
<!-- 对持续连接时间超过设定值(毫秒)的连接进行检测。缺省值: 0 不检查 -->
<property name="Pool.PingConnectionsOlderThan" value="0" />
<!-- 对空闲超过设定值(毫秒)的连接进行检测。缺省值: 0 不检查 -->
<property name="Pool.PingConnectionsNotUsedFor" value="3600000" />
<property name="Pool.QuietMode" value="true" />
</dataSource>
<!--<dataSource type="JNDI"> <property name="DataSource" value="WXPTDataSource"/>
</dataSource> -->
</transactionManager>
<!-- frame -->
<sqlMap resource="Student.xml" />
</sqlMapConfig>
2)属性文件:SqlMap.properties(如,存放数据源连接属性)
如:
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@192.168.0.1:1521:orcl
username=root
<?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>
<type alias="Student" type="com.Student" />
<select id="findAll" resultClass="Student">
select * from student
</select>
<select id="findById" parameterClass="int" resultClass="Student">
select * from student where sid=#sid#
</select>
<insert id="insert" parameterClass="Student">
insert into student(sid, sname) values (#sid#, #sname#)
</insert>
<delete id="deleteById" parameterClass="int">
delete from student where sid=#sid#
</delete>
<update id="updateById" parameterClass="Student">
update student set sname=#sname# where sid=#sid#
</update>
<select id="findLikeName" parameterClass="String" resultClass="Student">
select * from student where sname like '%$sname$%'
</select>
<insert id="insertBySequence" parameterClass="Student">
<selectKey resultClass="int" keyProperty="sid">
select studentPKSequence.nextVal from dual
</selectKey>
insert into student(sid, sname) values (#sid#, #sname#)
</insert>
</sqlMap>
3. iBatis持久化实现
1)创建SqlMapClient:
private static final SqlMapClient sqlMapClient;
static {
try {
Reader reader = Resources.getResourceAsReader ("SqlMapConfig.xml");
sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
2)查询全部:
List<Student> studentList = sqlMapClient.queryForList("findAll");
3)根据id查询:
Student student = (Student)sqlMapClient.queryForObject("findById", id);
4)插入数据:
sqlMapClient.insert("insert", student);
5)删除数据:
sqlMapClient.delete("deleteById", id); //返回删除的有效行数
6)修改数据:
sqlMapClient.update("updateById", student); //返回修改的有效行数
7)模糊查询:
List<Student> studentList = sqlMapClient.queryForList("findLikeName", sname);
1. iBatis封装了JDBC API的调用细节,自动将结果集转换成Java Bean对象,简化了Java数据库编程的重复工作。
2. iBatis把SQL语句从Java源程序中分离出来,放在XML中编写。
3. iBatis实用,易于学习,易于使用。
4. iBatis需要自己编写SQL可以结合数据库自身的特点灵活控制SQL语句,能完成复杂查询。
5. iBatis实现方法只能带一个参数。
6. SQL需要手动写,容易出错。
iBatis的配置和实现:
1. 导入相关的jar包:
1)数据库驱动(如oracle的ojbc14.jar)
2)iBatis的jar包:ibatis-2.3.3.720.jar
2. iBatis主要包括三种配置文件:
1)总配置文件: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 cacheModelsEnabled="true" enhancementEnabled="true"
lazyLoadingEnabled="true" errorTracingEnabled="true" maxRequests="32"
maxSessions="10" maxTransactions="5" useStatementNamespaces="false" />
<!-- cacheModelsEnabled="true" 是否启用缓存机制 -->
<!-- lazyLoadingEnabled="true" 是否启用延迟加载机制 -->
<!-- enhancementEnabled="true" 是否启用字节码增强机制 -->
<!-- errorTracingEnabled="true" 是否启用错误处理机制 -->
<!-- maxRequests="32" 最大并发请求数 -->
<!-- maxSessions="10" 最大Session数 -->
<!-- maxTransactions="5" 最大并发事务数 -->
<!-- useStatementNamespaces="true" 是否启用名称空间 -->
<properties resource="SqlMap.properties" />
<transactionManager type="JDBC">
<dataSource type="SIMPLE">
<property name="${driver}" value="JDBC.Driver" />
<property name="${url}" value="JDBC.ConnectionURL" />
<property name="${username}" value="JDBC.Username" />
<property name="${password}" value="JDBC.Password" />
<property name="JDBC.DefaultAutoCommit" value="true" />
<!-- 数据库连接池可维持的最大容量。缺省值: 10 -->
<property name="Pool.MaximumActiveConnections" value="10" />
<!-- 数据库连接池中允许的挂起(idle)连接数。缺省值: 5 -->
<property name="Pool.MaximumIdleConnections" value="5" />
<!-- 数据库联接池中,连接被某个任务所允许占用的最大时间, 如果超过这个时间限定,连接将被强制收回(单位:毫秒)。 缺省值: 20000 -->
<property name="Pool.MaximumCheckoutTime" value="180000" />
<!-- 当线程试图从连接池中获取连接时,连接池中无可用连接可供使用, 此时线程将进入等待状态,直到池中出现空闲连接。 此参数设定了线程所允许等待的最长时间(单位:毫秒)缺省值:10 -->
<property name="Pool.TimeToWait" value="10000" />
<!-- 数据库连接状态检测语句。 某些数据库在连接在某段时间持续处于空闲状态时会将其断开。 而连接池管理器将通过此语句检测池中连接是否可用。它对性能的影响较大,应小心使用。检测语句应该是一个最简化的无逻辑SQL, 如:select 1 from dual缺省值: N/A -->
<property name="Pool.PingQuery" value="select 1 from dual" />
<!-- 是否允许检测连接状态。缺省值: false -->
<property name="Pool.PingEnabled" value="true" />
<!-- 对持续连接时间超过设定值(毫秒)的连接进行检测。缺省值: 0 不检查 -->
<property name="Pool.PingConnectionsOlderThan" value="0" />
<!-- 对空闲超过设定值(毫秒)的连接进行检测。缺省值: 0 不检查 -->
<property name="Pool.PingConnectionsNotUsedFor" value="3600000" />
<property name="Pool.QuietMode" value="true" />
</dataSource>
<!--<dataSource type="JNDI"> <property name="DataSource" value="WXPTDataSource"/>
</dataSource> -->
</transactionManager>
<!-- frame -->
<sqlMap resource="Student.xml" />
</sqlMapConfig>
2)属性文件:SqlMap.properties(如,存放数据源连接属性)
如:
driver=oracle.jdbc.driver.OracleDriver
url=jdbc:oracle:thin:@192.168.0.1:1521:orcl
username=root
password=root
3)映射文件(与数据库表相关):Student.xml。
注意映射文件对应的entity需要无参构造方法。<?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>
<type alias="Student" type="com.Student" />
<select id="findAll" resultClass="Student">
select * from student
</select>
<select id="findById" parameterClass="int" resultClass="Student">
select * from student where sid=#sid#
</select>
<insert id="insert" parameterClass="Student">
insert into student(sid, sname) values (#sid#, #sname#)
</insert>
<delete id="deleteById" parameterClass="int">
delete from student where sid=#sid#
</delete>
<update id="updateById" parameterClass="Student">
update student set sname=#sname# where sid=#sid#
</update>
<select id="findLikeName" parameterClass="String" resultClass="Student">
select * from student where sname like '%$sname$%'
</select>
<insert id="insertBySequence" parameterClass="Student">
<selectKey resultClass="int" keyProperty="sid">
select studentPKSequence.nextVal from dual
</selectKey>
insert into student(sid, sname) values (#sid#, #sname#)
</insert>
</sqlMap>
3. iBatis持久化实现
1)创建SqlMapClient:
private static final SqlMapClient sqlMapClient;
static {
try {
Reader reader = Resources.getResourceAsReader ("SqlMapConfig.xml");
sqlMapClient = SqlMapClientBuilder.buildSqlMapClient(reader);
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
}
2)查询全部:
List<Student> studentList = sqlMapClient.queryForList("findAll");
3)根据id查询:
Student student = (Student)sqlMapClient.queryForObject("findById", id);
4)插入数据:
sqlMapClient.insert("insert", student);
5)删除数据:
sqlMapClient.delete("deleteById", id); //返回删除的有效行数
6)修改数据:
sqlMapClient.update("updateById", student); //返回修改的有效行数
7)模糊查询:
List<Student> studentList = sqlMapClient.queryForList("findLikeName", sname);
8)主键生成:
sqlMapClient.insert("insertBySequence", student);