连接数据库

创建数据库连接

YML 配置如下。

# 数据库连接
db:
    url: jdbc:mysql://xxxxxxxx:3306/aj_base?useUnicode=true&characterEncoding=UTF-8&useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=Asia/Shanghai
    user: root
    psw: xxxxxxxx

Java 配置类及创建连接池。

import com.ajaxjs.data.jdbc_helper.JdbcConn;
import com.ajaxjs.data.jdbc_helper.JdbcWriter;
import com.ajaxjs.iam.resource_server.UserInterceptor;
import com.ajaxjs.util.logger.LogHelper;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.config.ConfigurableBeanFactory;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Scope;
import org.springframework.util.StringUtils;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.InterceptorRegistration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import javax.sql.DataSource;

/**
    * 程序配置
    */
@Configuration
public class BaseConfiguration implements WebMvcConfigurer {
    @Value("${db.url}")
    private String url;

    @Value("${db.user}")
    private String user;

    @Value("${db.psw}")
    private String psw;

    @Bean(value = "dataSource", destroyMethod = "close")
    DataSource getDs() {
        return JdbcConn.setupJdbcPool("com.mysql.cj.jdbc.Driver", url, user, psw);
    }
}

也说说 ORM

综观后台开发,大多数的开发工作就是数据库的开发(俗称“CRUD Boy”)。怎么跟数据库打好交道与我们的开发体验息息相关。业界时常讨论的“对象关系阻抗不匹配(Object–relational impedance mismatch)”正是问题的症结所在:既然都是两种不同的“编程世界观”——一个关系型模型的数据库(SQL)、一个编程语言(Java、C#、Go), 各自有各自的方法论、使用场景及思维都不太一样,那么怎么可以做到“和衷共济”然后“互通有无”呢?显然而言“阻抗不匹配”不是一个容易解决的问题。很多后台开发者为了避开写 SQL,于是在各种 ORM(Object–relational mapping) 方案中绞尽脑汁,——请恕笔者直言——那大可不必。ORM 看似开发效率奇高,但实际“里三层、外三层”——不过封装罢了,终究还是回到 SQL 层。ORM,通俗讲就是把一种问题转化为另一种问题进行解决,完全抛弃 SQL。但是数据库的问题,比如关联查询、嵌套的子查询和复杂逻辑的 SQL 等,能在 ORM 中完美地解决吗?或者说写起来并不那么舒服简单,与其这样为什么还要弄蹩脚的 ORM?ORM 恐怕心有余而力不足。而那些问题却是关系数据库最擅长的问题域。把关系数据库擅长解决的问题转化给不擅长处理这类问题的 ORM 去解决,岂不是挺糊涂的吗?面向对象的方法论(ORM 亦算 OO 之衍生),应当控制一下自己的野心,专注于自己擅长的领域吧。况且 SQL 本身足够优秀优雅,都是值得我们深入研究的。

当时 iBatis/MyBatis 代替了 Hibernate,即是一例,证明还不如写 SQL 灵活、高效(SQL First/SQL Centric)。后来的 MyBatis Plus 的 lambda 写法却有点走回头路的意思,——实际早年微软的 LinQ 已大行其道。

当然,也不是说完全抛起 ORM 中的优秀部分,例如:

参阅: 《ORM(对象关系映射)的灾难》

结合上述的优缺点,笔者斗胆给出一个清晰、简单、可复用的 JDBC 解决方案,务求尝试可以处理数据库也就是 Java 领域中 JDBC 所围绕的“CRUD(增删改查)”问题。依笔者浅见,怎么界定好两者之间的接口正是问题关键所在。在 Java 中大家尝试用 DAO(Data Access Object)层去解决,我们这里讨论的就是这个 DAO。