MySQL之JDBC(一)+https://developer.aliyun.com/article/1413550
2.和数据库建立连接
代码
// 2.和数据库服务器建立连接 连接好了之后才能进行后序的 "请求--响应" 操作 Connection connection = dataSource.getConnection();// 此处会报错 需要抛出异常 直接使用throws进行抛出
注意处理异常
此处要注意选择正确的Connection接口
3.构造sql
构造sql就是将sql命令使用字符串的形式存储到一个字符串变量中,再进行预处理
// 3.构造sql sql语句最后不需要再去添加; 命令行的时候添加; String sql = "insert into student values(3,'张三')"; PreparedStatement statement = connection.prepareStatement(sql);
为什么我们要进行sql语句预处理呢?其实也有办法直接让服务器去执行,但是服务器会对传入的字符串进行解析,校验,且传入的字符串可能出现语法错误
进行预处理相当于提前进行检查,会对传入字符串进行解析,校验,看有没有错误的地方,并将字符串解析为结构化数据,这样服务器就不需要再去解析,校验,增加了效率
4.发送给服务器,执行sql
通过预处理过后的语句statement向数据库传递数据
代码
// 4. 将sql发送给服务器 执行sql int n = statement.executeUpdate(); System.out.println(n);
这里的n是什么呢?在命令行中,如果我们执行插入的操作,最后会返回有几行受到影响,此处的n就是用于接收收到影响的行数
最常用的两种方法
代码
// 将id为3的人的名字设置为王五 String sql2 = "update student set name = '王五' where id = 1"; PreparedStatement statement2 = connection.prepareStatement(sql2);
5.释放资源
程序通过代码和数据库建立通信,是需要消耗软件/硬件资源的,,当你不再使用数据库时,要把利用的资源返还(好借好还么)
statement.close(); connection.close();
四.利用jdbc进行数据库的查询操作
数据库的查询操作和插入等略有不同,原因在于查询操作的返回值不是简单的数字,而是一个结果集,拿到结果集之后还要进行遍历,打印
public static void main(String[] args) throws SQLException { // 1.创建数据源 DataSource dataSource = new MysqlDataSource(); ((MysqlDataSource) dataSource).setURL("jdbc:mysql://127.0.0.1:3306/java109?characterEncoding+utf8&useSSL=false"); ((MysqlDataSource) dataSource).setUser("root"); ((MysqlDataSource) dataSource).setPassword("123456"); // 2建立连接 Connection connection = dataSource.getConnection(); // 3.构造sql语句 String sql = "select * from student"; PreparedStatement statement = connection.prepareStatement(sql); // 4.执行sql 和update不同 此处应该使用executeQuery()方法 ResultSet resultSet = statement.executeQuery(); // 5.遍历打印结果集 resutlSet最开始指向的第0行 就是列名那一行 应该从她的下一行打印 也就是数据的第一行 while(resultSet.next()) { int id = resultSet.getInt("id"); String name = resultSet.getString("name"); System.out.println("id = " + id + " ,name = " + name); } // 6.释放资源 注意释放顺序 resultSet.close(); statement.close(); connection.close(); }
运行结果
关于结果集的一些补充:
1.结果集ResultSet是executeQuery的返回值,它本质上是一个接口,但实际上返回的是由驱动程序提供的一个实现了ResultSet的类(接口不能直接实例化)
具体提供的是哪一个具体的类呢? 对于MySQL JDBC驱动程序,在执行 executeQuery
后,返回的是 com.mysql.cj.jdbc.result.ResultSetImpl
的实例,这是MySQL Connector/J 驱动中的一个具体类,用于实现 ResultSet
接口并提供了与MySQL数据库交互的功能。
ResultSet resultSet = statement.executeQuery();
在执行完上述代码之后,变量resultSet中会存放 com.mysql.cj.jdbc.result.ResultSetImpl
的实例,允许你进行查询操作
2.遍历循环打印的逻辑是什么?
逻辑可以想象成一个光标从上至下对表进行遍历
五.补充:
1."?"占位符
在插入语句里面我们把内容写死了,哪能不能让用户自己输入要插入的内容呢?答案是可以的
可以使用JDBC中的占位符 ?
2.详细解释为什么不能传递字符串类型的sql语句
在jdbc编程中不能传递字符串类型的SQL语句主要出于安全和性能两方面进行考虑
安全上:传递字符串类型的SQL语句引发SQL注入,SQL注入是一种常见的SQL中的漏洞。用户可能传递恶意的代码(尤其是字符串拼接容易发生)来使数据库执行未经授权的操作,从而给数据库服务器带来危险
性能上:使用预编译语句能够提高性能。预编译是指将SQL语句进行预编译处理,并将其存储到数据库服务器之中,下次使用时只需传递参数即可,提高了执行的效率。通过预编译,可以减少数据库对SQL的检查和解析,提高了效率