zoukankan      html  css  js  c++  java
  • ibatis实战之基础环境搭建

    关于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 table user(
        id int,
        name varchar(50),
        age int
    );

    二、构建ibatis基础代码

    ibatis基础代码包括:

    1、ibatis实例配置

       一个典型的配置文件例如以下

    <?xml version="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" /> <transactionManager type="JDBC"> <dataSource type="SIMPLE"> <property name="JDBC.Driver" value="com.mysql.jdbc.Driver" /> <property name="JDBC.ConnectionURL" value="jdbc:mysql://localhost:3306/ibatis" /> <property name="JDBC.Username" value="root" /> <property name="JDBC.Password" value="root" /> <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 ACCOUNT" /> <property name="Pool.PingEnabled" value="false" /> <property name="Pool.PingConnectionsOlderThan" value="1" /> <property name="Pool.PingConnectionsNotUsedFor" value="1" /> </dataSource> </transactionManager> <sqlMap resource="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=< maxRequests
    useStatementNamespaces是否使用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.Driver
    JDBC.ConnectionURL数据库URL。如:jdbc:mysql://localhost:3306/ibatis
    假设用的是SQLServer JDBC Driver,须要
    在url后追加SelectMethod=Cursor以获得
    JDBC事务的多Statement支持。
    JDBC.Username数据库username
    JDBC.Password数据库用户password
    Pool.MaximumActiveConnections数据库连接池可维持的最大容量。
    Pool.MaximumIdleConnections数据库连接池中同意的挂起(idle)连接数。

    (4)sqlMap节点

    sqlMap节点指定了映射文件的位置,配置中可出现多个sqlMap节点,以指定

    项目内所包括的全部映射文件。

    2、POJO

    以下是我们用作演示样例的一个POJO

    public class User implements Serializable {
    
    	private static final long 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的映射文件一般採用手动编写

    <?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="user" type="com.itmyhome.User" /> <!-- 查询 --> <select id="getUser" parameterClass="java.lang.Integer" resultClass="user"> <![CDATA[ select name,age from user where id = #id# ]]> </select> <!-- 插入 --> <insert id="insertUser" parameterClass="user"> insert into user values(#id#,#name#,#age#) </insert> <!-- 更新 --> <update id="updateUser" parameterClass="user"> <![CDATA[ update user SET name=#name#, age=#age# WHERE id = #id# ]]> </update> <!-- 删除 --> <delete id="deleteUser" parameterClass="java.lang.Integer"> delete from user where id = #id# </delete> </sqlMap>

    从上面的映射文件能够看出,通过<insert>、<delete>、<update>、

    <select>四个节点,我们分别定义了针对User对象的增删改查操作。

    在这

    四个节点中,我们指定了相应的SQL语句,以update节点为例:

    <update id="updateUser"                        (1
    	parameterClass="user">                     (2
    	<![CDATA[                                  (3  
    		update user                            (4  
    		SET name=#name#, age=#age#             (5
    		WHERE id = #id# 
    	]]>
    </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中所需的username參数,"#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 static final 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)


    项目project图例如以下:



    项目源代码下载:http://download.csdn.net/detail/itmyhome/7473721


    作者:itmyhome

    转载请注明出处:http://blog.csdn.net/itmyhome1990/article/details/28267901


  • 相关阅读:
    通过json动态创建控制器
    记一次bug解决!改变思路解决问题的同时,还需要弄明白是什么原因。
    __proto__,prototype,constructor
    事件:compositionstart & compositionend,解决oninput获取到拼音的问题。
    事件绑定----阻止冒泡失效
    预装的win10系统如何恢复
    rem.js
    vscode 使用 github仓库
    nginx使用
    伸缩盒
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/6758367.html
Copyright © 2011-2022 走看看