JDBC4 - 实现CRUD
JDBC实现CRUD
其中对SELECT语句进一步优化
package com.atguigu.api.preparedStatement;
import org.junit.Test;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import static com.sun.xml.internal.fastinfoset.alphabet.BuiltInRestrictedAlphabets.table;
public class PSCRUDPart {
public static void main(String[] args) {
}
//测试方法需要导入junit的测试包
@Test
public void testInsert() throws ClassNotFoundException, SQLException {
/**
* t_user插入一条数据
* account
* password
* nickname
*/
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接
Connection connection = DriverManager.getConnection("jdbc:mysql:///atguigu", "root", "123456");
//3.编写SQL语句结构,动态值使用 ? 代替
String sql = "insert into t_user(account,password,nickname) values(?,?,?)";
//4.创建preparedStatement,并且传入SQL语句
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//5.占位符赋值
preparedStatement.setObject(1, "zzz");
preparedStatement.setObject(2, "123456");
preparedStatement.setObject(3, "hehe");
//6.发送SQL语句
int rows = preparedStatement.executeUpdate();
//7.输出结果
if(rows > 0) {
System.out.println("数据插入成功");
}else {
System.out.println("数据插入失败");
}
//8.释放资源
connection.close();
preparedStatement.close();
}
/**
* 目标:查询所有用户数据,并且封装到一个 List<Map> List集合中
* 结果集:
* 行 id account password nickname
* 行 id account password nickname
* 行 id account password nickname
* 行 id account password nickname
* 数据库 -> resultSet -> java -> 一行 - map(key = 列名, value = 列的内容) -> List<Map> list
* 实现思路:
* 遍历行数据,一行对应一个map,获取一行的列名和对应的列的属性,装配即可
* 将map装到一个集合
*难点:
* 如何获取列的名称?
*/
@Test
public void testSelect() throws SQLException, ClassNotFoundException {
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接
Connection connection = DriverManager.getConnection("jdbc:mysql:///atguigu", "root", "123456");
//3.编写SQL语句结构,动态值使用 ? 代替
String sql = "select * from t_user";
//4.创建preparedStatement,并且传入SQL语句
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//5.占位符赋值 -- 没有占位符
//6.发送SQL语句
ResultSet resultSet = preparedStatement.executeQuery();
//7.输出结果
List<Map> list = new ArrayList<Map>();
//自动遍历列
//获取列的信息对象
//TODO metaData对象 装的当前结果集中列的信息对象(可以获取列的数量、列的名称)
ResultSetMetaData metaData = resultSet.getMetaData();
//知道列数后,就可以通过下标水平遍历列
int columnCount = metaData.getColumnCount();
while (resultSet.next()) {
Map map = new HashMap();
//一行数据 对应一个 map
//纯手动取值
// map.put("id", resultSet.getObject("id"));
// map.put("account", resultSet.getObject("account"));
// map.put("password", resultSet.getObject("password"));
// map.put("nickname", resultSet.getObject("nickname"));
//自动遍历列,注意 列的下标从1开始
for (int i = 1; i <= columnCount; i++) {
//获取当前列指定下标的值
Object value = resultSet.getObject(i);
//根据下标获取列名
String columnLabel = metaData.getColumnLabel(i);
//将 列名 - 列值 传入一个map
map.put(columnLabel,value);
}
//一行数据的所有列全部存到了map中
//将map存储到集合中即可
list.add(map);
}
System.out.println("list = " + list);
//8.释放资源
connection.close();
preparedStatement.close();
}
@Test
public void testUpdate() throws ClassNotFoundException, SQLException {
/**
* 修改 id = 3 的用户 nickname = "haha"
*/
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接
Connection connection = DriverManager.getConnection("jdbc:mysql:///atguigu", "root", "123456");
//3.编写SQL语句结构,动态值使用 ? 代替
String sql = "update t_user set nickname =? where id =?";
//4.创建preparedStatement,并且传入SQL语句
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//5.占位符赋值
preparedStatement.setObject(1, "haha");
preparedStatement.setObject(2, 3);
//6.发送SQL语句
int rows = preparedStatement.executeUpdate();
//7.输出结果
if(rows > 0) {
System.out.println("数据修改成功");
}else {
System.out.println("数据修改失败");
}
//8.释放资源
connection.close();
preparedStatement.close();
}
@Test
public void testDelete() throws ClassNotFoundException, SQLException {
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接
Connection connection = DriverManager.getConnection("jdbc:mysql:///atguigu", "root", "123456");
//3.编写SQL语句结构,动态值使用 ? 代替
String sql = "delete from t_user where id = ?";
//4.创建preparedStatement,并且传入SQL语句
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//5.占位符赋值
preparedStatement.setObject(1, 3);
//6.发送SQL语句
int rows = preparedStatement.executeUpdate();
//7.输出结果
if(rows > 0) {
System.out.println("数据删除成功");
}else {
System.out.println("数据删除失败");
}
//8.释放资源
connection.close();
preparedStatement.close();
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 在鹅厂做java开发是什么体验
· 百万级群聊的设计实践
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
· 永远不要相信用户的输入:从 SQL 注入攻防看输入验证的重要性
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析