概述
1.正文
1. 查询数据库表中记录。
2. sql注入问题
3. 抽取实体类与表对应
4. 抽取操作类对表进行操作。
2.查询数据库表中记录
@Test //理解为main函数。可以独立运行。
public void testQuery() throws Exception { //抛出异常只是为了操作方便。真正在开发时应该try--catch
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection
("jdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Shanghai", "root", "root");
Statement statement = conn.createStatement();
String sql = "select id,name,age,address from t_student";
//执行查询sql语句 并把数据库表中记录返回到ResultSet对象中进行保存。
ResultSet rs = statement.executeQuery(sql);
//取出ResultSet中表的记录。rs.next() 判断指针是否可以移动。如果可以移动则返回true,否则返回false
while (rs.next()) {
int id = rs.getInt("id"); //指针移动并获取指定列的值。
String name = rs.getString("name");
String address=rs.getString("address");
int age=rs.getInt("age");
System.out.println("id:"+id+";name:"+name+";age:"+age+";address:"+address);
}
}
分析查询:
容易出现的错误:
查询时没有查找names该列。
2.2根据条件查询
//根据条件查询数据库
@Test
public void testQueryByCondition() throws Exception{
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection
("jdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Shanghai", "root", "root");
Statement statement = conn.createStatement();
String sql="select * from t_student where id=3";
ResultSet rs = statement.executeQuery(sql);
while (rs.next()){
int id = rs.getInt("id"); //指针移动并获取指定列的值。
String name = rs.getString("name");
String address=rs.getString("address");
int age=rs.getInt("age");
System.out.println("id:"+id+";name:"+name+";age:"+age+";address:"+address);
}
}
3.sql注入安全问题
演示sql注入的安全问题:
//演示sql注入的安全问题
public static void main(String [] args) throws Exception{
Scanner scanner=new Scanner(System.in); //Scanner类有没有讲过。
System.out.print("请输入账号:");
String username = scanner.nextLine();
System.out.print("请输入密码:");
String password = scanner.nextLine(); //你输入的账号和密码 nextLine() 可以输入空格 回车任认为结束 next()输入空格后认为输入结束。
boolean b = sqlSafe(username, password);
}
//根据name查询数据 abc 演示的根据账号和密码查询数据库表记录 如果能查询表示登录成功 否则登录失败
private static boolean sqlSafe(String name,String password) throws Exception{
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection
("jdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Shanghai", "root", "root");
Statement statement = conn.createStatement();
//这里的admin 是不是一个死数据 123456 也是一个死数据
String sql="select * from t_user where username='"+name+"' and password='"+password+"'";
System.out.println(sql);
ResultSet rs = statement.executeQuery(sql);
while (rs.next()){
System.out.println("登录成功");
return true;
}
System.out.println("登录失败");
return false;
}
可以发现: 你的账号可以随便输入 你的密码也可以随便输入 但是 在输入密码时 or '4'='4 只要这个条件成立,那么你就能登录成功。 这个就是sql注入的安全问题。只要根据条件做sql。那么就会出现sql注入安全问题。
如何解决sql安全注入问题:
1. 前端做校验: --只防君子 防不了小人。
2. 后端也做校验:--难道以后每次写功能都进行校验吗? 代码变得复杂了。
3. 执行sql的类Statement出现了问题,后期PrepareStatement该类来解决sql注入安全问题。Statement和PrepareStatement区别?
Statement会出现sql注入安全问题。Preparestatement不会出现sql注入安全问题。
Preparestatement是Statement的子类。就是因为早期使用Statement发现该类出现问题,后期维护人员创建Statement的子类来解决这个问题。注意:维护人员不会再原类上做维护,
3.2 使用prepareStatement来解决sql注入的问题。
//演示sql注入的安全问题
public static void main(String [] args) throws Exception{
Scanner scanner=new Scanner(System.in); //Scanner类有没有讲过。
System.out.print("请输入账号:");
String username = scanner.nextLine();
System.out.print("请输入密码:");
String password = scanner.nextLine(); //你输入的账号和密码 nextLine() 可以输入空格 回车任认为结束 next()输入空格后认为输入结束。
boolean b = sqlSafe02(username, password);
}
private static boolean sqlSafe02(String name,String password) throws Exception{
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection
("jdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Shanghai", "root", "root");
//使用PrepareStatement 这里的? 是占位符。
String sql="select * from t_user where username=? and password=?";
PreparedStatement ps = conn.prepareStatement(sql);//预编译sql
//为占位符赋值。根据占位符的类型使用不同的方法来赋值
ps.setString(1,name); //1表示第一个占位符 name:表示第一个占位符的值
ps.setString(2,password);
//执行sql语句
ResultSet rs = ps.executeQuery();
while (rs.next()){
System.out.println("登录成功");
return true;
}
System.out.println("登录失败");
return false;
}
PrepareStatement和Statement这两个类在代码上的区别?
以后都使用PreparedStatement这个类。
表示没有为占位符赋值。
4.完成增删改查--使用PreparedStatement
package test2;
import org.junit.Test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
/**
* @unthor : YSH
* @date : 19:50 2022/5/5
*/
public class Test5 {
//增加操作
@Test
public void testInsert() throws Exception{
Class.forName("com.mysql.cj.jdbc.Driver");
Connection connection = DriverManager.getConnection
("jdbc:mysql://localhost:3306/student0424_2?serverTimezone=Asia/Shanghai","root","root");
String sql = "insert into t_stu values (null,?,?)";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setObject(1,"张无忌");
ps.setObject(2,1);
ps.executeUpdate();
}
//删除操作
@Test
public void testDelete() throws Exception{
Class.forName("com.mysql.cj.jdbc.Driver");
Connection connection = DriverManager.getConnection
("jdbc:mysql://localhost:3306/student0424_2?serverTimezone=Asia/Shanghai","root","root");
String sql = "delete from t_stu where sid=?";
PreparedStatement ps = connection.prepareStatement(sql);
ps.setObject(1,10);
ps.executeUpdate();
}
//修改操作
@Test
public void testUpdate() throws Exception{
Class.forName("com.mysql.cj.jdbc.Driver");
Connection connection = DriverManager.getConnection
("jdbc:mysql://localhost:3306/student0424_2?serverTimezone=Asia/Shanghai","root","root");
String sql ="update t_stu set sname = '杨过' where sid =?";
PreparedStatement ps= connection.prepareStatement(sql);
ps.setObject(1,11);
ps.executeUpdate();
}
//查询操作
@Test
public void testQuery() throws Exception{
Class.forName("com.mysql.cj.jdbc.Driver");
Connection connection = DriverManager.getConnection
("jdbc:mysql://localhost:3306/student0424_2?serverTimezone=Asia/Shanghai","root","root");
String sql ="select * from t_stu where sid=?";
PreparedStatement ps= connection.prepareStatement(sql);
ps.setObject(1,8);
ResultSet rs = ps.executeQuery();
while(rs.next()){
int sid=rs.getInt("sid");
String sname=rs.getString("sname");
int classid=rs.getInt("classid");
System.out.println(sid+"t"+sname+"t"+classid);
}
}
}
最后
以上就是温婉钢铁侠为你收集整理的JDBC--连接数据库,查询数据库表中的记录1.正文2.查询数据库表中记录4.完成增删改查--使用PreparedStatement的全部内容,希望文章能够帮你解决JDBC--连接数据库,查询数据库表中的记录1.正文2.查询数据库表中记录4.完成增删改查--使用PreparedStatement所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复