【Ibatis】(二)、ibatis测试类的具体写法

本文介绍了一个使用 Ibatis 框架进行数据增删改查(CRUD)操作的 Java 示例。示例展示了如何通过 SqlMapClient 进行数据库连接配置,并实现数据插入、查询等基本功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Java代码 收藏代码
  1. packagecom.ibatis.test;
  2. importjava.io.IOException;
  3. importjava.io.Reader;
  4. importjava.sql.SQLException;
  5. importjava.util.Iterator;
  6. importjava.util.List;
  7. importcom.ibatis.common.resources.Resources;
  8. importcom.ibatis.sqlmap.client.SqlMapClient;
  9. importcom.ibatis.sqlmap.client.SqlMapClientBuilder;
  10. importcom.wyq.pojo.User;
  11. publicclassTestIbatis{
  12. publicvoidreadSqlMapConfig(){
  13. }
  14. publicstaticvoidmain(Stringargs[]){
  15. Readerreader=null;
  16. /**//*SqlMapClient是ibatis的核心组件,提供数据操作的基础平台,可以通过
  17. sqlMapClientBuilder创建
  18. *
  19. **/
  20. SqlMapClientsqlMap=null;
  21. Stringresource="sqlMapConfig.xml";
  22. try{
  23. reader=Resources.getResourceAsReader(resource);
  24. sqlMap=SqlMapClientBuilder.buildSqlMapClient(reader);
  25. sqlMap.startTransaction();
  26. /**//*//数据写入操作(insert,update,delete)
  27. Useruser=newUser();
  28. user.setName("Erica");
  29. user.setSex(newInteger(1));
  30. sqlMap.insert("User.insertUser",user);*/
  31. /**//*//数据查询操作(select)
  32. Integerkey=newInteger(1);
  33. Userusers=(User)sqlMap.queryForObject("User.getUsers",key);
  34. System.out.println("id==="+users.getId());
  35. System.out.println("name==="+users.getName());
  36. System.out.println("sex==="+users.getSex());*/
  37. /**//*//在指定对象中放查询结果
  38. Integerkey=newInteger(1);
  39. Useruser=newUser();
  40. sqlMap.queryForObject("User.getUsers",key,user);
  41. System.out.println("id==="+user.getId());
  42. System.out.println("name==="+user.getName());
  43. System.out.println("sex==="+user.getSex());*/
  44. /**//*//执行批量查询
  45. Listlist=sqlMap.queryForList("User.getUsers",null);
  46. Iteratorit=list.iterator();
  47. while(it.hasNext()){
  48. Useruser=(User)it.next();
  49. System.out.println("id==="+user.getId());
  50. System.out.println("name==="+user.getName());
  51. System.out.println("sex==="+user.getSex());
  52. }*/
  53. /**//*//查询指定范围内的数据
  54. Listlist=sqlMap.queryForList("User.getUsers",null,0,3);
  55. Iteratorit=list.iterator();
  56. while(it.hasNext()){
  57. Useruser=(User)it.next();
  58. System.out.println("id==="+user.getId());
  59. System.out.println("name==="+user.getName());
  60. System.out.println("sex==="+user.getSex());
  61. }*/
  62. sqlMap.commitTransaction();
  63. System.out.print("操作成功!");
  64. }catch(IOExceptione){
  65. System.out.print("读取配置文件失败!");
  66. }catch(SQLExceptionex){
  67. System.out.print("操作数据出现异常!");
  68. }
  69. }
  70. }
