发表于: 2018-03-30 01:59:57

3 619


今天完成的事情:    

上次任务1.17完成了一半,留下一个编码问题,Java代码中的查询SQL语句条件中带有中文,查不出数据库里存在的对应数据。其实这时向数据库中插入中文数据也是乱码的。我的eclipse编码和MySQL数据库编码都改成utf-8了,还是乱码。

经过测试,是因为配置数据源时数据库连接url上没有加useUnicode=true&characterEncoding=UTF-8这两个参数,加上后就正常了。但是这两个参数的作用是什么?如果不加的话,默认的又是什么情况?

参考mysql官方手册中有关连接器Connector/J的部分内容:           

连接时将自动检测客户端和服务器之间的字符编码。对于由驱动程序使用的编码来说,它是在服务器上通过使用配置变量“character_set”(低于4.1.0的服务器版本)和“character_set_server”(4.1.0和更高的服务器版本)指定的。更多信息,请参见MySQL服务器手册中的http://www.mysql.com/doc/en/Charset-server.html一节。

要想覆盖客户端上的自动检测编码功能,可在用于连接到服务器的URL中使用”characterEncoding”属性。

由以上官方手册内容可知,这两个参数就是决定客户端传输到MySQL服务器的字符用什么方式编码,传的其实就是Java代码中写的SQL语句。而useUnicode默认值就是true,所以不需要配置(低版本好像默认值是false),characterEncoding的默认值是自动检测mysql服务器中character_set_server变量的值。

我的character_set_server变量开始时是latin1,使用set character_set_server = utf8后其值变为utf8,这时客户端、连接、MySQL服务器的编码都是utf8了,而且是重启后设置的set character_set_server。但是依然报错,当我把character_set_server = utf8写进MySQL配置文件my.ini里再重启后,终于正常了,看来jdbc连接器只能获取MySQL启动时的character_set_server值,即使首次连接时character_set_server值已经被修改过。

有关编码的内容暂时告一段落,总结写在收获里。

JdbcTemplate的几个基本方法:

添加、删除、修改:

int update(String sql) //不带参数

int update(String sql, Object... args) //args为参数列表

int update(String sql, Object[] args, int[] argTypes) //args为参数数组,argTypes为参数对应的数据库类型

例子:update("insert into table1(id,name) values(?,?)",  new Object[]{1,"Jack"}, new int[]{java.sql.Types.INTEGER,java.sql.Types.VARCHAR});

查询,所有查询也都有带参数的各种格式,类似update,具体可查API:

List<T> query(String sql,RowMapper<T> rowMapper) //查询列表,把查询结果的每列通过RowMapper映射到Java对象中

List<Map<String,Object>> queryForList(String sql) //查询的每个结果以键值对形式保存在map中

List<T> queryForList(String sql, Class<T> elementType) //查询单列数据,例如表中的某一列等。

T queryForObject(String sql, Class<T> requiredType) //查询单个数值,如表中记录数等。

T queryForObject(String sql,RowMapper<T> rowMapper) //查询单个对象

执行SQL:

void execute(String sql) //一般是执行DDL语句

另外还有用于执行批处理以及存储过程等的其它方法。

任务1.17另一半,使用mybatis连接数据库。

正在看mybatis教程,明天开始写。

今天还复习了一下JDBC连接数据库的知识。

明天计划的事情:

把JDBC连接数据库的增删改查代码写完整。

把JdbcTemplate连接数据库的增删改查代码写完整。      

把mybatis连接数据库弄好。

对比几种方式连接数据库的区别。               

遇到的问题:

JdbcTemplate的API不清楚什么意思,比如queryForList,最好的办法时运行一下试试效果,或者debug运行看看

编码问题,网上各种查资料,大多都是治标不治本的各种互相抄袭的博客,最后发现还是各种官方手册官方API甚至源码靠谱。        

收获:

对JDBC连接数据库过程更加熟悉。

JdbcTemplate的API熟悉了些。

对字符编码的理解加深了些。

有关字符编码的总结:

首先看看MySQL数据库的字符集变量都有哪些:

这些编码的作用就不详细说了,参考网上的文章。

还有这两篇文章,比较有帮助的:

https://blog.csdn.net/dslztx/article/details/47070475

http://www.jb51.net/article/30864.htm

Java文件的内容编码由eclipse设置,一般是设置为UTF-8,这样程序执行后发送给MySQL数据库端的SQL字符就是使用UTF-8编码的。

而连接MySQL的url中的characterEncoding参数会将MySQL中的character_set_client、character_set_connectioncharacter_set_results三个变量的值设置为characterEncoding指定的编码。

若没有设置characterEncoding参数,则characterEncoding会自动检测为MySQL中character_set_server的值。若character_set_server值为utf8,则把上述三个变量的值也设置为utf8。这点不太确定,但测试时若character_set_client、character_set_connectioncharacter_set_results值为latin1,characterEncoding未设置值,character_set_server值为utf8,插入数据时是不会乱码的,查询时再指定characterEncoding的值为UTF-8,也不会乱码。应该可以说明这点。否则的话中文转为latin1编码应该是会乱码的,就像http://www.jb51.net/article/30864.htm文章里的常见问题第一个。但是测试结果和他举的例子是矛盾的,他的例子结果是会乱码。不知道是我错了还是他错了或者因为驱动版本不一样导致的。这文章是2012年的了。

总之大概过程是这样,具体细节还是有些不清楚,但如果再出现乱码应该能确定是哪一步出问题了。

设置方面,客户端、连接、数据库都设置成utf-8就好了,数据库一些设置重启后会复原,需要在my.ini文件里配置,具体就不写了。


返回列表 返回列表
评论

    分享到