当前位置:   article > 正文

MyBatis 方言支持 - Mysql to 华为高斯数据库(gaussdb)_gaussdb mybatis

gaussdb mybatis

1.spring-config-mybatis.xml文件加入方言支持(只列出必要字段)

  1. <!-- 配置方言 -->
  2. <bean name="databaseIdProvider" class="org.apache.ibatis.mapping.VendorDatabaseIdProvider" >
  3. <property name="properties">
  4. <map>
  5. <entry key="MySQL" value="mysql"></entry>
  6. <entry key="ORACLE" value="oracle"></entry>
  7. <entry key="Zenith" value="gaussdb"></entry><!-- 高斯数据库 -->
  8. </map>
  9. </property>
  10. </bean>
  11. <bean id="sessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
  12. <property name="databaseIdProvider" ref="databaseIdProvider" /> <!-- 配置方言 -->
  13. <!-- 其他配置 请参见项目代码 -->
  14. </bean>

配置说明:key:数据库类型-mybatis可以根据数据源类型自动识别

                   value:mapper xml文件中用到,后续说明

自动识别数据源类型备注:

                  MyBatis 接口:org.apache.ibatis.mapping.VendorDatabaseIdProvider#getDatabaseProductName

                  实现该接口 java.sql.DatabaseMetaData

                  Mysql实现类:com.mysql.jdbc.DatabaseMetaData#getDatabaseProductName : return "MySQL"

2.Mapper说明

  2.1 因为mapper XML 文件不支持继承,(一个接口中的方法在XML文件中必须有实现-否则启动报错),

       所以采用 Mapper.java 接口类继承的方式

3.Mapper支持 案例说明

数据库驱动
  1. 先删除 原有数据库驱动(当前都是MySQL)
  2. <dependency>
  3. <groupId>mysql</groupId>
  4. <artifactId>mysql-connector-java</artifactId>
  5. <version>5.1.38</version>
  6. </dependency>

引入 新数据库驱动文件(高斯数据库)

  1. <dependency>
  2. <groupId>com.huawei.gauss</groupId>
  3. <artifactId>com.huawei.gauss.jdbc.ZenithDriver</artifactId>
  4. <version>GaussDB_100_1.0.1.SPC2.B003</version>
  5. </dependency>
数据源 变更
  1. <property name="driverClass" value="com.huawei.gauss.jdbc.ZenithDriver"/>
  2. <property name="jdbcUrl" value="jdbc:zenith:@127.0.0.1:3358?useSSL=false"/>
  3. <property name="user" value="jr"/>
  4. <property name="password" value="data****_123"/>

<!-- GaussDB 高斯数据库不能有下边的配置,否则报错 -->
<!-- <property name="testConnectionOnCheckout" value="true"/>-->

分页说明

经过测试 高斯数据库支持 limit 操作,如下:

select id, trace_account, business_type, tache_type, industry_code

from zt_trace_data_store 

where del_flag=0 and trace_account = 'jmm' order by create_time desc LIMIT 5, 5 

 

MyBatis 分页插件可用:(com.github.pagehelper.PageInterceptor)

数据库-语法变更

部分预发差异

MySql高斯数据库
sysdate()
sysdate

 

