package com.shayiheng.api.preparedstatement;
import com.sun.glass.ui.Clipboard;
import org.junit.Test;
import java.sql.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* 4
* @Author Tom
* Description: 使用preparedstatement进行t_user表的curd动作
* 1.注册驱动
* 方案一
* DriverManager.registerDriver(new com.mysql.cj.jdbc.Driver());
* 方案二
* class.forName("com.mysql.cj.jdbc.Driver")
* 2.获取连接
* Connection connection=DriverManager.getConnection();
* 3(String url,String user,String password)
* 2(Srting url,Properties info(user password))
* 1(String url?user=账号&password=密码)
*
* 3.编写SQL语句
* //静态
* Statement statement=connection.createStatement();
* //预编译
* PreparedStatement preparedstatement= connection.preparedStatement(sql语句)
* 4.占位符赋值
* preparedstatement.setObject(?的位置 从左到右 从1开始,值)
* 5.发送SQL语句,并获取结果
* int rows=excuteUpdate();//非DQL
* Resultset=excuteQuery();//DQL
*
* 6.查询结果解析
* 移动光标指向行数据 next(); if(next()) while(next())
* 获取列的数据即可 get类型(int 列的下角标 从1开始 | int 列的label(别名或者列名))
* 获取列的信息 getMetadate();ResultsetMetaData对象 包含的就是列的信息
* getColumnCount(); getCloumnLebal(index)
* 7.关闭资源
* close();
*/
public class PSCURDPart {
//导入juint的测试包
@Test
public void testInsert() throws ClassNotFoundException, SQLException {
/**
* t_user插入一条数据!
* account test
* password test
* nickname 二狗子
*/
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接
Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/shayiheng?user=root&password=12345678");
//3.编写SQL语句结果,动态的部分使用?代替
String sql = "INSERT INTO t_user(account, PASSWORD,nickname)VALUES(?,?,?);";
//4.创建预编译preparedStatement,并且传入SQL语句结果
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//5.占位符赋值
preparedStatement.setObject(1,"test3");
preparedStatement.setObject(2,"test");
preparedStatement.setObject(3,"二狗子");
//6.发送SQL语句
//DML类型
int rows=preparedStatement.executeUpdate();
//7.输出结果
if (rows>0) System.out.println("插入成功");
else System.out.println("插入失败");
//8.关闭资源
preparedStatement.close();
connection.close();
}
@Test
public void testUpdate() throws SQLException, ClassNotFoundException {
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接
Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/shayiheng?user=root&password=12345678");
//3.编写SQL语句结果,动态的部分使用?代替
String sql = "UPDATE t_user SET account=?,PASSWORD=?,nickname=?WHERE id=?;";
//4.创建预编译preparedStatement,并且传入SQL语句结果
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//5.占位符赋值
preparedStatement.setObject(1,"test2");
preparedStatement.setObject(2,"test1");
preparedStatement.setObject(3,"二狗子1");
preparedStatement.setObject(4,4);
//6.发送SQL语句
//DML类型
int rows=preparedStatement.executeUpdate();
//7.输出结果
if (rows>0) System.out.println("修改成功");
else System.out.println("修改失败");
//8.关闭资源
preparedStatement.close();
connection.close();
}
@Test
public void testDelete() throws SQLException, ClassNotFoundException {
//1.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获取连接
Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/shayiheng?user=root&password=12345678");
//3.编写SQL语句结果,动态的部分使用?代替
String sql = "DELETE FROM t_user WHERE id=?;";
//4.创建预编译preparedStatement,并且传入SQL语句结果
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//5.占位符赋值
preparedStatement.setObject(1,4);
//6.发送SQL语句
//DML类型
int rows=preparedStatement.executeUpdate();
//7.输出结果
if (rows>0) System.out.println("删除成功");
//8.关闭资源
preparedStatement.close();
connection.close();
}
/**
*目标:查询所有用户数据,并且封装到一个List<Map>list集合!
*
* 解释:
* 行 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://127.0.0.1:3306/shayiheng?user=root&password=12345678");
//3.编写SQL语句结果,动态的部分使用?代替
String sql = "SELECT * FROM t_user;";
//4.创建预编译preparedStatement,并且传入SQL语句结果
PreparedStatement preparedStatement = connection.prepareStatement(sql);
//5.占位符赋值
//preparedStatement.setObject(1,3);
//6.发送SQL语句
//DQL类型
ResultSet resultSet = preparedStatement.executeQuery();
//7.输出结果
/**
* TODO:回顾
* resultSet: 有行和有列!获取数据的时候,一行一行数据!
* 内部又一个游标,默认指向数据的第一行之前!
* 我们可以利用next()方法移动游标!指向数据行!
* 获取行中的列的数据
*/
List <Map> list=new ArrayList<>();
//获取列的信息对象
//TODO:metaData 装的是当前结果集列的信息对象!(可以获取列的名称根据下表,也可以获取列的数量)
ResultSetMetaData metaData = resultSet.getMetaData();
//水平遍历列(获取一共有多少列)
int columnCount = metaData.getColumnCount();
while (resultSet.next()){
Map map=new HashMap();
//一行数据 对应一个map
// map.put("id",resultSet.getInt(1));
// map.put("account", resultSet.getString(2));
// map.put("password", resultSet.getString(3));
// map.put("nickname", resultSet.getString(4));
//自动遍历列,注意要从1开始,并且小于等于总列数!
for (int i =1; i <=columnCount; i++) {
//获取指定列下角标的值! 列的值
Object value = resultSet.getObject(i);
//获取指定列下角标的列的名称!ResultSetMetaData
//select * [列名] |xxx_xxx_xx_123 as name
//getColumnLabel:会获取别名,如果没有写别名才是列的名称 不要使用getColumnName : 只会获取列的名称
// 列的名称
String columnLabel = metaData.getColumnLabel(i);
map.put(columnLabel,value);
}
list.add(map);
}
System.out.println("list ="+list);
//8.关闭资源
resultSet.close();
preparedStatement.close();
connection.close();
}
}
JDBC学习笔记第四篇
于 2023-12-21 16:53:59 首次发布