Ibatis总结

简介:

1、插入主键自增长:前提是要设置自增长的字段:alter table HU_SERVER modify id int(10) auto_increment;

想取的主键的值,需要加 selectKey这段,而且前面sql语句里面不需要插入主键字段。对于不同的数据库,selectKey语句的写法是不同的。 针对不同数据库的写法如下: 
Cloudscape  VALUES IDENTITY_VAL_LOCAL() 
DB2         VALUES IDENTITY_VAL_LOCAL() 
Derby       VALUES IDENTITY_VAL_LOCAL() 
HSQLDB      CALL IDENTITY() 
MySql       SELECT LAST_INSERT_ID() 
SqlServer   SELECT SCOPE_IDENTITY() 
SYBASE      SELECT @@IDENTITY 
ORACLE      
SELECT CUSTOM_SQL.NEXTVAL AS ID FROM DUAL

 
  1. <insertid="insertOneUser4"parameterClass="com.air.Account">

  2.        INSERT INTO USER_ACCOUNT  

  3.        (  

  4.            USERID,USERNAME, PASSWORD, GROUPNAME

  5.        )VALUES(

  6.            #userid#,

  7.            #username#,

  8.            #password#,

  9.            #groupname#  

  10.        )

  11. <selectKey

  12. keyProperty="userid"

  13. resultClass="int">

  14.            SELECT LAST_INSERT_ID()          

  15. </selectKey>

  16. </insert>

