介绍持久化技术时会介绍的方面包括:技术的特点,使用这技术实体类和数据库表之间的映射如何实现,增删改查的实现等。
JDBC:java database connection ,java数据库连接 JDBC 是java应用程序和数据库之间的桥梁。
JDBC API 是一个Java 的API 它可以
- 连接到数据库
- 创建SQL或MySQL语句
- 在数据库中执行SQL或MySQL查询
- 查看和修改数据库中的数据记录
JDBC特点
在开发应用的持久层时,可选的持久化技术有多种,包括:JDBC,JPA,Hibernate等。JDBC的特点:
- 使用SQL作为数据库查询语言,不要再掌握其他框架的查询语言。
- JDBC允许使用数据库的所有特性,其他框架不行。
- 相对于持久层框架,JDBC能够让我们在更低的层次上处理数据,我们可以完全控制应用程序如何读取和管理数据,包括访问和管理数据库中单独的列。这种细粒度的数据访问方式在很多应用程序中是很方便的
1.实体类和数据库表之间的映射
如果使用JDBC的话,那实体类和数据表之间的映射就需要我们自己实现了。
自定义一个实体类,然后自定义一个建表的脚本,这可以借助Liquibase
2.使用JDBC所提供的直接操作数据库的API 进行增删改查
这儿增删改查 用的是PreparedStatement,在sql中它使用?占位符 代替参数值。而不是:studentName这种。
参考 PreparedStatement预编译无法用?占位符替换表名和字段名
需要负责处理和数据访问相关的所有事情,包括 管理数据库资源和处理异常,其实开发时最好只关注于业务代码。假设应用中已经有实体类Spitter,类中有属性id,Username和Password。数据库中有表s_pitter,表中有列id,username和password。
2.1使用JDBC操作数据库实现insert的代码如下:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Types;
import javax.sql.DataSource;
public class JdbcTest {
public void create(Spitter entity) {
Connection conn = null;
PreparedStatement ps = null;
// 1.准备inser sql语句
StringBuffer buf = new StringBuffer();
buf.append("insert into s_pitter ");
buf.append(" (username, ");
buf.append(" password, ");
buf.append(" )values( ");
for (int i = 0; i < 2; i++) {
buf.append(i == 0 ? "?" : ",?");
}
buf.append(")");
int pos = 1;
try {
// 2.获取连接,获取连接 这一步在不同应用中不一样的。
conn = Connector.getOracleConnection();
// 3.创建sql语句
ps = conn.prepareStatement(buf.toString());
// 4.绑定参数到sql
if (entity.getUsername() != null) {
ps.setString(pos++, entity.getUsername());
} else {
ps.setNull(pos++, Types.NUMERIC);
}
if (entity.getPassword() != null) {
ps.setString(pos++, entity.getPassword());
} else {
ps.setNull(pos++, Types.NUMERIC);
}
// 5.执行sql
ps.executeUpdate();
} catch (SQLException e) { //6.处理异常
// do something
} finally {
// 7.关闭数据库连接,释放资源
try {
if (ps != null) {
ps.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) { //6.处理异常
// do something
}
}
}
}
2.2使用JDBC操作数据库实现update的代码如下: issert和update方法 只是1准备sql和3绑定参数的操作不一样,这也是我们需要关注的。但是在JDBC里要完成insert和update,其它操作(管理数据库资源和处理异常)也是必须的。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Types;
import javax.sql.DataSource;
public class JdbcTest {
public void update(Spitter entity) {
Connection conn = null;
PreparedStatement ps = null;
// 1.准备update sql语句
StringBuffer buf = new StringBuffer();
buf.append("update t_pitter set ");
buf.append(" username = ?, ");
buf.append(" password = ?, ");
buf.append(" where id = ? ");
int pos = 1;
try {
// 2.获取连接,获取连接 这一步在不同应用中不一样的。
conn = Connector.getOracleConnection();
// 3.创建sql语句
ps = conn.prepareStatement(buf.toString());
// 4.绑定参数到sql
if (entity.getUsername() != null) {
ps.setString(pos++, entity.getUsername());
} else {
ps.setNull(pos++, Types.NUMERIC);
}
if (entity.getPassword() != null) {
ps.setString(pos++, entity.getPassword());
} else {
ps.setNull(pos++, Types.NUMERIC);
}
if (entity.getId() != null) {
ps.setLong(pos++, entity.getId());
} else {
ps.setNull(pos++, Types.NUMERIC);
}
// 5.执行sql
ps.executeUpdate();
} catch (SQLException e) { //6.处理异常
// do something
} finally {
// 7.关闭数据库连接,释放资源
try {
if (ps != null) {
ps.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) { //6.处理异常
// do something
}
}
}
}
2.3使用JDBC操作数据库实现delete的代码如下,也是只有准备delete sql语句和绑定参数不一样
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Types;
import javax.sql.DataSource;
public class JdbcTest {
public void delete(Long id) {
Connection conn = null;
PreparedStatement ps = null;
// 1.准备delete sql语句
String sql = "DELETE FROM t_spitter T WHERE T.id= ?"
int pos = 1;
try {
// 2.获取连接,获取连接 这一步在不同应用中不一样的。
conn = Connector.getOracleConnection();
// 3.创建sql语句
ps = conn.prepareStatement(sql);
// 4.绑定参数到sql
ps.setLong(1, id);
// 5.执行sql
ps.executeUpdate();
} catch (SQLException e) { //6.处理异常
// do something
} finally {
// 7.关闭数据库连接,释放资源
try {
if (ps != null) {
ps.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) { //6.处理异常
// do something
}
}
}
}
2.4 使用JDBC操作数据库实现select的代码如下
这里有两点注意:1.把sql查询结果转成实体类。2.如果查询结果是list在处理查询结果是用while而不是if
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Types;
import javax.sql.DataSource;
import java.sql.ResultSet;
public class JdbcTest {
public void findById(Long id) {
Connection conn = null;
PreparedStatement ps = null;
Spitter spitter = null;
ResultSet rs = null;
// 1.准备select sql语句
String sql = "select * FROM t_spitter T WHERE T.id= ?";
int pos = 1;
try {
// 2.获取连接,获取连接 这一步在不同应用中不一样的。
conn = Connector.getOracleConnection();
// 3.创建sql语句
ps = conn.prepareStatement(sql);
// 4.绑定参数到sql
ps.setLong(1, id);
// 5.执行sql 处理查询结果 转成实体类
rs = ps.executeQuery();
if (rs.next()) {
spitter = this.fillEntity(rs);
}
} catch (SQLException e) { // 6.处理异常
// do something
} finally {
// 7.关闭数据库连接,释放资源
try {
if (ps != null) {
ps.close();
}
if (conn != null) {
conn.close();
}
} catch (SQLException e) { // 6.处理异常
// do something
}
}
}
}
import java.sql.ResultSet;
//把查询结果ResultSet类型转为实体类
public Spitter fillEntity(ResultSet rs) throws SQLException {
Spitter spitter = new Spitter();
spitter.setId(rs.getLong("id"));
spitter.setUsername(rs.getString("username"));
spitter.setPassword(rs.getString("password"));
return spitter;
}
2.如果查询结果是list在处理查询结果是用while而不是if
List<Spitter> spitterList = new ArrayList();
while (rs.next()) {
spitterList.add(this.fillEntity(rs))
}