Statement和PreparedStatement的区别及封装的好处


Statement 和 PreparedStatement之间的关系和区别.


关系:PreparedStatement继承自Statement,都是接口
区别:

1.PreparedStatement是预编译的,对于批量处理可以大大 提高效率. 也叫JDBC存储过程
2.使用 Statement 对象。在对数据库只执行一次性存取的时侯,用 Statement 对象进行处理。PreparedStatement 对象的开销比Statement大,对于一次性操作并不会带来额外的好处。
3.statement每次执行sql语句,相关数据库都要执行sql语句的编译,preparedstatement是预编译得, preparedstatement支持批处理
4.执行许多SQL语句的JDBC程序产生大量的Statement和PreparedStatement对象。通常认为PreparedStatement对象比Statement对象更有效,特别是如果带有不同参数的同一SQL语句被多次执行的时候。PreparedStatement对象允许数据库预编译SQL语句,这样在随后的运行中可以节省时间并增加代码的可读性。
5.PreparedStatement可重复使用,提高效率;另外还可防止注入攻击,例如用户登录的时候查询SQL拼装语句为:
String sql = “select * from tb_user where name = '” + username + “’ and password = '” + password + “’”;
假如程序中没有进行必要的输入合法性检测,别有用心的人在用户名栏输入:abc’ or ‘1’='1,在密码栏输入:123,则拼装后的SQL语句为:select * from tb_user where name = ‘abc’ or ‘1’=‘1’ and password = ‘123’,则此语句永远都能正确执行,从而实现注入方式攻击。如果使用PreparedStatement,则会将输入的内容全部解析为字符串,而不会出现此漏洞。
String sql = “select * from tb_user where name = ? and password = ?”;

2.面向对象封装
1面向对象:更强调解决问题的主体,更强调谁来解决这个问题,更强调的是对象,面向对象的编程思路:自顶向上,不断拼装
2.封装,它也是面向对象思想的特征之一。面向对象共有三个特征:封装,继承,多态。

封装的好处:
1.提高代码的复用性
2.隐藏了实现细节,还对外提供了可访问的方式,便于调用者使用。
3.提高了安全性。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个示例代码,可以通过用户名和密码查询数据库,并将结果封装为具有`username`和`password`属性的实体类对象,然后将对象存入集合中: ```java import java.sql.*; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { List<User> userList = new ArrayList<>(); // 数据库连接信息 String url = "jdbc:mysql://localhost:3306/mydatabase"; String username = "your_username"; String password = "your_password"; try { // 加载数据库驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 建立数据库连接 Connection connection = DriverManager.getConnection(url, username, password); // 创建查询语句 String query = "SELECT username, password FROM users WHERE username = ? AND password = ?"; PreparedStatement statement = connection.prepareStatement(query); // 设置查询参数 statement.setString(1, "your_username"); statement.setString(2, "your_password"); // 执行查询 ResultSet resultSet = statement.executeQuery(); // 遍历结果集 while (resultSet.next()) { // 获取查询结果 String usernameResult = resultSet.getString("username"); String passwordResult = resultSet.getString("password"); // 创建实体类对象并设置属性 User user = new User(); user.setUsername(usernameResult); user.setPassword(passwordResult); // 将对象存入集合 userList.add(user); } // 关闭连接 resultSet.close(); statement.close(); connection.close(); } catch (Exception e) { e.printStackTrace(); } // 非空验证 if (!userList.isEmpty()) { System.out.println("查询结果非空"); } else { System.out.println("查询结果为空"); } } } class User { private String username; private String password; // 省略构造方法和Getter/Setter方法 } ``` 请将代码中的`your_username`和`your_password`替换为实际的用户名和密码。此示例使用了MySQL数据库,你需要根据自己的数据库类型和连接信息进行相应的更改。这段代码会执行查询,并将查询结果封装为`User`对象存入`userList`集合中,最后进行非空验证。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值