SQL语句常用方法及步骤
- 一、sql七步曲
- 1.七步曲
- 2.DVD数据库中的表的设计详情:
- 二、增
- 三、删
- 四、改
- 五、查
- 六、方法优化1--非查找
- 七、方法优化2--查找
- 总结
一、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语句就好了。