最近在看一本书:《Spring MVC+MyBatis开发从入门到项目实战》,图书馆里借的,泛泛地翻了一下,觉得可以学,于是就迎来了许多坑~
比如下面这个~
书中第三章 3.1节中的MyBatisFirstDemo这个例子,目的是测试MyBatis连接本地的MySQL并做简单查询,然后返回结果字符串输出到屏幕上。(没有用到Spring MVC)
我跟着书上的示例代码敲了一下,
敲完运行,除了LOG4J的一些提示,和书上的输出不一样啊!看这日志,还以为数据库被强制关闭,四舍五入以为数据库服务没启动呢。
DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
于是我就开始琢磨MySQL了,又是修改root用户的密码,以为像“123456”这种密码在MySQL8里面不符合政策,也没改成,琢磨了一下没结果,晚上就去上课了,心不在焉的。
晚上下课回来又琢磨,把书里面给的网址上的源码下下来运行,比上面的log只多了一行“opening JDBC Connection”,然后几个循环以后程序就停了,头大!
然后,我想着,我对MyEclipse不熟悉,毕竟没用过,然后把这项目里的MySQL JDBC的jar包搬到Intelij IDEA里简单用基本的JDBC语句测了一下,先是不能运行,报错说找不到这个“com.mysql.jdbc.Driver”,网上一查,说是要往项目里添加依赖(dependency)——IDEA导入MySQL的jdbc驱动,并操作数据库,这里还学会了添加依赖~
添加完之后依然不行,报错说“Unknown character set index for field '255' received from server.”,百度之后找到了答案——Unknown character set index for field '255' received from server.,是Jar包版本太低了,匹配不上MySQL8,于是更换了Jar包(mysql-connector-java-5.1.46.jar),可以正常运行出结果了!
JDBC与MySQL的问题解决了,然并卵,替换掉MyBatisDemo中的低版本jar包后,程序输出依然没反应,和上面一毛一样,我有点怀疑人生了~但是这个jar包替换掉书中源码的那个项目,就可以正常有SQL的输出,太晚了,于是我睡了。
第二天中午回来一顿反思,看到MyEclipse右下角有个JUnit的日志框,我双击了一下,原来可以放大,之前都是在一个窄框里看log,没太注意,这是一个突破口!!!
说实话,我之前看了好几次这个log,都没有啥体会,毕竟第一次搞MyBatis配置。
这里说mapper必须匹配configuration,我转头一看我写的UserMapper.xml,我的妈,我抄错代码了!!!
不知者无罪,我对XML一无所知,DTD(Document Type Definition)给写错了,以下是我的错误代码
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="test">
<select id="findUserById" parameterType="int"
resultType="cn.com.mybatis.po.User">
SELECT * FROM user WHERE id=#{id}
</select>
</mapper>
而正确的代码是酱婶的,!DOCTYPE这里出了问题,MyBatis不认账了,不给解析了吧
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="test">
<select id="findUserById" parameterType="int"
resultType="cn.com.mybatis.po.User">
SELECT * FROM user WHERE id=#{id}
</select>
</mapper>
改了以后,程序当然正常运行啦~
DEBUG [main] - Logging initialized using 'class org.apache.ibatis.logging.log4j.Log4jImpl' adapter.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - PooledDataSource forcefully closed/removed all connections.
DEBUG [main] - Opening JDBC Connection
DEBUG [main] - Created connection 2114874018.
DEBUG [main] - Setting autocommit to false on JDBC Connection [com.mysql.jdbc.JDBC4Connection@7e0e6aa2]
DEBUG [main] - ==> Preparing: SELECT * FROM user WHERE id=?
DEBUG [main] - ==> Parameters: 2(Integer)
DEBUG [main] - <== Total: 1
姓名:李四
性别:男
生日:1989-10-13
所在地:河北省邯郸市
DEBUG [main] - Resetting autocommit to true on JDBC Connection [com.mysql.jdbc.JDBC4Connection@7e0e6aa2]
DEBUG [main] - Closing JDBC Connection [com.mysql.jdbc.JDBC4Connection@7e0e6aa2]
DEBUG [main] - Returned connection 2114874018 to pool.
希望大家,特别是和我一样的初学者,引以为戒!
这让我以后会更加注意XML配置文件的格式,我学到了!