ibatis实战之基础环境搭建
来源:互联网 发布:炫酷个人网站源码 编辑:程序博客网 时间:2024/05/05 10:32
关于ibatis的介绍、优缺点,以及ibatis和hibernate的比较再此不在赘述,可参阅其他资料。
一、准备工作
1、下载ibatis软件包http://download.csdn.net/detail/itmyhome/7473661
所需jar包为:ibatis-xxx.jar,mysql-connector-java-xxx-bin.jar
2、创建测试数据库,并新建user表,其中包含三个字段:
id(int)
name(varchar)
age(int)
ps:以mysql数据库为例
- create tableuser(
- id int,
- name varchar(50),
- age int
- );
二、构建ibatis基础代码
ibatis基础代码包括:
1、ibatis实例配置
一个典型的配置文件如下
- <?xmlversion="1.0"encoding="UTF-8"?>
- <!DOCTYPE sqlMapConfig
- PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
- "http://www.ibatis.com/dtd/sql-map-config-2.dtd">
- <sqlMapConfig>
- <settings
- cacheModelsEnabled="true"
- enhancementEnabled="true"
- lazyLoadingEnabled="true"
- errorTracingEnabled="true"
- maxRequests="32"
- maxSessions="10"
- maxTransactions="5"
- useStatementNamespaces="false"/>
- <transactionManagertype="JDBC">
- <dataSourcetype="SIMPLE">
- <propertyname="JDBC.Driver"value="com.mysql.jdbc.Driver"/>
- <propertyname="JDBC.ConnectionURL"value="jdbc:mysql://localhost:3306/ibatis"/>
- <propertyname="JDBC.Username"value="root"/>
- <propertyname="JDBC.Password"value="root"/>
- <propertyname="Pool.MaximumActiveConnections"value="10"/>
- <propertyname="Pool.MaximumIdleConnections"value="5"/>
- <propertyname="Pool.MaximumCheckoutTime"value="120000"/>
- <propertyname="Pool.TimeToWait"value="500"/>
- <propertyname="Pool.PingQuery"value="select 1 from ACCOUNT"/>
- <propertyname="Pool.PingEnabled"value="false"/>
- <propertyname="Pool.PingConnectionsOlderThan"value="1"/>
- <propertyname="Pool.PingConnectionsNotUsedFor"value="1"/>
- </dataSource>
- </transactionManager>
- <sqlMapresource="com/itmyhome/User.xml"/>
- </sqlMapConfig>
ibatis配置文件各节点简单说明:
(1)Settings节点
参数描述cacheModelsEnabled是否启用 SqlMapClient 上的缓存机制。建议设为"true"enhancementEnabled是否针对POJO启用字节码增强机制以提升
getter/setter 的调用效能,避免使用Java
Reflect 所带来的性能开销。
同时,这也为Lazy Loading带来了极大的性能
提升。建议设为"true"errorTracingEnabled是否启用错误日志,在开发期间建议设为"true"
以方便调试lazyLoadingEnabled是否启用延迟加载机制,建议设为"true"maxRequests最大并发请求数(Statement并发数)maxTransactions最大并发事务数maxSessions最大Session数.即当前最大允许的并发SqlMapClient数
maxSessions设定必须介于
maxTransactions和maxRequests之间,即
maxTransactions<maxSessions=< maxRequestsuseStatementNamespaces是否使用Statement命名空间。
这里的命名空间指的是映射文件中,sqlMap节点
的namespace属性,如在上例中针对user
表的映射文件sqlMap节点:
<sqlMap namespace="User">
这里,指定了此sqlMap节点下定义的操作均从
属于"User"命名空间。
在useStatementNamespaces="true"的情况下,
Statement调用需追加命名空间,如:
sqlMap.update("User.updateUser",user);
否则直接通过Statement名称调用即可,如:
sqlMap.update("updateUser",user);
但请注意此时需要保证所有映射文件中,
Statement定义无重名
(2)transactionManager节点
transactionManager节点定义了ibatis的事务管理器,目前提供了以下几种选择:
1) JDBC
通过传统 JDBC Connection.commit/rollback实现事务支持。
2) JTA
使用容器提供的JTA服务实现全局事务管理。
3) EXTERNAL
外部事务管理,如在EJB中使用ibatis,通过EJB的部署配置即可实现自动的事务管理机制。
此时ibatis将把所有事务委托给外部容器进行管理。此外,通过Spring等轻量级容器实现事务的配置化管理也是一个不错的选
择。关于结合容器实现事务管理,参见“高级特性”中的描述。
(3)dataSource节点
dataSource从属于transactionManager节点,用于设定ibatis运行期使用的DataSource属性。
type属性:dataSource节点的type属性指定了dataSource的实现类型。
可选项目:
1) SIMPLE:
SIMPLE是ibatis内置的dataSource实现,其中实现了一个简单的数据库连接池机制,对应ibatis实现类为
com.ibatis.sqlmap.engine.datasource.SimpleDataSourceFactory。
3) DBCP:
基于Apache DBCP连接池组件实现的DataSource封装,当无容器提
供DataSource服务时,建议使用该选项,对应ibatis实现类为com.ibatis.sqlmap.engine.datasource.DbcpDataSourceFactory。
3) JNDI:
使用J2EE容器提供的DataSource实现,DataSource将通过指定
的JNDI Name从容器中获取.对应ibatis实现类为com.ibatis.sqlmap.engine.datasource.JndiDataSourceFactory。
dataSource的子节点说明(SIMPLE&DBCP):
JDBC.DriverJDBC驱动.如:com.mysql.jdbc.DriverJDBC.ConnectionURL数据库URL。如:jdbc:mysql://localhost:3306/ibatis如果用的是SQLServer JDBC Driver,需要
在url后追加SelectMethod=Cursor以获得
JDBC事务的多Statement支持。JDBC.Username数据库用户名JDBC.Password数据库用户密码Pool.MaximumActiveConnections数据库连接池可维持的最大容量。Pool.MaximumIdleConnections数据库连接池中允许的挂起(idle)连接数。
(4)sqlMap节点
sqlMap节点指定了映射文件的位置,配置中可出现多个sqlMap节点,以指定
项目内所包含的所有映射文件。
2、POJO
下面是我们用作示例的一个POJO
- public class Userimplements Serializable {
- private staticfinallong serialVersionUID = 1L;
- private int id;
- private String name;
- private int age;
- 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;
- }
- public int getAge() {
- return age;
- }
- public void setAge(int age) {
- this.age = age;
- }
- }
3、映射文件
与Hibernate不同,因为需要人工编写sql代码 ibatis的映射文件一般采用手动编写
- <?xmlversion="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">
- <sqlMapnamespace="User">
- <typeAliasalias="user"type="com.itmyhome.User"/>
- <!-- 查询 -->
- <selectid="getUser"parameterClass="java.lang.Integer"resultClass="user">
- <![CDATA[
- select name,age from user where id = #id#
- ]]>
- </select>
- <!-- 插入 -->
- <insertid="insertUser"parameterClass="user">
- insert into user values(#id#,#name#,#age#)
- </insert>
- <!-- 更新 -->
- <updateid="updateUser"
- parameterClass="user">
- <![CDATA[
- update user
- SET name=#name#, age=#age#
- WHERE id = #id#
- ]]>
- </update>
- <!-- 删除 -->
- <deleteid="deleteUser"parameterClass="java.lang.Integer">
- delete from user where id = #id#
- </delete>
- </sqlMap>
<select>四个节点,我们分别定义了针对User对象的增删改查操作。在这
四个节点中,我们指定了对应的SQL语句,以update节点为例:
- <updateid="updateUser" (1 )
- parameterClass="user"> (2 )
- <![CDATA[ (3 )
4. update user (4 )
5. SET name=#name#, age=#age# (5)
6. WHERE id = #id#
7. ]]>
8.</update>
⑴ID指定了操作ID,之后我们可以在代码中通过指定操作id来执行此节点所定义的操作,如:
sqlMap.update("updateUser",user);
ID设定使得在一个配置文件中定义两个同名节点成为可能(两个update节点,以不同id区分)
⑵ parameterClass
指定了操作所需的参数类型,此例中update操作以
com.itmyhome.User 类型的对象作为参数,目标是将提供的User实例更新到数据库。
parameterClass="user"中,user为"com.itmyhome.User"类的别名,别名可通过typeAlias节点指定,
如示例配置文件中的:<typeAlias alias="user" type="com.itmyhome.User"/>
⑶ <![CDATA[… ]]>
通过<![CDATA[… ]]>节点,可以避免SQL中与XML规范相冲突的字符对XML映射文件的合法性造成影响。
⑷执行更新操的SQL,这里的SQL即实际数据库支持的SQL语句,将由ibatis填入参数后交给数据库执行。
⑸ SQL中所需的用户名参数,"#name#"在运行期会由传入的user对象的name属性填充。(其他参数同)
对于这个示例,ibatis在运行期会读取id为"updateUser"的update节点
的SQL定义,并调用指定的user对象的对应getter方法获取属性值,并用此
属性值,对SQL中的参数进行填充后提交数据库执行。
好了,我们完成了所有的配置文件和映射文件,就剩下应用的编码工作了。
首先要设置SQL Map,读入刚创建好的SQL Map XML配置文件。为简化这个工作,可以使用
SQL Map架构中提供的Resources类。
- Stringresource ="SqlMapConfig.xml";
- Readerreader=Resources.getResourceAsReader(resource);
- SqlMapClient sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
以上的SqlMapClient对象是线程安全,并且应持久生存。对于一个特定的应用,只需
进行一次SqlMap配置。因此,它可以作为基类的一个静态对象(即DAO对象的基类),或
者,如果您想让它有更大的作用范围,可以把它封装在方便使用的类中。例如:
- public class MyAppSqlConfig {
- private staticfinal SqlMapClient sqlMap;
- static {
- try {
- String resource = "SqlMapConfig.xml";
- Reader reader = Resources.getResourceAsReader(resource);
- sqlMap = SqlMapClientBuilder.buildSqlMapClient(reader);
- } catch (Exception e) {
- e.printStackTrace();
- throw new RuntimeException("Error initializing MyAppSqlConfig class. Cause: " + e);
- }
- }
- public static SqlMapClient getSqlMapInstance() {
- return sqlMap;
- }
- }
从数据库读取对象
既然SqlMap对象已完成初始化,那么就可以方便地使用它了。首先我们用它
从数据库中读取一个User对象(本例中 先假设User表中一村庄N条记录,id从i到N)
要从数据库中得到一个User对象,只需要SqlMap实例,让我们读入id为1的User对象
- SqlMapClient sqlMap = MyAppSqlConfig.getSqlMapInstance();
- User user = (User)sqlMap.queryForObject ("getUser",1);
把对象写入数据库
- User u = new User();
- u.setId(2);
- u.setName("wangwu");
- u.setAge(23);
- sqlMap.insert("insertUser",u);
更新对象
- User u = new User();
- u.setId(3);
- u.setName("itmyhome");
- u.setAge(25);
- sqlMap.update("updateUser",u)
删除对象
- sqlMap.delete("deleteUser",1)
项目工程图如下:
- ibatis实战之基础环境搭建
- ibatis实战之基础环境搭建
- ibatis实战之基础环境搭建
- iBatis教程之搭建环境
- MyBatis实战——前身iBatis、基础环境搭建和如何"钓鱼"
- Storm实战之环境搭建
- ibatis 搭建环境
- ibatis开发环境搭建
- ibatis框架环境搭建
- ibatis环境搭建
- ibatis环境搭建
- ibatis基本环境搭建
- Python基础之环境搭建
- java基础之环境搭建
- 外设实战之搭建开发环境
- maven+springmvc+ibatis环境搭建
- ibatis实战之OR映射
- ibatis实战之OR映射
- java获取中文拼音,java获取中文拼音首字母
- Linux Ubuntu中Vim简便配置
- SizeClass 和AutoLayout教程3
- 以分钟为单位进行数据的抽取并作平均
- shttpd string 操作重写
- ibatis实战之基础环境搭建
- 天下游伪装微信地理位置
- 技术为什么越走越窄?做技术到底可以做到哪种地步
- Python 子类调用父类方法
- 网站渗透思路全方面总结
- 泛微走进上海飞科电器股份有限公司
- ABAP中特殊字符的使用
- python 模拟登录i
- js字符串转成数字的三种方法