数据库--JDBC编程
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、什么是JDBC
- 二、JDBC的使用
- 代码实例
- 总结
前言
前面我们都是在MySQL的编辑界面上敲代码,而这节课我们就要把SQL代码在我们的Idea上进行编写。废话不多说开始我们的旅程!
提示:以下是本篇文章正文内容,下面案例可供参考
一、什么是JDBC
实际开发中,SQL是很少手动输入的,绝大部分的SQL都是通过代码,自动执行的,这个时候就需要让其他编程语言(本节是使用Java)来操作数据库。
 而MySQL是一个客户端/服务端架构的语言,根据MySQL提供API写个数据库客户端时非常容易的。
 比如Oracle,SQLServer,SQLite等数据库都有API。
 但是不同的数据库提供的API是不一样的,他们的开发团队不相同,所以API那么多,对于程序员的学习成本就越高,于是在Java的圈子里,就把这些API同一编程一套,指定成标准!就被称为JDBC。
 目前JDBC这套API已经成了Java标准库的一部分,由于Java的影响力还是很大的,以自身作为标准,各种数据库厂商,都提供了能够适应JDBC相关的驱动包!
 所以我们只需要掌握了JDBC这套API,无论操作哪个数据库,操作的代码都是不变的,基本相同。
 即JDBC最主要的就是屏蔽了不同数据库原生API之间的差异,
 而是使用了JDBC这一套API接口实现来规范了所有的数据库的编程操作。
二、JDBC的使用
JDBC这里的api看起来蛮多很复杂,但实际上都是固定套路,非常简单,多练就记住了。
- 描述数据库的连接和用户密码
 
 这样一段代码,就设置好了数据库服务器连接,要操作的数据库用户和密码。
 至于setURL这里面的字符串含义,我们下面也来一一解析:
**“jdbc:mysql”:**这个url是给jdbc中的MySQL
来使用的
**“127.0.0.1”:**服务器所在的IP地址,此处的IP时环回IP,表示主机自己。
**“3306”:**这个时端口号,MySQL安装时候配置的,默认时3306.
“javatest”::要访问的数据库名。
**“characterEncoding=utf8” :**描述了请求的字符编码方式,我的MySQL版本时8.0.33的,一般情况都是utf8
**“useSSL=false”:**关闭加密功能,这里不做展开介绍。
上述的内容,在后续讲述网络知识的时候,还会见到,这里只是简单的了解即可。
JDBC支持两种风格的代码,一种是DataSource,一种是DriverManger.
- DataSource 相比于DriverManger内置了数据库连接池,可以重复利用连接
(比如:线程池,字符串常量池……)- DriverManger使用的时候,需要借助反射,数据不常规的编程手段,博主文章中采用的是DataSource ,
想要看DriverManger.我会在最后的代码总结时展示
。
- 于数据库建立连接
 上述的操作,只是描述了数据库服务器在哪里,并没有真正建立起连接来,下面我们进行连接操作,才是真正开始通过网络去与数据库服务器进行通信。
 
- 构造SQL语句
 
 通过connection.prepareStatement方法构造出一个对象,PreparedStatement类型的,其实这个对象背后做了很多事,比如会对SQL语句进行一些预处理……
 上面的写法是直接写死了,如果是查询操作还好,那如果是要执行新增操作呢?也是直接写死吗?
 更多的时候,插入的数据是动态的,,那要怎么写呢?可以使用PerparedStatement来通过占位符替换的方式,从而实现动态SQL的构造:
 

这里每个?的位置都是通过1开始计算的,setString(1,sn)就是将第一个?位置的数据插入成sn(学号),后面的以此类推。
 构造出指定的SQL语句后,就可以通过statement这个引用来执行了。
- 执行SQL语句

 excuteQuery执行后,会返回一个结果集,如果是excuteUpdate则返回这个操作影响的几行。
- 遍历结果集
 
 
- 断开连接
 
 
- 依次释放资源,关闭连接
 
