Java + JDBC CRUD操作示例
JDBC:java database connection ,java数据库连接 JDBC 是java应用程序和数据库之间的桥梁。
JDBC API 是一个Java 的API 它可以
- 连接到数据库
- 创建SQL或MySQL语句
- 在数据库中执行SQL或MySQL查询
- 查看和修改数据库中的数据记录
JDBC特点
在开发应用的持久层时,可选的持久化技术有多种,包括:JDBC,JPA,Hibernate等。JDBC的特点:
- 使用SQL作为数据库查询语言,不要再掌握其他框架的查询语言。
- JDBC允许使用数据库的所有特性,其他框架不行。
- 相对于持久层框架,JDBC能够让我们在更低的层次上处理数据,我们可以完全控制应用程序如何读取和管理数据,包括访问和管理数据库中单独的列。这种细粒度的数据访问方式在很多应用程序中是很方便的
使用JDBC所提供的直接操作数据库的API 进行增删改查
这儿增删改查 用的是PreparedStatement,在sql中它使用?占位符 代替参数值。而不是:studentName这种。
参考 PreparedStatement预编译无法用?占位符替换表名和字段名
需要负责处理和数据访问相关的所有事情,包括 管理数据库资源和处理异常,其实开发时最好只关注于业务代码。假设应用中已经有实体类Spitter,类中有属性id,Username和Password。数据库中有表s_pitter,表中有列id,username和password。
实体类和数据库表之间的映射
如果使用JDBC的话,那实体类和数据表之间的映射就需要我们自己实现了。
自定义一个实体类,然后自定义一个建表的脚本
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.使用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 } } } }
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 } } } }
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)) }