实例:

 
  1. <insertid="insertHServer"parameterClass="com.alibaba.h.console.domain.HServer">

  2.        INSERT INTO

  3.        H_SERVER(ID,NAME,IP,PORT,GMT_CREATED,GMT_MODIFIED)

  4.        VALUES(#id#,#name#,#ip#,#port#,#gmtCreated#,#gmtModified#)

  5. <selectKeykeyProperty="id"resultClass="int"type="pre">

  6.           SELECT LAST_INSERT_ID()

  7. </selectKey>

  8. </insert>

插入时:不需要再setId,让自动生成

2、com.ibatis.common.beans.ProbeException: There is no READABLE property named 'ID' in class 'com.alibaba.h.console.domain.HServer'

原因:<typeAlias alias="hServerClass" type="com.alibaba.h.console.domain.HServer" />中的hServerClass被传入resultClass或者parameterClass

解决方法:直接使用原生的类:parameterClass="com.alibaba.h.console.domain.HServer"

3、传递多参数

方法1:使用对象构造查询参数

 
  1. <selectid="selectStudentByIdAndName"resultClass="Student"parameterClass="Student">

  2.    select * from student where  sid=#sid# and sname=#sname#  

  3. </select>

方法2:使用map封装查询参数

map 的定义一定要在sql的前面,第一次我做连写的时候就吧map的定义放在了后面,结果老是报错,说找不到map的定义;

【注意】limit #begin#,#increment# 的位置,否则dynamic为空的时候,会报sql语法错误

 
  1. <parameterMapclass="java.util.HashMap"id="parameterMap">

  2. <parameterproperty="listType"/>

  3. <parameterproperty="listKey"/>

  4. <parameterproperty="listValue"/>

  5. <parameterproperty="availableBegin"/>

  6. <parameterproperty="availableEnd"/>

  7. <parameterproperty="begin"/>

  8. <parameterproperty="increment"/>

  9. </parameterMap>

  10. <selectid="getBlackList"resultMap="HBlackListResult"

  11. parameterMap="parameterMap">

  12.        SELECT

  13. <includerefid="columns"/>

  14. <![CDATA[

  15.            FROM black_list

  16.        ]]>

  17. <dynamicprepend="where">

  18. <isNotEmptyprepend="and"property="listType">

  19. list_type = #listType#

  20. </isNotEmpty>

  21. <isNotEmptyprepend="and"property="listKey">

  22. list_key = #listKey#

  23. </isNotEmpty>

  24. <isNotEmptyprepend="and"property="listValue">

  25. list_value = #listValue#

  26. </isNotEmpty>

  27. <isNotEmptyprepend="AND"property="availableBegin">

  28.                available_begin >= #availableBegin#

  29. </isNotEmpty>

  30. <isNotEmptyprepend="AND"property="availableEnd">

  31.                available_end &lt;= #availableEnd#

  32. </isNotEmpty>

  33. </dynamic>

  34.          limit #begin#,#increment#

  35. </select>

代码:

 
  1. Map<String,Object> parameterMap = new HashMap<String,Object>();

  2.       parameterMap.put("listType"1);

  3.       parameterMap.put("listKey""list_key1");

  4.       parameterMap.put("listValue""list_value1");

  5. try {

  6.           parameterMap.put("availableBegin"new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parseObject("2011-11-01 00:00:00"));

  7.           parameterMap.put("availableEnd"new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parseObject("2011-11-10 00:00:00"));

  8.       } catch (ParseException e) {

  9. // TODO Auto-generated catch block

  10.           e.printStackTrace();

  11.       }

  12.       parameterMap.put("begin",5);

  13.       parameterMap.put("increment"10);

  14. return getSqlMapClientTemplate().queryForList("HBlackList.getBlackList", parameterMap);



4、动态查询

 
  1. <selectid="getBlackListCount"resultClass="java.lang.Long">

  2.        select count(*) from black_list

  3. <dynamicprepend="where">

  4. <isNotEmptyprepend="and"property="listType">

  5. list_type = #listType#

  6. </isNotEmpty>

  7. <isNotEmptyprepend="and"property="listKey">

  8. list_key = #listKey#

  9. </isNotEmpty>

  10. <isNotEmptyprepend="and"property="listValue">

  11. list_value = #listValue#

  12. </isNotEmpty>

  13. <isNotEmptyprepend="AND"property="availableBeginBegin">

  14.                available_begin >= #availableBeginBegin#

  15. </isNotEmpty>

  16. <isNotEmptyprepend="AND"property="availableEndBegin">

  17.                available_end &lt;= #availableEndBegin#

  18. </isNotEmpty>

  19. </dynamic>

  20. </select>

注意点:

(1)resultClass类型:具体的类型

(2) '>'需要使用转义符号:‘&lt;

(3) timestamp支持查询时比较大小,可用>,< =等,已确认;datetime似乎不行,待确认?测试后为:支持,用法一样

5、输出完整的sql,只需要配置如下日志

 
  1. log4j.appender.stdout=org.apache.log4j.ConsoleAppender

  2. log4j.appender.stdout.layout=org.apache.log4j.PatternLayout

  3. log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n

  4. log4j.logger.com.ibatis=debug

  5. log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=debug

  6. log4j.logger.com.ibatis.common.jdbc.ScriptRunner=debug

  7. log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=debug

  8. log4j.logger.java.sql.Connection=debug

  9. log4j.logger.java.sql.Statement=debug

  10. log4j.logger.java.sql.PreparedStatement=debug,stdout

或者:

 
  1. <?xmlversion="1.0"encoding="UTF-8"?>

  2. <!DOCTYPE log4j:configuration SYSTEM "log4j.dtd">

  3. <log4j:configurationxmlns:log4j="http://jakarta.apache.org/log4j/">

  4. <appendername="STDOUT"class="org.apache.log4j.ConsoleAppender">

  5. <layoutclass="org.apache.log4j.PatternLayout">

  6. <paramname="ConversionPattern"value="%d [%-5p] %c\:%x%L - %m%n"/>

  7. </layout>

  8. </appender>

  9. <loggername="log4j.logger.com.ibatis.*"additivity="true">

  10. <priorityvalue="debug"/>

  11. <appender-refref="STDOUT"/>

  12. </logger>

  13. <loggername="log4j.logger.java.sql.*"additivity="true">

  14. <priorityvalue="debug"/>

  15. <appender-refref="STDOUT"/>

  16. </logger>

  17. <root>

  18. <levelvalue="debug"/>

  19. <appender-refref="STDOUT"/>

  20. </root>

  21. </log4j:configuration>



本文转自 zhouhaipeng 51CTO博客,原文链接:http://blog.51cto.com/tianya23/697788,如需转载请自行联系原作者


相关文章
|
16天前
|
Java 数据库连接 数据库
org.apache.ibatis.session.AutoMappingUnknownColumnBehavior
org.apache.ibatis.session.AutoMappingUnknownColumnBehavior
24 0
|
7月前
|
XML Java 数据库连接
解决在mybatis中出现的org.apache.ibatis.exceptions.PersistenceException~
解决在mybatis中出现的org.apache.ibatis.exceptions.PersistenceException~
699 0
|
Java 数据库连接 程序员
异常:org.apache.ibatis.reflection.ReflectionException
异常:org.apache.ibatis.reflection.ReflectionException
124 0
|
SQL Java 数据库连接
org.apache.ibatis.reflection.ReflectionException: There is no getter for propert
org.apache.ibatis.reflection.ReflectionException: There is no getter for propert
107 0
org.apache.ibatis.reflection.ReflectionException: There is no getter for propert
|
Java 数据库连接 开发工具
MyBatis注解开发报错org.apache.ibatis.builder.IncompleteElementException-解决方案
MyBatis注解开发报错org.apache.ibatis.builder.IncompleteElementException-解决方案
117 0
|
druid Apache 数据库
|
数据库 数据安全/隐私保护
NoUniqueBeanDefinitionException: No qualifying bean of type 'org.apache.ibatis.session.SqlSession...
Caused by: org.springframework.beans.factory.NoUniqueBeanDefinitionException: No qualifying bean of type 'org.
4792 0
|
XML Java 程序员
org.apache.ibatis.binding.BindingException
org.apache.ibatis.binding.BindingException
146 0
org.apache.ibatis.binding.BindingException
|
SQL Java 关系型数据库