手写Mybatis代码实现会出现的问题

2023-06-26,,

实现自定义框架过程中遇到的问题及解决方案:

1、执行 Resources.class.getClassLoader().getResourceAsStream(path) 方法无法获得去字节输入流

解决方案:

- path 可能出错,检查配置文件名正确,例如数据库配置xml 为 path = “SqlMapConfig.xml”

- 检查target/classes文件夹下是否有要读的xml资源文件,如果没有检查pom.xml是否有<packaging>pom</packaging>, 如果有此内容,打包方式改为<packaging>jar</packaging>, 如果通过pom方式打包,不会生成资源文件到target/classes目录下,修改后 执行mvn compile 重新编译

- 以上两步如果都没问题,应该就可以正常读到输入流了

2,执行configuration.getDataSource().getConnection()方法一直无法建立数据库连接

解决方案:

- 可能是mysql-connector-java=版本不正确,经实际测试发现 5.1.44这个版本是OK的

- 检查jdbcUrl、用户名,密码是否正确,经仔细查找发现我之前写的jdbcUrl错误,修改后:jdbc:mysql://localhost:3306/lagou?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull

- 如果上面两步依然不能建立连接,检查是否数据库没有远程访问权限,可以执行

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'IDENTIFIED BY 'root' WITH GRANT OPTION;

FLUSH PRIVILEGES;   // 开启远程访问权限

- 以上多做了应该能建立连接了

3:出现java.lang.IllegalArgumentException: argument type mismatch

解决方案

--检查数据库的字段和实体类类型是否一致比如int,varchar(String)等。

--//使用反射,根据数据库字段和实体类对应,完成封装
PropertyDescriptor propertyDescriptor = new PropertyDescriptor(columnName, classTypeClass);
Method writeMethod = propertyDescriptor.getWriteMethod();
writeMethod.invoke(o,value);

这里使用的方法getDeclaredFiled 仅能获取类本身的属性成员(包括私有、共有、保护) 注意和xml内的占位值要和实体类属性一致

Invoke内的值的类型注意保持一致或者为他封装类比如integer和int。

4:注意

List<User> users = sqlSession.selectList("user.findAll");
一定要和sqlMapConfig.xml,UserMapper.xml,以及dao层内的namespce和方法名一致大小写也必须一致!!!

其别名
<!--给实体类的全限定类名给别名-->
<typeAliases>
<!--给单独的实体起别名-->
<!-- <typeAlias type="com.badfisher.pojo.User" alias="user"></typeAlias>-->
<!--批量起别名:该包下所有的类的本身的类名:别名还不区分大小写-->
<package name="com.badfisher.pojo"/>

手写Mybatis代码实现会出现的问题的相关教程结束。

《手写Mybatis代码实现会出现的问题.doc》

下载本文的Word格式文档,以方便收藏与打印。