当前位置:网站首页>JDBC再回顾
JDBC再回顾
2022-08-02 04:12:00 【番茄好困】
文章目录
1.JDBC程序的编写步骤

- 加载并注册驱动(不同数据库的驱动是不同的(相当于每个数据库厂商实现的类))
- 创建Connection连接对象(连接数据库)
- 创建Statement或者PreparedStatement对象
- 执行SQL语句
- 使用ResultSet收集对象、关闭ResultSet对象(如果是增删改就不用)
- 关闭Statement或者PreparedStatement对象
2.加载驱动,获取连接
public class ConnectionTest {
// 获取连接对象
@Test
public void test1() throws Exception{
InputStream resourceAsStream = ConnectionTest.class.getClassLoader().getResourceAsStream("jdbc.properties");
Properties properties = new Properties();
properties.load(resourceAsStream);
String username = properties.getProperty("user");
String password = properties.getProperty("password");
String url = properties.getProperty("url");
String driver = properties.getProperty("driverClass");
Class.forName(driver);
Connection connection = DriverManager.getConnection(url, username,password);
System.out.println(connection);
}
}
3.创建Statement或者PraparedStatement对象
Connection.Statement();
Connection.prepareStatement(sql);
4.整体完整流程
4.1针对增删改操作
@Test
public void test2(){
Connection connection = null;
PreparedStatement ps = null;
try {
InputStream resourceAsStream = ConnectionTest.class.getClassLoader().getResourceAsStream("jdbc.properties");
Properties properties = new Properties();
properties.load(resourceAsStream);
String username = properties.getProperty("user");
String password = properties.getProperty("password");
String url = properties.getProperty("url");
String driver = properties.getProperty("driverClass");
// 1.注册驱动
Class.forName(driver);
// 2.获取连接
connection = DriverManager.getConnection(url, username,password);
// 3.SQL语句
String sql = "insert into customers(name,email,birth)values(?,?,?)";// ?是占位符
ps = connection.prepareStatement(sql);
// 替换占位符(下标从1开始)
ps.setString(1, "李四");
ps.setString(2, "[email protected]");
ps.setDate(3,new java.sql.Date(new Date().getTime()));
// 执行语句
int updateRow = ps.executeUpdate();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(connection != null) {
try {
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(ps != null) {
try {
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
4.2针对查询操作
@Test
public void test3(){
Connection connection = null;
PreparedStatement ps = null;
try {
InputStream resourceAsStream = ConnectionTest.class.getClassLoader().getResourceAsStream("jdbc.properties");
Properties properties = new Properties();
properties.load(resourceAsStream);
String username = properties.getProperty("user");
String password = properties.getProperty("password");
String url = properties.getProperty("url");
String driver = properties.getProperty("driverClass");
// 1.注册驱动
Class.forName(driver);
// 2.获取连接
connection = DriverManager.getConnection(url, username,password);
// 3.SQL语句
String sql = "select * from customers";// ?是占位符
ps = connection.prepareStatement(sql);
// 4.执行语句
ResultSet resultSet = ps.executeQuery();
ArrayList<User> list = new ArrayList<User>();
while(resultSet.next()) {
User user = new User();
user.setId(resultSet.getInt("id"));
user.setName(resultSet.getString("name"));
user.setEmail(resultSet.getString("email"));
user.setBirth(resultSet.getDate("birth"));
user.setPhoto(resultSet.getBlob("photo"));
list.add(user);
}
list.forEach(System.out::println);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if(connection != null) {
try {
connection.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if(ps != null) {
try {
ps.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
5.工具类封装
public class JDBCUtil {
private static Connection getConnection() throws Exception {
InputStream inputStream = ClassLoader.getSystemClassLoader().getResourceAsStream("jdbc.properties");
Properties properties = new Properties();
properties.load(inputStream);
String username = properties.getProperty("user");
String password = properties.getProperty("password");
String url = properties.getProperty("url");
String driver = properties.getProperty("driverClass");
// 1.注册驱动
Class.forName(driver);
// 2.获取连接
Connection connection = DriverManager.getConnection(url, username,password);
return connection;
}
private static void close(Connection conn, PreparedStatement ps, ResultSet rs) throws Exception{
if(conn != null) {
conn.close();
}
if(ps != null) {
ps.close();
}
if(rs != null) {
rs.close();
}
}
/** * 增删改通用 * @return * @throws Exception */
public static int update(String sql, Object ...args) {
int executeUpdate = 0;
Connection connection = null;
PreparedStatement prepareStatement = null;
try {
connection = getConnection();
prepareStatement = connection.prepareStatement(sql);
for(int i = 0; i< args.length; i ++) {
prepareStatement.setObject(i+1, args[i]);
}
executeUpdate = prepareStatement.executeUpdate();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
close(connection,prepareStatement,null);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return executeUpdate;
}
public static <T> List<T> query(String sql,Class clazz,Object ...args){
List<T> list = null;
Connection connection = null;
PreparedStatement prepareStatement = null;
ResultSet executeQuery = null;
try {
connection = getConnection();
prepareStatement = connection.prepareStatement(sql);
for(int i = 0; i< args.length; i ++) {
prepareStatement.setObject(i+1, args[i]);
}
executeQuery = prepareStatement.executeQuery();
ResultSetMetaData metaData = executeQuery.getMetaData();
int columnCount = metaData.getColumnCount();
list = new ArrayList<T>();
while(executeQuery.next()) {
T t = (T) clazz.newInstance();
for(int i = 0; i < columnCount; i++) {
String key = metaData.getColumnLabel(i+1);
Object value = executeQuery.getObject(i+1);
Field field = clazz.getDeclaredField(key);
field.setAccessible(true);
field.set(t, value);
}
list.add(t);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
close(connection,prepareStatement,executeQuery);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
return list;
}
}
6.数据库事务
事务:一组SQL语句是一个整体,要么都执行,要么都不执行。
考虑事务后的代码实现:
执行sql语句之前把mysql的默认提交功能关闭,在执行多个sql语句中间不能关闭连接,中间出现异常得回滚sql
public class TranslationTest {
@Test
public void test1() {
Connection connection = null;
try {
connection = JDBCUtil.getConnection();
// 1.关闭自动提交
connection.setAutoCommit(false);
String sql1 = "update user_table set balance = balance - 100 where user = ?";
update(connection,sql1,"AA");
int i = 5 / 0;
String sql2 = "update user_table set balance = balance + 100 where user = ?";
update(connection,sql2,"BB");
connection.commit();
System.out.println("success");
} catch (Exception e) {
// TODO Auto-generated catch block
// 回滚
try {
connection.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
e.printStackTrace();
}finally {
try {
// 关闭连接
JDBCUtil.close(connection, null, null);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
/** * 增删改通用 * @return * @throws Exception */
public int update(Connection connection,String sql, Object ...args) throws Exception{
int executeUpdate = 0;
PreparedStatement prepareStatement = null;
prepareStatement = connection.prepareStatement(sql);
for(int i = 0; i< args.length; i ++) {
prepareStatement.setObject(i+1, args[i]);
}
executeUpdate = prepareStatement.executeUpdate();
JDBCUtil.close(null,prepareStatement,null);
return executeUpdate;
}
}
ent prepareStatement = null;
prepareStatement = connection.prepareStatement(sql);
for(int i = 0; i< args.length; i ++) {
prepareStatement.setObject(i+1, args[i]);
}
executeUpdate = prepareStatement.executeUpdate();
JDBCUtil.close(null,prepareStatement,null);
return executeUpdate;
}
}
边栏推荐
- MySQL read-write separation mysql-proxy deployment
- CaDDN code debugging
- EasyCVR视频广场切换通道,视频播放协议异常的问题修复
- ESP32-C5 简介:乐鑫首款双频 Wi-Fi 6 MCU
- SCI写作攻略——附带常见英语写作句式
- CaDDN paper reading of monocular 3D target detection
- STM32 OLED显示屏--SPI通信知识汇总
- 洛谷P2437蜜蜂路线
- Pycharm platform import scikit-learn
- 6个月测试经验,面试跳槽狮子大开口要18K,只会点点点,给我整无语了。。
猜你喜欢

科研笔记(六) 基于环境感知的室内路径规划方法
![[Win11] PowerShell cannot activate Conda virtual environment](/img/53/464ffb5ef80ce8f6ee19e9ea96c159.png)
[Win11] PowerShell cannot activate Conda virtual environment

How to save a section of pages in a PDF as a new PDF file

OpenPCDet environment configuration of 3 d object detection and demo test

多主复制的适用场景(1)-多IDC

安装部署 Kubernetes 仪表板(Dashboard)

Qt编写物联网管理平台49-设备模拟工具

Batch normalization (BN) based on deep learning

SCI期刊最权威的信息查询步骤!

Scientific research notes (5) SLAC WiFi Fingerprint+ Step counter fusion positioning
随机推荐
ADSP21489工程中LDF文件配置详解
投资组合分析:portfolio_analysis.Tangenvy_portfolio(切点组合)
吴恩达机器学习系列课程笔记——第六章:逻辑回归(Logistic Regression)
Batch normalization (BN) based on deep learning
立方体卫星Light-1
多主复制的适用场景(1)-多IDC
无主复制系统(1)-节点故障时写DB
吴恩达机器学习系列课程笔记——第十四章:降维(Dimensionality Reduction)
1318_将ST link刷成jlink
数学建模学习(76):多目标线性规划模型(理想法、线性加权法、最大最小法),模型敏感性分析
论文速读:Homography Loss for Monocular 3D Object Detection
科研笔记(八) 深度学习及其在 WiFi 人体感知中的应用(下)
Excel操作技巧大全
面试官:大量请求 Redis 不存在的数据,从而打倒数据库,有什么方案?
Research Notes (8) Deep Learning and Its Application in WiFi Human Perception (Part 1)
开放原子开源峰会落幕,百度超级链牵头成立XuperCore开源工作组
redis基础入门
Nexus 5 phone uses Nexmon tool to get CSI information
洛谷P2437蜜蜂路线
区间和 离散化