`

ibatis(2)关于配置文件的书写

 
阅读更多

最近做了些ibatis 的练习,以及spring对ibatis的整合。

对ibatis的配置文件的书写做以下总结:


 

(1)insert 返回的为插入的主键值,但必须在配置文件中加入<selectKey/>

   如果主键值为String

 

<selectKey resultClass="string" keyProperty="id">
   SELECT @@IDENTITY AS ID
</selectKey>
 

 


   如果主键值为Int型

<selectKey resultClass="java.lang.Integer" keyProperty="id" >
   SELECT @@IDENTITY AS ID
</selectKey>

  

或者

 

<selectKey resultClass="int" keyProperty="id">
   SELECT @@IDENTITY AS ID
</selectKey>
 

 

注:@@IDENTITY只是SQL Server的写法,其他数据库也有相关的属性。


(2).Update,和Delete返回为修改数据影响的条数;

.SQL模糊查询的两种方法

(1).如果是模糊查询,在关键字传入前加‘%’; 例:String keyword=”%”+keyword+”%”;

 

(2).配置文件的写法: select name,sex from t_user where name like '%$name$%' 

 

.在ibatis的bean.xml配置文件中,日期的转换

 

<![CDATA[
select count( 1 ) from dbu_window where   
(     
( DATE_FORMAT( '$dateStartTemp$', '%Y-%m-%d' ) >= f_start_date and
    DATE_FORMAT( '$dateStartTemp$', '%Y-%m-%d' ) <= f_end_date )
or     
( DATE_FORMAT( '$dateEndTemp$', '%Y-%m-%d' ) >= f_start_date and 
    DATE_FORMAT( '$dateEndTemp$', '%Y-%m-%d' ) <= f_end_date ) )
]]>
 

 

.$sql$即程序预定义sql语句的应用

java代码:

 

String selSql = "select count(*) from `bbs_config`;";
sqlMapClient.queryForObject( "execSelSqlStr" , selSql );
 

 

bean.xml文件:

 

<select id="execSelSqlStr" resultClass="int" parameterClass="string">
   <![CDATA[   $sql$   ]]>
</select>
 

 

.ResultClass和ResultMap的区别

resultClass:可以把结果自动映射到相应的JAVA类中,但无法指定输出字段的类型,会对性能产生轻微的影响。

resultMap:可以预先定义resultMap元素,可以控制数据如何从结果集中取出,以及哪个属性匹配哪个字段,


parameterClass和parameterMap的区别

parameterClass属性值是JAVA类的全限定名,目的是限制输入参数的类型为指定的JAVA类,如果不指定,任何带有合适属性(get/set方法)的JAVA BEAN都可以作为输入参数

parameterMap:预先定义parameterMap的属性值,用于有次序的参数匹配JDBC符号

.“#”和“$”的区别

“#” 为占为符,#在是用prepareStatement的?插入参数,$是文本替换

“$”为直接替换,但为出现SQL引入问题和性能上的影响,like,limit和表名的引入必须使用“$”

.where 条件的组装

<isEqual>         比较属性值和静态值或另一个属性值是否相等

<idNotEqual>      比较属性值和静态值或另一个属性值是否不相等

<isGreaterThan>    比较属性值是否大于静态值或另一个属性值

<isGreaterEqual>   比较属性值是否大于等于静态值或另一个属性值

<isLessThan>      比较属性值是否小于静态值或另一个属性值

<isLessEqual>     比较属性值是否小于等于静态值或另一个属性值

<isNull>          检查属性是否为NULL

<isNotNull>       检查属性是否不为NULL

<isEmpty>        检查属性是否为NULL或空

<isNotEmpty>     检查属性是否不为NULL或不为空

<isPropertyAvailable>       检查是否存在该属性

<isNotPropertyAvailable>    检查是否不存在该属性

.<![CDATA[ ]]>的含义

用了特殊字符的SQL语句(比如>,<)不能直接使用。必须用<![CDATA[ ]]>

.ibatis自带缓存的运用

 

<cacheModel id=”person-cache” implementation=”LRU”>
   <flushInterval hours=”24”/>       //可以用hours/minutes/second
   <flushOnExecute   statement=”selectperson”/>    //需要缓存的方法,可以为多个
   <property name=”size” value=”1000”/>
</cacheModel>
 

 


缓存策略:

   LRU:最近最少使用

   MEMORY:适用于没有统一的对象重用模式,property的属性值必须是STRONG,

   SOFT,WEAK,这三个值分别对应于JVM不同内存reference类型。

   WEAK,大多数情况下,WEAK是最佳选择,缺省值就是WEAK,它能大大提高常用查询的性能,对于当前不被使用的查询数据,将被清除

   SOFT,在查询结果对象不被使用,可以减少内存不足的可能性

   STRONG,对查询的结果一直保留在内存中,可以使用在数据量很少或者静态数据的时

   FIFO:先进先出

   OSCACHE:配置oscache.properties

.value的使用

假如没有必要写JAVA BEAN作为参数,可以直接使用基本类型,也可以直接传入参数值。如果是直接传入参数值就配置文件中必须写 #value#做为参数传入

.事务的处理

startTransacton();

commitTransaction();

rollbackTransaction();


批处理

如果有很多非查询的(insert/update/delete)语句要处理,为了减少网络通讯的流量,可以进行批处理

 

sqlMaClientp.startBatch();
sqlMapClient.endBatch();
 

 

.iterate在ibatis里的运用,List参数名后面一定要加“[]”,防止解析器简单的把List解析成String

 

<select id="getUserInfoByName" resultMap="userResult" parameterClass="java.util.List">
select * from tuserinfo where f_user_code in
    <iterate open="(" close=")" conjunction="," >
<![CDATA[
           #value[]# 
        ]]>
   </iterate>
</select>
 

 

.xmlResultName的运用 详细输出结果,直接把查存出来的结果映射成XML document

   <select id="getUser" parameterClass="user" resultClass="xml" xmlResultName="person">

    <![CDATA[ 

        select name,sex from t_user where id = #id# 

     ]]>

   </select>


String xml= (String)sqlMapClient.queryForObject("getUser",user );

System.out.println(xml);


<?xml version="1.0" encoding="UTF-8"?>

   <person>

      <name>we are good !</name>

      <sex>2</sex>

   </person>

.分页功能的实现

). 用ibatis自带的分页功能,但是自带分页是把所有数据读入内存再分页的,所以必须自己覆写LimitSqlExecutor方法,

). 直接使用limit实现

.ibatis的IDE:http://ibatis.apache.org/ibator.html

.容易出错的地方 :

) 在parameterMap和resultMap中,字段数据类型是java.sql.Types类定义的常量名称。常用的数据类型包括BLOB,CHAR,CLOB,DATE,LONGVARBINARY, INTEGER,NULL,NUMERIC,TIME,TIMESTAMP和VARCHAR等。 

) 对于数据表中NULLBALE的字段,必须在parameterMap和resultMap中指定字段的数据类型。 

) 对于数据类型是DATE,CLOB或BLOB的字段,最好在parameterMap和resultMap中指定数据类型。 

) 对于二进制类型的数据,可以将LONGVARBINARY映射成byte[]。 

) 对于文本类型较大的数据,可以将CLOB映射成String。 

) Java Bean必须拥有缺省的构造器(即无参数的构造器)。 

) Java Bean最好实现Serializable接口,以备应用的进一步扩展。

.曾经写了一个ibatis动态查询的例子:

排序代码如下:

<dynamic prepend=" order by">
<isNotNull property="sortName">
   <isNotEqual property="sortName" compareValue="">
    <![CDATA[#sortName# ]]>
   </isNotEqual>
</isNotNull>
<isNotNull property="sortSequence">
   <isNotEqual property="sortSequence" compareValue="">
    <![CDATA[ #sortSequence# ]]>
   </isNotEqual>
</isNotNull>
</dynamic>
 

竟然无法排序,后来查了下资料,把“#”改成了“$”就可以了。

现总结下经验:#xxx# xxx代表是属性值,map里面的key或者是你的pojo对象里面的属性,ibatis会自动在它的外面加上引号,表现在sql语句是这样的 where xxx = 'xxx' ;而$xxxx$ 则是把xxxx作为字符串拼接到你的sql语句中,比如 order by topicId , 如果你不用$来拼接而用#的话,外面就会被加上引号,比如你的语句这样写 ... order by #xxx# (xxx就是你传进来的字符串topicId),ibatis 就会把他翻译成 order by 'topicId' 这样就报错了,用$的结果就是这样 order by topicId。

.ibatis通用sql语句可以单独定义如:

<sql id="whereTemplate">
<dynamic prepend="where">
   <isNotNull prepend="and" property="id">
    <![CDATA[ id = #id# ]]>
   </isNotNull>
</dynamic>
</sql>

<select id="coreGetCountAll" resultClass="java.lang.Integer" parameterClass="coreNote">
<![CDATA[ SELECT COUNT( 1 ) FROM note ]]>
<include refid="whereNoteTemplate" />
</select>
 

 

分享到:
评论

相关推荐

    springmvc+maven+ibatis+jetty的pom配置文件

    springmvc+maven+ibatis+jetty的pom配置文件,平时书写太麻烦

    使用ibatis写的小项目

    1. **SqlMapConfig.xml**:这是iBatis的全局配置文件,包含了数据源、事务管理器和SqlSessionFactory的配置。 2. **Mapper XML文件**:每个Mapper文件对应一个Java接口,里面包含了具体的SQL语句和结果映射。 3. *...

    iBATIS内置别名列表

    为了提高开发效率和代码的可读性,iBATIS引入了一系列内置别名,用于简化配置文件中的全限定类名书写。本文将详细介绍iBATIS内置别名列表中所包含的各种类型及其具体含义。 #### 二、事务管理器别名 事务管理器是...

    ibatis sql 语句的编写

    在ibatis中,可以通过XML配置文件或者注解的方式定义SQL语句。以下是一些常见的SQL语句类型及其编写方式: ##### 3.1 查询(SELECT) 查询操作是最常见的数据库操作之一,用于从数据库中检索数据。 ```xml ...

    持久层框架ibatis学习笔记

    - **代码简化**:iBatis 通过 XML 配置文件来管理 SQL 语句,这使得开发者无需在 Java 代码中书写复杂的 JDBC 代码。 - **SQL 与 Java 分离**:iBatis 将 SQL 语句定义在外部 XML 文件中,这不仅提高了 SQL 的可读性...

    ibatis 学习笔记

    Ibatis 的配置主要分为两部分:主配置文件(mybatis-config.xml)和映射文件(mapper.xml)。主配置文件包含了数据库连接信息、全局配置等;映射文件则包含具体的 SQL 语句和结果映射。 四、Mapper 映射文件 ...

    Ibatis学习随笔

    1. SQL Map XML配置文件:这是Ibatis的核心,定义了SQL语句、参数映射和结果映射,使得SQL与业务代码解耦。 2. SqlSession接口:它是与数据库进行交互的主要接口,提供了执行SQL和管理事务的方法。 3. Mapper接口和...

    ibatis学习笔记

    2. **总配置文件**:即`SqlMapConfig.xml`,配置全局环境如事务管理、缓存策略等。 3. **关于每个实体的映射文件(map文件)**:用于定义实体类与数据库表之间的映射关系,通常以`.xml`格式存放。 **C. 属性文件** ...

    ibatis实例

    MyBatis 的配置文件通常包含以下几个部分: - **settings**:全局配置,如缓存、事务管理器等。 - **mappers**:映射器的配置,可以是XML文件路径或者全限定类名。 - **typeAliases**:类型别名,简化Java类在XML...

    springmvc整合ibatis

    2. **iBatis 概述** iBatis 是一个持久层框架,它简化了 SQL 与 Java 代码的交互,将 SQL 查询直接映射到 Java 对象,避免了传统的 JDBC 编程中大量手动的代码编写。 3. **整合目的** 整合 SpringMVC 和 iBatis ...

    iBATIS,循序渐进介绍如何做O/RMapping

    Step1-定义DomainModelStep2-书写SQLMapConfig文件Step3-定义出来DAOInterfaceStep4-书写DAO实现类Step5-书写iBATIS的配置档案Step6-配置iBATIS的DAOinterface与implementclassStep7-如何获取单个DomainObjectStep8-...

    各技术框架架构图.doc

    修改时,我们主要修改的是代表模型的实体对象、XML 配置文件中的 SQL 和/或配置文件的 ResultMap(很多时候是不需要的)。同时,SQL 和代码分离,我们不用在代码的 StringBuffer 的 append 方法之间寻找需要修改的 ...

    各种系统架构图及其简介.pdf

    但代价是必须要写 XML 配置文件,相对 Hibernate 还要写很多 SQL。 使用 iBATIS 我们可以做到代码和 SQL 的分离,只要 SQL 能够解决的问题,iBATIS 就能帮助我们较容易地解决,同时也使我们的项目对某一框架的依赖...

    MyBatis 3学习手册

    - **通过XML配置文件**:推荐使用类路径下的资源文件进行配置。 - 使用`Resources`工具类加载配置文件。 - 示例代码: ```java String resource = "org/mybatis/example/Configuration.xml"; Reader reader = ...

    六大类系统架构图及其简介.doc

    Spring 上下文是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、E、电子、国际化、校验和调度功能。 1.3 Spring AOP 通过配置管理特性,Spring AOP 模块直接将面向方面的...

    java开发常用开源框架架构图

    * Spring 上下文:是一个配置文件,向 Spring 框架提供上下文信息。Spring 上下文包括企业服务,例如 JNDI、EJB、电子邮件、国际化、校验和调度功能。 * Spring AOP:通过配置管理特性,Spring AOP 模块直接将面向...

Global site tag (gtag.js) - Google Analytics