今天在学习Mybaits的时候,根据教程写出了一个第一个程序——从数据库读取一条数据并打印。当一切都就绪了:
user.java
UserMapper.xml
mybatis-config.xml
测试类
依葫芦画瓢地写下来,以为没问题了,运行这个测试方法,竟然报错了:
org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: java.sql.SQLException: Unknown initial character set index '255' received from server. Initial client character set can be forced via the 'characterEncoding' property.
### The error may exist in UserMapper.xml
### The error may involve com.zyr.mybatis.selectUser
### The error occurred while executing a query
### Cause: java.sql.SQLException: Unknown initial character set index '255' received from server. Initial client character set can be forced via the 'characterEncoding' property.
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:150)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:141)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:77)
at com.zyr.mybatis.MybaitsTest.test1(MybaitsTest.java:21)
...
看到信息中有“255”和“characterEncoding"就知道是编码问题了,我数据库设置的是UTF-8的编码,在网上查阅资料后,发现jdbc的url应该加上一些参数,于是把配置文件中改成了:(顺便把时区也加上了)
<property name="url" value="jdbc:mysql://localhost:3306/mybatis_demo?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8"/>
再次运行!~~~ 再次报错!
org.apache.ibatis.exceptions.PersistenceException:
### Error building SqlSession.
### Cause: org.apache.ibatis.builder.BuilderException: Error creating document instance. Cause: org.xml.sax.SAXParseException; lineNumber: 10; columnNumber: 119; 对实体 "characterEncoding" 的引用必须以 ';' 分隔符结尾。
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:80)
at org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:64)
at com.zyr.mybatis.MybaitsTest.test1(MybaitsTest.java:17)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
...
对实体 "characterEncoding" 的引用必须以 ';' 分隔符结尾。
这句话点醒我了,原来他是把属性的分隔符&当作实体的开头了,如
。那也就是说xml文件里面不能有&号出现。(才发现自己如此愚蠢~,用&
代替所有的&就好了,其实问题到这里就已经解决了,但脑子短路的我当时没有往转义代替的方向去想,于是有了后面的问题)我想只能引入外部属性文件了:
jdbc.properties
想到之前学spring的时候,引入外部属性文件是以下代码:
<context:property-placeholder location="classpath:jdbc.properties"/>
粘到配置文件里后,发现总是有小红叉,运行也会报错:
最后又去看Mybaits的官方文档时才发现,它的引入方式是这样的:
<properties resource="jdbc.properties"/>
更改以后成功运行。
我以前一直以为xml配置文档多多少少是有一些共性的,就像html,只是没有那么严格,今天才发现,xml配置可以一点共性都没有,因为每种配置的规范都是在DTD文件里约束好的,元素、属性什么的都是自定义的。嗯,很自由,也很头疼。