电子商务网站的建设与运营58同城网站建设方案

当前位置: 首页 > news >正文

电子商务网站的建设与运营,58同城网站建设方案,263个人邮箱入口登录网页,英文网站建设情况有道无术#xff0c;术尚可求#xff0c;有术无道#xff0c;止于术。 文章目录前言方案分析1. 分页2. XML自定义SQL案例演示1. 配置2. 简单分页查询3. 带方言的分页查询参考前言 在我们实际开发软件产品过程中#xff0c;数据库的类型可能不是确定的#xff0c;也有客户… 有道无术术尚可求有术无道止于术。 文章目录前言方案分析1. 分页2. XML自定义SQL案例演示1. 配置2. 简单分页查询3. 带方言的分页查询参考前言 在我们实际开发软件产品过程中数据库的类型可能不是确定的也有客户会有要求必须用什么数据库比如很多政府机构要求必须使用国产数据库所以我们在开发时需要适配多种数据库。 MySQL、Oracle、PostgreSQL、达梦等数据库在进行增删改查时都是基于美国国家标准局制定的SQL标准比如SQL-92、SQL-99。 但是每个数据库厂商实际的SQL会有较小差异也就是数据库方言大家最熟知的就是MySQL分页使用limitOracle分页使用rownum。 MyBatis-Plus支持各种标准 SQL 的数据库接下来我们实际演示如何使用MyBatis-Plus适配各种数据库。
方案分析

  1. 分页 很多数据库分页SQL使用方式都不大相同MyBatis-Plus内置分页插件PaginationInnerInterceptor已支持多种数据库官网说明
    在使用内置分页插件时可以设置数据库的类型 Configuration MapperScan(com.pearl.pay.mapper) //持久层扫描 EnableTransactionManagement //启用事务管理 public class MybatisPlusConfig {BeanConditionalOnMissingBean(MybatisPlusInterceptor.class)public MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor new MybatisPlusInterceptor();PaginationInnerInterceptor paginationInnerInterceptor new PaginationInnerInterceptor();paginationInnerInterceptor.setDbType(DbType.MYSQL);interceptor.addInnerInterceptor(paginationInnerInterceptor);return interceptor;} }内置分页插件在执行SQL时会根据当前数据库类型获取分页方言。 在分页方言工厂类DialectFactory中可以看到具体获取方言逻辑mysql、mariadb、clickhouse、oceanbase等数据库都是使用mysql方言。 oracle、达梦数据库用的是oracle方言 MYSQL 数据库分页语句使用LIMIT组装 ORACLE 数据库分页语句使用ROWNUM、ROW_ID组装 综上 在分页时适配多种数据库只需要在分页插件中设置数据库类型即可。
  2. XML自定义SQL 调用MP的API进行增删改查时比如调用xxMpper.selectList()时因为MP在构建SQL时都是使用的基础标准所以一般不存在兼容问题。但是我们自己在XML文件中编写SQL就需要注意各种数据库匹配兼容问题了。 Mybatis本身已经做了多数据库支持只需要告诉框架用的是什么数据库可以根据不同的数据库厂商执行不同的语句。 Mybatis中的DatabaseIdProvider 数据库厂商标识提供者接口声明了获取厂商标识的方法标识可用于以后为每种数据库类型构建不同的查询该机制支持多个厂商或版本。 public interface DatabaseIdProvider {default void setProperties(Properties p) {// NOP}// 根据数据源获取数据库厂商标识String getDatabaseId(DataSource dataSource) throws SQLException; }Mybatis也提供了VendorDatabaseIdProvider实现类 public class VendorDatabaseIdProvider implements DatabaseIdProvider {// 支持的数据库厂商需要自己定义比如 Oracle》oracleprivate Properties properties;// 获取数据库厂商标识IDdatabaseId,egoracleOverridepublic String getDatabaseId(DataSource dataSource) {if (dataSource null) {throw new NullPointerException(dataSource cannot be null);}try {return getDatabaseName(dataSource);} catch (Exception e) {LogHolder.log.error(Could not get a databaseId from dataSource, e);}return null;}Overridepublic void setProperties(Properties p) {this.properties p;}// 根据产品名称获取对应的databaseId。private String getDatabaseName(DataSource dataSource) throws SQLException {String productName getDatabaseProductName(dataSource);if (this.properties ! null) {for (Map.EntryObject, Object property : properties.entrySet()) {if (productName.contains((String) property.getKey())) {return (String) property.getValue();}}// no match, return nullreturn null;}return productName;}// 从数据源中获取数据库产品名称比如 Oracleprivate String getDatabaseProductName(DataSource dataSource) throws SQLException {try (Connection con dataSource.getConnection()) {DatabaseMetaData metaData con.getMetaData();return metaData.getDatabaseProductName();}} }在Mybatis的XML中编写SQL时有个databaseId属性可以指定当前语句块属于哪个数据库类型比如 mapper namespaceorg.pearl.mybatis.demo.dao.UserMapperselect idselectOneById resultTypeorg.pearl.mybatis.demo.pojo.entity.User databaseIdmysqlselect * from user where user_id #{id}/select /mapper综上我们只需要配置DatabaseIdProvider 中支持哪些数据库然后在XML中针对每种数据库方言编写查询语句并添加databaseId属性Mybatis会在启动时获取数据源使用的哪个类型数据库然后执行配置了当前数据库对应的语句 案例演示
  3. 配置 搭建工程集成MP、Oracle、Mysql很简单这里就不赘述了。 在配置文件中添加对应的Oracle、Mysql连接地址 spring:datasource:type: com.zaxxer.hikari.HikariDataSourcedriver-class-name: oracle.jdbc.OracleDriverurl: jdbc:oracle:thin:127.0.0.1:1521:ORCLusername: rootpassword: root#driver-class-name: com.mysql.cj.jdbc.Driver#url: jdbc:mysql://127.0.0.1:3306/d_account?zeroDateTimeBehaviorconvertToNulluseUnicodetruecharacterEncodingUTF-8serverTimezoneAsia/Shanghai#username: root#password: root在MP中添加配置类 Configuration MapperScan(com.pearl.pay.mapper) //持久层扫描 EnableTransactionManagement //启用事务管理 public class MybatisPlusConfig {Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor(DataSource dataSource,DatabaseIdProvider databaseIdProvider) throws SQLException {// MP插件MybatisPlusInterceptor interceptor new MybatisPlusInterceptor();PaginationInnerInterceptor paginationInnerInterceptor new PaginationInnerInterceptor();// 获取当前数据源对应的数据库类型添加分页插件String databaseId databaseIdProvider.getDatabaseId(dataSource);DbType dbType DbType.getDbType(databaseId);paginationInnerInterceptor.setDbType(dbType);interceptor.addInnerInterceptor(paginationInnerInterceptor);return interceptor;}Beanpublic DatabaseIdProvider databaseIdProvider() {// 数据库厂商提供者DatabaseIdProvider databaseIdProvider new VendorDatabaseIdProvider();Properties p new Properties();p.setProperty(Oracle, oracle);p.setProperty(Mysql, mysql);databaseIdProvider.setProperties(p);return databaseIdProvider;} }2. 简单分页查询 因为MyBatis-Plus内置分页插件已经做了适配简单的没有数据库方言分页查询不用自己写代码适配。 首先添加一个分页查询 IPageUser test(PageUser page); select idtest resultTypecom.pearl.entity.Userselect * from user/select数据源配置的是Oracle没有配置databaseId测试SQL语句打印如下 SELECT * FROM ( SELECT TMP.*, ROWNUM ROW_ID FROM ( select * from user) TMP WHERE ROWNUM 10) WHERE ROW_ID 0数据源配置为Mysql测试SQL语句打印如下 select * from user LIMIT 103. 带方言的分页查询 需求 查询时间节点小于当前时间的数据。 Oracle当前时间使用的是sysdate函数Mysql使用的是now()函数这个时候就需要手动去兼容了。 编写两个重名的查询语句针对不同的数据库厂商编写SQL并配置对应的databaseId select idtest resultTypecom.pearl.entity.User databaseIdmysqlselect * from user t ![CDATA[ where t.create_time now()]]/selectselect idtest resultTypecom.pearl.entity.User databaseIdoracleselect * from user t ![CDATA[ where t.create_time sysdate ]]/select也可以使用if语句判断当前数据库类型添加不同语句推荐。 select idtest resultTypecom.pearl.entity.Userselect * from user twhereif test_databaseId mysql![CDATA[ AND t.create_time now()]]/ifif test_databaseId oracle![CDATA[ AND t.create_time sysdate ]]/if/where/select切换数据库执行如下 select * from user t where t.create_time now() LIMIT 10 SELECT * FROM ( SELECT TMP.*, ROWNUM ROW_ID FROM ( select * from user t where t.create_time sysdate ) TMP WHERE ROWNUM 10) WHERE ROW_ID 0参考 接下来我们简单了解下Oracle 和Mysql的一些区别便于开发。 数据类型对照 数据库对比项类型MySQL数据类型INTEGER、SMALLINT、TINYINT、MEDIUMINT、BIGINTOracle数据类型numberMySQL日期和时间date、timestamp、timestampOracle日期和时间date、timestampMySQL字符类型char、varcharOracle字符类型char、varchar、varchar2、nvarchar、nvarchar2MySQL大字段LONGTEXTOracle大字段clob 常用函数对照 数据库对比项函数MySQL获取字符串长度char_length(str)Oracle获取字符串长度length(str)MySQL生成随机序列UUID()Oracle生成随机序列sys_guid()MySQL时间转换为字符串date_format(NOW(),‘%Y-%m-%d’)Oracle时间转换为字符串to_char(sysdate, ‘YYYY-MM-DD’)MySQL字符串型时间转换为时间str_to_date(‘2019-01-01’,‘%Y-%m-%d’)Oracle字符串型时间转换为时间to_date(‘2019-01-01’, ‘YYYY-MM-DD’)MySQL包含时分秒的函数转换date_format(NOW(),‘%Y-%m-%d %H:%i:%s’)Oracle包含时分秒的函数转换str_to_date(‘2019-01-01’,‘%Y-%m-%d %H:%i:%s’)MySQL当前时间now()Oracle当前时间sysdate 其他 数据库对比项支持MySQL引号双引号和单引号Oracle引号只能识别单引号MySQL字符串连接符concat()函数Oracle字符串连接符可用双竖线连接字符串MySQL分页limitOracle分页rownum