案例-现有接口
  1. public interface TraceDataStoreExtMapper {
  2. List<TraceDataStoreWithBLOBs> getList(TraceDataStoreVo record) throws Exception;
  3. int insertSelectiveGetKey(TraceDataStoreWithBLOBs record) throws Exception;
  4. Integer insertBatch(List<TraceDataStoreWithBLOBs> datas)throws Exception;
  5. }

 

  1. <mapper namespace="com.TraceDataStoreExtMapper">
  2. <resultMap id="BaseResultMap" type="com.TraceDataStoreWithBLOBs" extends="com.TraceDataStoreMapper.ResultMapWithBLOBs">
  3. </resultMap>
  4. <!--基础查询条件-->
  5. <sql id="selectList_Count_Where">
  6. <where>
  7. AND del_flag=0
  8. <if test="traceAccount != null">
  9. AND trace_account = #{traceAccount,jdbcType=VARCHAR}
  10. </if>
  11. </where>
  12. </sql>
  13. <select id="getList" parameterType="com.TraceDataStoreVo" resultMap="BaseResultMap">
  14. select
  15. <include refid="com.TraceDataStoreMapper.Base_Column_List" />
  16. ,
  17. <include refid="com.TraceDataStoreMapper.Blob_Column_List" />
  18. from zt_trace_data_store
  19. <include refid="selectList_Count_Where"></include>
  20. order by create_time desc
  21. </select>
  22. <insert id="insertSelectiveGetKey" parameterType="com.TraceDataStoreWithBLOBs" useGeneratedKeys="true" keyProperty="id">
  23. insert into zt_trace_data_store
  24. <trim prefix="(" suffix=")" suffixOverrides=",">
  25. <if test="id != null">
  26. id,
  27. </if>
  28. <if test="traceAccount != null">
  29. trace_account,
  30. </if>
  31. </trim>
  32. <trim prefix="values (" suffix=")" suffixOverrides=",">
  33. <if test="id != null">
  34. #{id,jdbcType=BIGINT},
  35. </if>
  36. <if test="traceAccount != null">
  37. #{traceAccount,jdbcType=VARCHAR},
  38. </if>
  39. </trim>
  40. </insert>
  41. <insert id="insertBatch" parameterType="java.util.List" useGeneratedKeys="true" keyProperty="id">
  42. INSERT INTO zt_trace_data_store (
  43. id, trace_account
  44. )
  45. VALUES
  46. <foreach collection="list" item="item" index="index" separator="," >
  47. (
  48. #{item.id,jdbcType=BIGINT}, #{item.traceAccount,jdbcType=VARCHAR}
  49. )
  50. </foreach>
  51. </insert>
  52. </mapper>
案例-现有接口实现Mapper

 

案例-Mapper类继承
  1. public interface TraceDataStoreExtDialectMapper extends TraceDataStoreExtMapper {
  2. }

继承类 空实现即可 - 目的是为了后续可以单独写 mapper.xml

切记:将项目中用到 TraceDataStoreExtMapper 的地方都替换成 TraceDataStoreExtDialectMapper

案例-Mapper.xml 实现
  1. <mapper namespace="com.TraceDataStoreExtDialectMapper" >
  2. <!-- 设置方言 MySQL -->
  3. <insert id="insertSelectiveGetKey" databaseId="mysql" parameterType="com.TraceDataStoreWithBLOBs" useGeneratedKeys="true" keyProperty="id">
  4. insert into zt_trace_data_store
  5. <trim prefix="(" suffix=")" suffixOverrides=",">
  6. <if test="id != null">
  7. id,
  8. </if>
  9. <if test="traceAccount != null">
  10. trace_account,
  11. </if>
  12. </trim>
  13. <trim prefix="values (" suffix=")" suffixOverrides=",">
  14. <if test="id != null">
  15. #{id,jdbcType=BIGINT},
  16. </if>
  17. <if test="traceAccount != null">
  18. #{traceAccount,jdbcType=VARCHAR},
  19. </if>
  20. </trim>
  21. </insert>
  22. </mapper>

备注: 只比原始配置多了一个 databaseId="mysql" 当数据源是MySQL时会自动加载该配置

databaseId 说明:

MyBatis 会加载不带 databaseId 属性和带有匹配当前数据库 databaseId 属性的所有语句。
如果同时找到带有 databaseId 和不带 databaseId 的相同语句,则后者会被舍弃。

案例-测试结论

1.TraceDataStoreExtDialectMapper类对应的xml配置可以为空或只写符合业务的sql配置(打破了之前必须要填写所有接口方法的限制)

2.当databaseId跟数据源匹配时对应 sql xml 被加载

3.当databaseId跟数据源不匹配时 加载原始xml配置(被继承者的)

4.当 TraceDataStoreExtDialectMapper 的 databaseId 为空时加载继承者(TraceDataStoreExtDialectMapper)的 xml配置 (相当于重写)

