目录
一、JDBC
1:为什么要学习JDBC技术
2、JDBC技术概述与理解
3、JDBC使用步骤分析
3.1、注册驱动
3.2 、获取连接
3.3、创建发送sql语句对象
3.4、发送sql语句
3.5、结果集解析
3.6、资源关闭
一、JDBC
1:为什么要学习JDBC技术
1、Java和数据库的必要纽带。
2、数据库层框架底层原理,原生态的jdbc技术对数据库操作会显得有些笨拙,所以我们会选择第三方数据库框架进行数据库操作,例mybatis、hibernate、springdatajpa,这些都是应用层的框架,底层原理都是对jdbc操作的封装。
2、JDBC技术概述与理解
总结: Jdbc是java连接数据库技术的统称 jdbc是由两部分组成:
一、是Java提供的规范(接口) 二、是各个数据库厂商的实现驱动jar包! Jdbc技术是一种典型的面向接口编程!
3、JDBC使用步骤分析
1、注册驱动
2、获取连接
3、创建发送sql语句对象
4、发送sql语句,并获取返回结果
5、结果集解析
6、资源关闭
3.1、注册驱动
方式一:
DriverManager.registerDriver(new Driver());
方式二:
new Driver();
方式三:
Class.forName("com.mysql.cj.jdbc.Driver");
方式一相比于方式二和三,不好的地方在于注册了两次驱动,方式二三都只有一次驱动。
但是常用的是第三种方式,第二种方式过于固定化,相当于把代码写死了,更换数据库类型的时候还需要改代码。
第三种可以把字符串提取到外部的配置文件,后期只需要进行修改外部的配置文件即可。
3.2 、获取连接
Connection connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/jdbc", "XXX", "XXX");
其中包含三个参数:
第一个(url):格式为 jdbc:数据库类型://主机ip地址:数据库端口/数据库名
第二个(账号):连接的数据库账号
第三个(密码):该库的密码
其中第一个参数中若是ip地址和端口为127.0.0.1:3306默认值,则可以省略不写。格式入下:
Connection connection = DriverManager.getConnection("jdbc:mysql:///jdbc", "XXX", "XXX");
还有就是参数省略之后的格式(如下)。
(String url, String user, String password);
(String url, Properties info(user,password));
(String url?user=账号&password=密码);
3.3、创建发送sql语句对象
-
静态 statement
-
预编译 preparedstatement
Statement statement = connection.createStatement();// 创建statement
statement可以发送mysql语句并且返回结果。但是存在一些问题,所以只能处理没有动态值的语句。
-
statement用法。
-
1.创建statement
-
2.拼接sql语句
-
3.发送sql语句,返回执行结果。
-
-
statement缺点
-
1.sql语句需要字符串拼接比较麻烦。
-
2.只能拼接字符串类型,其它的数据库类型无法处理。
-
3.可能发生注入攻击(动态值充当语句结构)。
-
-
preparedstatement用法 :
-
1、编写sql语句结果,不包含动态值部分的语句,动态值的部分用’?‘代替。
-
2、创建preparedstatement,并且传入动态值。
-
3、动态值 占位符 赋值 ?单独赋值即可
-
4、发送sql语句
-
String sql = "select * from t_user where account = ? and password = ?;"; PreparedStatement preparedStatement = connection.prepareStatement(sql); preparedStatement.setObject(1, account); preparedStatement.setObject(2, password);
其中第一行是编写sql语句结果,然后第二行是创建一个预编译的statement并且设置sql语句结果,第三四行是讲对应的动态值传入,第一个参数是对应的下标,第二个是要传入的动态值。
3.4、发送sql语句
String sql = "select * from t_user where account = '" + account + "' and password = '" + password + "';";
int i = statement.executeUpdate(sql);
ResultSet resultSet = statement.executeQuery(sql);
其中第一行就相当于是讲sql语句用字符串拼起来,然后同过statement发送到数据库。
ResultSet resultSet = preparedStatement.executeQuery();
preparedstatement跟statement用法一样只不过不需要再传参数了。
通过返回值的不同有两种不同的写法,executeQuery可以用来接收查询语句返回的结果,ResultSet是结果封装对象。
3.5、结果集解析
只有查询语句的返回结果需要解析,其它语句就比较简单了,就是一个值。
-
单行 if(resultSet.next()) { }
-
多行 while(resultSet.next()) { }
while(resultSet.next()) { int id = resultSet.getInt(10); String account1 = resultSet.getString(2); String password1 = resultSet.getString(3); String nickname = resultSet.getString(4); System.out.println(id + "--" + account1 + "--" + password1 + "--" + nickname); }
其中resultSet.next()每次的返回值就是是否读到数据,若是没有读到数据则返回的是0,反之为1。
查询语句的返回结果也是一个有行有列的数据,resultSet.next(),相当于是每次读入该对象容器中的一行数据,然后resultSet.getInt()、resultSet.getString()就是获取读到的数据。括号里面的参数可以直接按下标,就是从1开始,或者可以直接可以填字段名。
但是这种方法就比较麻烦,而且格式固定了,不能适用于其它格式的数据,所以在这里引用了一个其它方法。
ResultSetMetaData metaData = resultSet.getMetaData();
通过这个metaData可以获取列的数量,以及列名,这样就可以用一个循环来读取一整行的数据了。
int columnCount = metaData.getColumnCount(); // 获取列的数量
String columnLabel = metaData.getColumnLabel( i ); // 可以获取第 i 列的名字,有别名取别名,没别名取列名。
String columnLabel = metaData.getColumnName( i ); // 只能获取名字,不能获取别名。
// 下面 就是一个完整的读取resultSet容器的方法。
List<Map> list = new ArrayList<>(); ResultSetMetaData metaData = resultSet.getMetaData();
int columnCount = metaData.getColumnCount();
while(resultSet.next()) { Map map = new HashMap();
for(int i = 1; i <= columnCount; i ++) { Object value = resultSet.getObject(i); String a = metaData.getColumnLabel(i); map.put(a, value); } list.add(map); } System.out.println("list" + list);
3.6、资源关闭
resultSet.close(); // 若不是查询语句就用不上该容器,就不用关闭该资源。 statement.close(); connection.close();
就是将前用的资源都关闭。