实现自定义框架过程中遇到的问题及解决方案:
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"/>