改造目录结

多方言支持可以采用该方式-分别实现各自的 databaseId 对应的配置

已经过测试可行;

 

99.java原生代码调用数据库简单案例(测试)

  1. package com.jd.bt.middle.service;
  2. import java.sql.*;
  3. public class GaussDBTest {
  4. private static Connection connection = null;
  5. private static PreparedStatement preState = null;
  6. private static ResultSet resultSet = null;
  7. private static final String username = "jr";
  8. private static final String passwd = "data****_123";
  9. private static Connection getConnection() {
  10. String driver = "com.huawei.gauss.jdbc.ZenithDriver"; //数据库连接描述符。
  11. String sourceURL = "jdbc:zenith:@127.0.0.1:3358?useSSL=true";
  12. Connection conn = null;
  13. try { //加载数据库驱动。
  14. Class.forName(driver).newInstance();
  15. } catch (Exception e) {
  16. e.printStackTrace();
  17. return null;
  18. }
  19. try {
  20. //创建数据库连接。
  21. conn = DriverManager.getConnection(sourceURL,username,passwd);
  22. System.out.println("Connection 成功!\n");
  23. } catch (Exception e) {
  24. e.printStackTrace();
  25. return null;
  26. }
  27. return conn;
  28. };
  29. private static void executeSqlQuery(String sql,Object ... args )throws Exception{
  30. connection = getConnection();
  31. preState = connection.prepareStatement(sql);
  32. if(null!=args){
  33. for(int i=1;i<=args.length;i++){
  34. Object value = args[i-1];
  35. if(value instanceof String){
  36. preState.setString(i, String.valueOf(value));//1是指sql语句中第一个?, 2是指第一个?的values值
  37. }else if(value instanceof Integer){
  38. preState.setInt(i,Integer.valueOf(value.toString()));
  39. }else if(value instanceof Long){
  40. preState.setLong(i,Long.valueOf(value.toString()));
  41. }else{
  42. throw new RuntimeException("参数格式异常");
  43. }
  44. }
  45. }
  46. boolean execute = preState.execute();
  47. System.out.println("执行结果:"+execute);
  48. resultSet = preState.getResultSet();
  49. }
  50. private static void printResult(String ... fieldName)throws Exception{
  51. try{
  52. System.out.println("\n================打印结果如下================");
  53. while (resultSet.next()) {
  54. for(String item : fieldName){
  55. String val = resultSet.getString(item);
  56. System.out.print(item+":"+ val + " ");
  57. }
  58. System.out.println(); //打印输出结果集
  59. }
  60. System.out.println("================打印结果如上================\n");
  61. }catch(Exception e){
  62. e.printStackTrace();
  63. }finally {
  64. try {
  65. if (resultSet!=null && !resultSet.isClosed()){
  66. resultSet.close();
  67. }
  68. if (connection!=null && !connection.isClosed()) {
  69. connection.close();
  70. }
  71. } catch (SQLException e) {
  72. e.printStackTrace();
  73. }
  74. }
  75. }
  76. public static void main(String[] args)throws Exception {
  77. try{
  78. // executeSql("select * from ADM_TABLESPACES where tablespace_name = ?","SYDB_RESOURCE" );
  79. // printResult("tablespace_name","datafile_count");
  80. // executeSqlQuery("select * from ZT_TRACE_DATA_STORE where id = ?",1 );
  81. // printResult("trace_account","sku_id");
  82. Long id = System.currentTimeMillis();
  83. executeSqlQuery("insert into zt_trace_data_store (id,trace_account,business_type,tache_type,industry_code,sku_id) values (?,?,?,?,?,?)",id,"ofc",3,4,"jdbiz",69000001);
  84. // printResult("trace_account","sku_id");
  85. executeSqlQuery("select * from ZT_TRACE_DATA_STORE where trace_account = ?", "ofc" );
  86. printResult("id","trace_account","industry_code");
  87. }catch(Exception e){
  88. e.printStackTrace();
  89. }
  90. }
  91. }

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/313656?site
推荐阅读
相关标签