<think>我们正在处理一个关于MyBatis的PersistenceException嵌套异常的问题。根据用户提供的引用信息,我们可以总结出几个常见的导致此异常的原因和解决方法。 首先,引用[1]和[3]提到,在MyBatis中,如果映射文件(Mapper XML)或注解中指定的结果类型(resultType)不正确,会导致异常。例如,将结果类型写成了集合类型(如java.util.List)而不是实际的JavaBean类型(如User或Department),或者写错了JavaBean的类名(如将User写成Dept)。 引用[5]详细说明了这个问题:当查询返回多个结果时,resultType应该指定为单个元素的类型(如Department),而不是集合类型(如java.util.List)。这是因为MyBatis会自动将结果封装成集合(List或Set),而我们需要告诉MyBatis集合中每个元素的类型。 其次,引用[2]提到一个由第三方库(c3p0)引起的问题,表现为`AbstractMethodError`。这通常是因为MyBatis使用的数据库驱动版本与连接池(如c3p0)不兼容,或者连接池的版本过旧。解决方法是更新连接池库或数据库驱动到兼容的版本。 另外,引用[4]提到了事务管理器的配置,但这里不是直接导致异常的原因,不过配置错误也可能导致其他问题。 综合以上,我们给出以下解决步骤: 1. **检查结果映射(resultType/resultMap)**:确保在映射文件或注解中,resultType属性指定的是返回结果中单个元素的类型(例如`resultType="com.example.User"`),而不是集合类型。同时,检查类名是否正确,包括包名。 2. **检查SQL语句**:确保SQL语句正确无误,可以在数据库客户端中测试SQL语句。 3. **检查依赖兼容性**:如果异常信息中包含`AbstractMethodError`,可能是由于依赖库版本冲突或不兼容。检查MyBatis、数据库驱动、连接池(如c3p0)等版本是否兼容。更新这些库到兼容的版本。 4. **检查映射文件中的其他配置**:如命名空间(namespace)、id等是否正确。 5. **检查模型类**:确保模型类(如User、Department)有正确的getter和setter方法,并且字段与数据库列匹配。 下面我们针对用户遇到的“嵌套异常”具体说明: 根据引用[3],还有一种情况是在使用注解方式时,没有指定返回结果的泛型类型。例如,在Dao接口的方法上使用`@Select`注解,如果没有指定返回集合的泛型类型,也会导致异常。正确做法是:`List<User> getAll();`。 因此,解决方法总结如下: - 如果是resultType写错,修正为正确的JavaBean全限定类名。 - 如果是注解方式,确保方法返回类型带有泛型参数(如`List<User>`)。 - 检查依赖版本,解决版本冲突。 如果用户提供了具体的异常堆栈信息,我们可以更精确地定位问题。但根据现有信息,以上是常见的解决方案。 最后,生成相关问题供用户进一步参考。</think>### MyBatis PersistenceException 嵌套异常解决方法 MyBatis 的 `PersistenceException` 通常由配置错误或 SQL 映射问题引起,结合引用信息,以下是根本原因和解决方案: #### 常见原因及解决方案 1. **结果类型(resultType)配置错误**(高频问题) - **现象**:在 XML 映射文件或注解中指定了错误的返回类型(如写错类名或用集合类型代替实际模型) - **解决**: ```xml <!-- 错误示例:resultType 写为集合类型 --> <select id="getAll" resultType="java.util.List"> ... </select> <!-- 正确示例:应指定实际模型类的全限定名 --> <select id="getAll" resultType="com.example.User"> ... </select> ``` 注解方式需补充泛型: ```java // 原错误写法(缺少泛型) @Select("SELECT * FROM user") List getAll(); // 正确写法(等同于指定 resultType) @Select("SELECT * FROM user") List<User> getAll(); // 泛型声明实际类型[^3][^5] ``` 2. **SQL 语句或表结构错误** - 检查 SQL 语法是否正确(如字段名拼写错误) - 验证数据库表结构与模型类字段是否匹配 3. **依赖库版本冲突**(如连接池不兼容) - **现象**:出现 `AbstractMethodError` 等异常[^2] - **解决**:更新 MyBatis 和连接池(如 C3P0)到兼容版本,检查 Maven/Gradle 依赖树 4. **事务管理器配置错误** - 确保 `mybatis-config.xml` 中事务管理器类型正确: ```xml <transactionManager type="JDBC" /> <!-- 标准JDBC事务 --> ``` #### 调试步骤 1. **开启 MyBatis 日志** 在配置文件中添加设置: ```xml <settings> <setting name="logImpl" value="STDOUT_LOGGING" /> </settings> ``` 查看实际执行的 SQL 和参数绑定情况。 2. **单元测试验证** 逐层测试 DAO 方法: ```java @Test public void testQuery() { List<User> users = userDao.getAll(); // 验证返回类型是否匹配 assertFalse(users.isEmpty()); } ``` 3. **检查映射文件一致性** - 确认 `<mapper namespace>` 与接口全限定名一致 - 核对 SQL 的 `id` 与接口方法名匹配 > **关键提示**:MyBatis 的异常常嵌套底层错误(如 JDBC 异常),需查看完整堆栈的 `Caused by` 部分定位根源[^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值