记——数据库大小写敏感情况下兼容系统中原有的sql语句

本文介绍了在MySQL数据库由大小写不敏感切换到大小写敏感时,如何处理系统中遗留的大小写不规范的SQL语句。主要探讨了MySQL的大小写策略,并列举了应用中SQL存在的多种形式。提出了通过Druid连接池拦截SQL转换表名为大写的方法,以及Hibernate和Mybatis的相应解决方案,最终分享了作者选择Druid拦截器的实践代码。
摘要由CSDN通过智能技术生成

1、问题

       环境中MySQL数据库需要改成大小写敏感形式,而系统中存在着以前留下来的老sql,格式不规范,数目庞大,使用多种jdbc框架,如hibernate,jdbctemplate等;需要老sql的表名全部改为大写

2、mysql 大小写策略说明

my.cnf里将lower_case_table_names=1 表示对表名大写不敏感;

MySQL在Linux下数据库名、表名、列名、别名大小写规则是这样的:

1) 数据库名与表名是严格区分大小写的

2) 表的别名是严格区分大小写的;

3) 列名与列的别名在所有的情况下均是忽略大小写的;

4) 变量名也是严格区分大小写的;

5) MySQL在Windows下都不区分大小写,但是在Linux下默认是区分大小写的

3、在应用中,sql存在的情况

现在应用持久化,一般有以下情况:mybatis, hibernate, jpa, spring jdbcTemplate、jdbc(原生)等

1) hibernate 中自动生成sql,表名一般是小写

2) Mybatic、jdbcTemplat、jdbc中有可能是自己编写的sql

3) jpa实际依赖实现(如hibernate), 可以认为类似hibernate

4、当应用需要适配大小写敏感的数据库时,有以下解决方案

1) 通过在druid连接池中中拦截待执行的sql,通过druid解析器获取这条sql中的所有表名,并将表名转为大写;

2) 当数据库为mysql时,通过在druid连接池中中拦截待执行的sql,将sql全部转成大写;这种方案的可行性在于mysql数据库对值是大小写不敏感的,这样在执行查询的时候将值直接转成大写不会影响

3)Hibernate 可以通过hibernate.physical_naming_strategy的实现进行改写。大致做法是,实现

org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

重写方法:

public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) 

4)Mybatis 通过增加拦截器插件方式进行改写。如参考mybatis分页插件做法,是类似的。

5、我的处理方法

我的选择是方法1,原因是它能够比较好的兼容其他的数据库,以下为相关代码

1) 在druid配置中添加

<!-- 配置sql转大写 --> 
<property name="proxyFilters">
  	<list>
  		<ref bean="tableNamesToUppercaseFilter"/>
  	</list>
 </property>

 

2) 注册bean

<!-- sql转成大写配置 classPath需要自行替换为具体的路径-->
<bean id="tableNamesToUppercaseFilter" class="classPath.TableNamesToUppercaseFilter"></bean>

3) 重写 FilterEventAdapter


                
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值