JDBC 使用步骤总结:
1.创建DataSource ->描述了数据库服务器在哪里(url,user,password)
2.建立连接; dataSource.getConnection();
3.拼装SQL语句
Statement或者Preparement
4.执行SQL execute方法/executQuery/execuUpdate
5.遍历结果集合
ResultSet,迭代器遍历
6.依次释放,关闭资源
1)ResultSet,2)Statement,3)Connection
JDBC在实际工作中,可能并不会直接使用,上述的代码大家也能看到,写起来还是比较麻烦的,因此就有了一些库和框架,针对JDBC进行了进一步的封装,让我们使用起来更方便,比如后续会学习到的Mybatis这种……
代码实例
//这是DataSourcepublic static void main(String[] args) {//1.定义MySQL数据源对象MysqlDataSource mysqlDataSource = new MysqlDataSource();//设置数据库连接mysqlDataSource.setURL("jdbc:mysql://127.0.0.1:3306/javatest?characterEncoding=utf8" +"&allowPublicKeyRetrieval=true&useSSL=false");//用户名mysqlDataSource.setUser("root");//密码mysqlDataSource.setPassword("Wm127369#");//定义JDBC的数据源对象DataSource dataSource = mysqlDataSource;//定义连接对象Connection connection = null;//定义预处理SQL执行对象PreparedStatement statement = null;//定义结果集ResultSet resultSet = null;try {//1通过数据源获取数据库连接connection = dataSource.getConnection();//2.获取预处理SQL执行对象//定义要执行的SQLString sql = "select student_id,sn,name,mail,class_id from student where name = ?";statement = connection.prepareStatement(sql);//接收用户的输入System.out.println("请输入学生的姓名:");Scanner scanner = new Scanner(System.in);String name = scanner.next();//3.用真实值替换占位符statement.setString(1,name);//4.执行SQL,获取结果集resultSet = statement.executeQuery();//5.遍历结果集while (resultSet.next()){long stuId = resultSet.getLong("student_id");String stuSn = resultSet.getString(2);String stuName = resultSet.getString(3);String stuMail = resultSet.getString(4);long classId = resultSet.getLong(5);System.out.println(MessageFormat.format("学生编号 = {0},学号 = {1},学生姓名{2},邮箱 = {3},班级编号 = {4}",stuId,stuSn,stuName,stuMail,classId));}}catch (SQLException e){e.printStackTrace();}finally {//依次释放资源,关闭连接if (resultSet !=null){try {resultSet.close();}catch ( SQLException e){e.printStackTrace();}}if (statement !=null){try {statement.close();}catch ( SQLException e){e.printStackTrace();}}if (connection !=null){try {connection.close();}catch ( SQLException e){e.printStackTrace();}}}}//这是DriverManagerpublic static void main(String[] args) {Connection connection = null;Statement statement = null;ResultSet resultSet =null;try {//1.加载数据库厂商提供的驱动Class.forName("com.mysql.cj.jdbc.Driver");//2.获取数据库连接connection = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/java113?characterEncoding=utf8" +"&allowPublicKeyRetrieval=true&useSSL=false", "root", "Wm127369#");//3.创建Statement对象statement = connection.createStatement();//4.定义SQL并执行SQL语句System.out.println("请输入学生姓名:");Scanner scanner = new Scanner(System.in);//接收用户输入String name = scanner.next();String sql = "select id,name,chinese,math,english from exam where name ='"+name + "'";statement.executeQuery(sql);//5.执行SQL,获取查询结果resultSet = statement.executeQuery(sql);//6.对结果进行遍历,获取结果集while (resultSet.next()){long stuId = resultSet.getLong(1);String stuName = resultSet.getString(2);float stuChinese = resultSet.getFloat(3);float stuMath = resultSet.getFloat(4);float stuEnglish = resultSet.getFloat(5);System.out.println(MessageFormat.format("学生编号={0},学生姓名 = {1}, 语文成绩 = {2},数学成绩 = {3},英语成绩 = {4}",stuId,stuName,stuChinese,stuMath,stuEnglish));}}catch (SQLException e){e.printStackTrace();} catch (ClassNotFoundException e) {throw new RuntimeException(e);}finally {//依次释放资源,关闭连接if (resultSet !=null){try {resultSet.close();}catch (SQLException e){e.printStackTrace();}}if (statement !=null){try {statement.close();}catch (SQLException e){e.printStackTrace();}}if ( connection !=null){try{connection.close();}catch (SQLException e){e.printStackTrace();}}}}
总结
其实JDBC并不难,就是几个固定的套路,如果是应付考试,还是需要直接多建几个表利用JDBC使用一些复杂查询,多练习练习,如果是工作中,用JDBC就不多了,会使用更方便的框架,如果你是一个很有想法的同学,可以基于JDBC进行修改,搭建一套属于直接的框架来……
 MySQL数据库基础就此结束!
