在系统开发过程中,开发人员需要使用面向对象的思维实现业务逻辑,但设计数据库表或是操作数据库记录时,则需要通过关系型的思维方式考虑问题。应用程序与关系型数据库之间进行交互时,数据在对象和关系结构中的表、列、字段等之间进行转换。
目前常用的关系型数据库有 Mysql、Oracle、SqlServer,随着国产化的推行,国产化数据越来越多的出现在人们眼前,常用的国产化数据库如:达梦、人大金仓、神舟通用等。系统中操作的关系型数据库主要就是这些。
https://www.oracle.com/database/technologies/appdev/jdbc.html
JDBC 是 Java 与数据库交互的统一 API,在实际开发 Java 系统时,我们可以通过 JDBC 完成多种数据库操作。这里以传统 JDBC 编程中的查询操作为例进行说明,其主要步骤如下:
运行环境:Win10 + Jdk1.8 + Maven3 + Intellij IDEA 2020 + mysql5.7
1、示例代码地址
https://gitee.com/lif/study-mybatis/tree/master
2、目录结构如下
3、pom.xml 文件引入数据库驱动包
4.0.0
com.ddpyjqtd
simple-jdbc
1.0-SNAPSHOT
simple-jdbc
UTF-8
1.8
1.8
org.projectlombok
lombok
1.18.10
provided
mysql
mysql-connector-java
8.0.20
org.slf4j
slf4j-api
1.7.30
org.apache.logging.log4j
log4j-slf4j-impl
2.13.3
test
org.apache.logging.log4j
log4j-api
2.13.3
org.apache.logging.log4j
log4j-core
2.13.3
junit
junit
4.11
test
4、增加 model 类: Demo.java
package com.ddpyjqtd.demo.jdbc.model;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.util.Date;
/***
* 测试表对应的demo类
*
* @author ddpyjqtd
* @date 2020/5/27 21:54
*/
@Getter
@Setter
@ToString
public class Demo {
/**
* int 类型字段
*/
private int demoInt;
/**
* String 类型字段
*/
private String demoVarchar;
/**
* text 类型字段
*/
private String demoText;
/**
* datetime 类型字段
*/
private Date demoDateTime;
}
5、增加数据库配置文件:db.properties,内容如下:
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf8&serverTimezone=UTC
username=root
password=root
6、增加日志配置文件 log4j2.xml,内容如下:
d://logs
simple-jdbc
${file_path}/${project_name}.log
${file_path}/${project_name}-sql.log
${file_path}/${project_name}-error.log
%d{yyyy-MM-dd HH:mm:ss.SSS} %-5p %c{36} %L %M - %m%n
7、增加数据库配置文件读取工具类:DbUtils.java,内容如下:
package com.ddpyjqtd.demo.jdbc.util;
import lombok.Getter;
import lombok.Setter;
import java.util.ResourceBundle;
/**
* 数据库工具类
*
* @author: ddpyjqtd
* @date: 2020/5/27 22:10
*/
public class DbUtils {
private DbUtils() {
}
public static final String DRIVER;
public static final String URL;
public static final String USER_NAME;
public static final String PASS_WORD;
static {
ResourceBundle bundle = ResourceBundle.getBundle("db");
DRIVER = bundle.getString("driver");
URL = bundle.getString("url");
USER_NAME = bundle.getString("username");
PASS_WORD = bundle.getString("password");
}
}
8、编写数据库操作类:DemoDao.java,内容如下:
package com.ddpyjqtd.demo.jdbc.dao;
import com.ddpyjqtd.demo.jdbc.model.Demo;
import com.ddpyjqtd.demo.jdbc.util.DbUtils;
import lombok.extern.slf4j.Slf4j;
import java.sql.*;
/**
* Demo 实例对象数据库查询方法
*
* @author: ddpyjqtd
* @date: 2020/5/27 21:52
*/
@Slf4j
public class DemoDao {
/**
* 通过ID获取DEMO对象信息
*
* @param demoId 主键ID
* @return com.ddpyjqtd.demo.jdbc.model.Demo
* @author ddpyjqtd
* @date 2020/5/27 21:56
*/
public Demo findDemoById(int demoId) {
Connection conn = null;
PreparedStatement pst = null;
ResultSet rs = null;
Demo demo = null;
try {
// 加载驱动包
Class.forName(DbUtils.DRIVER);
// 获取数据库连接
conn = DriverManager.getConnection(DbUtils.URL,DbUtils.USER_NAME, DbUtils.PASS_WORD);
// 预加载
pst = conn.prepareStatement("select * from demo where demo_int = ? ");
pst.setInt(1, demoId);
// 获取结果集
rs = pst.executeQuery();
// 将结果集映射到对象中
while (rs.next()) {
demo = new Demo();
demo.setDemoInt(rs.getInt("demo_int"));
demo.setDemoText(rs.getString("demo_text"));
demo.setDemoVarchar(rs.getString("demo_varchar"));
demo.setDemoDateTime(rs.getTime("demo_date_time"));
log.info("demo info: {}", demo.toString());
}
} catch (Exception e) {
log.error("error:", e);
} finally {
// 资源回收
if (rs != null) {
try {
rs.close();
} catch (SQLException throwables) {
log.error("rs close error : ", throwables);
}
}
if (pst != null) {
try {
pst.close();
} catch (SQLException throwables) {
log.error("pst close error : ", throwables);
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException throwables) {
log.error("conn close error : ", throwables);
}
}
}
return demo;
}
}
9、执行 SQL
CREATE TABLE demo (
demo_int int(255) NOT NULL COMMENT 'int 类型字段',
demo_varchar varchar(255) NULL DEFAULT NULL COMMENT 'String 类型字段',
demo_text text NULL COMMENT 'text 类型字段',
demo_date_time datetime(0) NULL DEFAULT NULL COMMENT 'datetime 类型字段',
PRIMARY KEY (demo_int) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_bin COMMENT = '示例表,各个字段为数据库的各种类型' ROW_FORMAT = Dynamic;
insert into demo (demo_int, demo_varchar, demo_text, demo_date_time)
VALUES (1, 'this is demo_varchar', 'this is demo_text', now());
10、编写测试类:TestDemoDao.java,内容如下:
package com.ddpyjqtd.demo.jdbc.dao;
import com.ddpyjqtd.demo.jdbc.model.Demo;
import org.junit.Assert;
import org.junit.Test;
/**
* 测试类
*
* @author: ddpyjqtd
* @date: 2020/5/27 22:28
*/
public class TestDemoDao {
@Test
public void testFindDemoById() {
int demoInt = 1;
DemoDao dao = new DemoDao();
Demo demo = dao.findDemoById(demoInt);
Assert.assertNotNull(demo);
}
}
11、运行测试类,执行结果如下: