一、sql七步曲
1.七步曲
1.手动加载数据库驱动类
2.获得数据库连接对象
3.写sql语句
4.获得执行对象
5.执行命令同时获得结果
6.处理结果
7.关闭资源
2.DVD数据库中的表的设计详情:
二、增
以DVD为例,向表中新增一个DVD对象
public static void addDVD() throws ClassNotFoundException, SQLException {
Scanner input = new Scanner(System.in);
//1.手动加载数据库驱动类
Class.forName("com.mysql.cj.jdbc.Driver");
//2.建立数据库连接
String username = "root";
String password = "root";
String url = "jdbc:mysql://localhost:3306/jr?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";
Connection con = DriverManager.getConnection(url,username,password);
//3.写sql语句
String sql = "insert into dvd(name,state,money,count)value (?,'可借',?,0)";
//4.获得执行对象
PreparedStatement ps = con.prepareStatement(sql);
System.out.println("请输入新增DVD的名称:");
String name = input.next();
System.out.println("请输入新增DVD的日租金:");
double money = input.nextDouble();
ps.setString(1,name); //设置sql语句中的?的值,1,2是指在sql语句中的第几个问号,后面的就是对应的值
ps.setDouble(2,money);
//5.执行sql语句并获取结果(i为表中有变动的数量,例如这个新增,那在表中会多出来一行数据,有变动的数量就是1)
int i = ps.executeUpdate();
//6.处理结果:
if (i == 1){
System.out.println("添加成功!");
}else{
System.out.println("添加失败!");
}
//7.关闭连接源(和IO流关闭原则一样,先开的后关)
ps.close();
con.close();
}
三、删
以DVD为例,对表进行一个删除其中DVD对象的操作
public static void delDVD() throws SQLException, ClassNotFoundException {
Scanner input = new Scanner(System.in);
//1.手动加载数据库驱动类
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获得数据库连接对象
String username = "root";
String password = "root";
String url = "jdbc:mysql://localhost:3306/jr?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";
Connection con = DriverManager.getConnection(url,username,password);
//3.写sql语句
String sql = "delete from dvd where name=?";
//4.获得执行对象
PreparedStatement ps = con.prepareStatement(sql);
System.out.println("请输入要删除DVD的名字:");
String name = input.next();
ps.setString(1,name);
//5.执行命令同时获得结果
int i = ps.executeUpdate();
//6.处理结果
if (i > 0){
System.out.println("删除DVD成功!");
}else{
System.out.println("删除DVD失败!");
}
//7.关闭资源
ps.close();
con.close();
}
四、改
以DVD为例,向表中修改一个DVD对象的数据
public static void update() throws ClassNotFoundException, SQLException {
Scanner input = new Scanner(System.in);
//1.手动加载数据库驱动类:
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获得数据库连接对象
String username = "root";
String password = "root";
String url = "jdbc:mysql://localhost:3306/jr?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";
Connection con = DriverManager.getConnection(url,username,password);
//3.写sql语句
String sql = "update dvd set state = ?,lendDate = ?,count = count+1 where name = ?";
System.out.println("请输入要修改的DVD名称:");
String name = input.next();
System.out.println("请输入修改后的状态:");
String state = input.next();
System.out.println("请输入修改后的时间:");
String date = input.next();
//4.获得执行对象
PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1,state);
ps.setString(2,date);
ps.setString(3,name);
//5.执行命令同时获得结果:
int i = ps.executeUpdate();
//6.处理结果:
if (i > 0){
System.out.println("修改成功!");
}else{
System.out.println("修改失败!");
}
//7.关闭资源
ps.close();
con.close();
}
五、查
以DVD为例,对表进行一个查看的操作
public static void getDt() throws SQLException, ClassNotFoundException {
//1.手动加载数据库驱动类:
Class.forName("com.mysql.cj.jdbc.Driver");
//2.建立与数据库的连接
String username = "root";
String password = "root";
String url = "jdbc:mysql://localhost:3306/jr?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";
Connection con = DriverManager.getConnection(url,username,password);
System.out.println(con);
//3.写sql语句
String sql = "select * from dvd";
//4.获得执行对象:
PreparedStatement ps = con.prepareStatement(sql);
//5.执行sql命令 同时获得结果
ResultSet rs = ps.executeQuery();
//6.处理结果
System.out.println("编号\t名称\t状态\t租金\t借出日期\t借出次数");
while (rs.next()){
System.out.println(rs.getInt("id") + ";" + rs.getString(2)
+ ";" + rs.getString(3) + ";" + rs.getDouble(4)
+ ";" + rs.getString(5) + ";" + rs.getInt(6));
}
//7.关闭所有连接资源
rs.close();
ps.close();
con.close();
}
六、方法优化1–非查找
在上面的操作过程中我们可以看到,其中只有sql语句不同,和结果处理需要差异化,其他的都大致相同,那么我们将不含有rs对象的也就是不进行查找的几种方法整合一下,提取出一个通用的方法
//非查看操作的方法
public int fckSQL(Object... objects) throws ClassNotFoundException, SQLException {
//利用可变参数控制传入的数据,根据具体情况具体分析要传入几个参数,因为参数类型不一致,所以使用了object类型
//传入的第一条数据为sql语句
//1.手动加载数据库驱动类
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获得数据库连接对象
String username = "root";
String password = "root";
String url = "jdbc:mysql://localhost:3306/jr?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";
Connection con = DriverManager.getConnection(url,username,password);
//3.写sql语句
String sql = (String) objects[0];//这里使用了可变参的第一个参数,sql语句
//4.获得执行对象
PreparedStatement ps = con.prepareStatement(sql);
for (int i = 1;i < objects.length;i++){ //通过一个循环,对sql语句中的?进行赋值
ps.setObject(i,objects[i]);
}
//5.执行sql语句并获取结果
int i = ps.executeUpdate();
//6.把结果返回出去,差异化处理
//7.关闭资源
ps.close();
con.close();
return i;
//最后根据返回到手里的i进行差异化结果处理
}
以DVD为例,使用优化后的新增方法代码如下:
public void add() throws SQLException, ClassNotFoundException {
String sql = "insert into dvd(name,state,money,count)value (?,'可借',?,0)";
System.out.println("请输入新增DVD的名称:");
String name = input.next();
System.out.println("请输入新增DVD的日租金:");
double money = input.nextDouble();
int i =fckSQL(sql,name,money);
//6.处理结果:
if (i > 0){
System.out.println("添加成功!!");
}else{
System.out.println("添加失败!");
}
}
这样我们的代码非常简洁,只需要短短几行就代替了七步曲
七、方法优化2–查找
在我们开过日常中,往往有进行筛选,查找的操作不会直接操作表,是将筛选完的结果放入集合中再操作集合,这里我就用其中一种方法演示一下这种优化的思路
//查找符合条件的放入集合
public ArrayList<dvdEntry> ckSQL(Object... objects) throws ClassNotFoundException, SQLException {
//返回值类型是一个集合,泛型是自己定义的一个类,与表的设计模式中的属性一致的类
ArrayList<dvdEntry> list = new ArrayList<>();
//1.手动加载数据库驱动类
Class.forName("com.mysql.cj.jdbc.Driver");
//2.获得数据库连接对象
String username = "root";
String password = "root";
String url = "jdbc:mysql://localhost:3306/jr?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";
Connection con = DriverManager.getConnection(url,username,password);
//3.写sql语句
String sql = (String) objects[0];
//4.获得执行对象
PreparedStatement ps = con.prepareStatement(sql);
for (int i = 1;i < objects.length;i++){
ps.setObject(i,objects[i]);
}
//5.执行sql命令 同时获得结果
ResultSet rs = ps.executeQuery();
//6.处理结果
while (rs.next()){
list.add(new dvdEntry(rs.getInt(1),rs.getString(2),rs.getString(3),
rs.getDouble(4),rs.getString(5),rs.getInt(6)));
}
//7.关闭资源
rs.close();
ps.close();
con.close();
return list;
}
直接用例子体会一下:
以DVD为例,使用优化后的查看方法代码如下:
public void see() throws SQLException, ClassNotFoundException{
String sql = "select * from dvd";
ArrayList<dvdEntry> list = ckSQL(sql);
ListIterator lit = list.listIterator();
while (lit.hasNext()){
System.out.println(lit.next().toString());
}
}
总结
以上的内容就是数据库中的增删改查以及提取出的通用方法,在开发过程中注意灵活使用,有了通用方法之后,只需要记住sql语句就好了。