我是靠谱客的博主 温婉钢铁侠,这篇文章主要介绍JDBC--连接数据库,查询数据库表中的记录1.正文2.查询数据库表中记录4.完成增删改查--使用PreparedStatement,现在分享给大家,希望可以做个参考。

1.正文

1. 查询数据库表中记录。
2. sql注入问题
3. 抽取实体类与表对应
4. 抽取操作类对表进行操作。

2.查询数据库表中记录

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@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根据条件查询

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//根据条件查询数据库 @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注入的安全问题:

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//演示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注入的问题。

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
//演示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

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
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--连接数据库,查询数据库表中内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(62)

评论列表共有 0 条评论

立即
投稿
返回
顶部