金州网站建设,网商城,济宁网站建设只要500元,网页搜索快捷键ctrl加什么JDBC是什么 JDBC就是Java DataBase Connectivity的缩写#xff0c;翻译过来就很好理解了#xff0c;就是java连接数据库。所以顾名思义#xff0c;JDBC就是一种用于执行SQL语句的JavaApl#xff0c;是Java中的数据库连接规范。为了可以方便的用Java连接各种数据库#xff…JDBC是什么 JDBC就是Java DataBase Connectivity的缩写翻译过来就很好理解了就是java连接数据库。所以顾名思义JDBC就是一种用于执行SQL语句的JavaApl是Java中的数据库连接规范。为了可以方便的用Java连接各种数据库给Java程序员操作数据库提供了一个标准的API不用因为使用了另一种数据库就要学习另一套API大大减少了学习和使用成本同时提高了代码的可移植性。 //就是通过java代码操作mysql数据库
JDBC原理
JDBC 为多种关系数据库提供了统一访问方式它主要包含一些通用的接口类。
下面我用画图的方式介绍一下JDBC的原理 首先由程序员开发Java应用再调用JDBC的相关的API就可以访问数据库的JDBC驱动程序然后通过驱动来进行一系列的数据库操作
//JDBC相关的API是由sun公司提供的相应的JDBC驱动则是由不同的数据库厂商提供
JDBC的使用 想要使用JDBC需要先安装对应的数据驱动包并且将jar包导入项目中(具体操作博主这里就不展示了如果有需要后续会专门出一篇博客来介绍相关操作) 当一切准备工作都做完了之后就可以使用JDBC进行一些操作了
创建数据源
再连接数据库之前我们要先找到数据库方法不止一种这里我介绍使用Datasource获取数据源
首先创建一个MysqlDatasource对象(DataSource是MysqlDatasource实现的一个借口这里使用到了向上转型)
DataSource dataSource new MysqlDataSource();
然后我们需要使用一些MysqlDatasource内特有的方法
((MysqlDataSource)dataSource).setUrl(jdbc:mysql://127.0.0.1:3306/test1?characterEncodingutf8useSSLfalse);
((MysqlDataSource)dataSource).setUser(root);
((MysqlDataSource)dataSource).setPassword(88*****8);
这些方法的意思我们暂且不管这里你是否有疑问我们明明要使用的是MysqlDatasource内特有的方法确使用向上转型这样不是反而不能使用这些方法了吗即使之后又向下转型将DataSource转为MysqlDatasource这样不是多此一举吗直接使用这种方法不也可以吗
MysqlDataSource mysqlDataSource new MysqlDataSource();
确实这样也是可以达成目的的但是我们在实际写代码中要尽量使我们的代码低耦合高内聚。
因为我们使用的是MysqlDataSource如果在项目中大量使用第二种方法后续要是想要换数据库或者其他操作就会大大增加我们的工作量所以为了让MysqlDataSource这个类名不要扩散到代码的其他地方我们更推荐使用第一种方法。
这里简单介绍一下低耦合高内聚 低耦合用来描述代码模块之间的依赖程度列如有两个模块AB其中B依赖A那么每次A修改后都要修该B那么AB间就是耦合的 高内聚表示某个特定的软件模块内部是由很多相关性很强的代码构成每个模块只负责一项任务一个功能可以由各个模块通过聚合或组合等达到高度内聚这样即使聚合的内容发生改变也不用做很大的变动就等轻松的达到扩展的目的 接下来我们来介绍一下使用到的方法都是什么作用
首先你是不是对setUrl后面那一长串的字符很疑惑现在我用画图的方式介绍一下 之后的setUser(root)的意思就是输入用户名(mysql默认的用户名就是root)setPassword(88* *****8)就是输入密码(就是在安装MySQL时自己设定的那个)
//这些时MySQL的认证方式不同数据库的认证方式不同在使用时需要加载不同的驱动包
建立和数据库服务器之间的连接
我们现在找到了数据库的位置了接下来就是要去连接数据库 Connection connection dataSource.getConnection();
连接的方式非常简单就这一行代码就行我们调用dataSource接口的getConnection方法这个方法会返回一个Connection对象就可以和数据库建立起一个网络连接了
//注意要使用Java.sql包下的Connection
构建sql语句
以上步骤属于准备工作接下来可以正式通过Java操作数据库了
既然要操作数据库那我这里提前创建好了一个库 首先我们要写一条sql语句需要以字符串的形式才行
String sql (insert into score values(11,23,99,99)); 现在我们已经有了一条语句接下来就是把这条语句发送给MySQL数据库
PreparedStatement preparedStatement connection.prepareStatement(sql); JDBC API主要提供了三种Statement对象供我们使用
StatementPrepareStatementCallbleStatement 我们平时用的比较多的是PrepareStatement翻译过来就是预处理语句在执行我们发送的sql语句前它会先解析检查sql看看是不是有什么问题解析完毕之后就会得到结构化数据直接把解析好的结构化数据发送给服务器服务器就省下了这部分解析的工作间接减小了数据库的开销 执行sql语句
刚刚我们执行的是一条insert语句需要通过PrepareStatement调用executeUpdate方法
int n preparedStatement.executeUpdate();System.out.println(n); executeUpdate()方法会返回一个整数表示受到影响的行数通常用于update,insert,delete语句
如果要进行查询操作则一般使用executeQuery()方法该方法执行后会返回查询到的单个结果集
关闭连接释放资源
在我们执行完之后要释放掉我们创建的资源
preparedStatement.close();
connection.close(); 释放时要遵循后创建的先释放
//到这里我们就完成了使用Java语句来控制我们的数据库
测试结果 //数据成功的插入到我们创建的表中
进阶使用
手动输入
如果根据刚刚的方法构造sql语句难道当我们每执行一条sql就要改一下代码显然是不合理的我们可以利用Scanner来手动输入我们要插入的数据这既提高了效率也不必那么麻烦 Scanner scanner new Scanner(System.in);System.out.println(请输入名字);int name scanner.nextInt();System.out.println(请输入语文成绩);int Chinese scanner.nextInt();System.out.println(请输入英语成绩);int English scanner.nextInt();System.out.println(请输入数学成绩);int math scanner.nextInt();String sql (insert into score values
( name , Chinese , English , math ));
查看运行结果 //可以看到我们使用这种方法数据依然可以成功的插入表中
防止SQL注入攻击
刚刚的方法虽然高效了一些好像还差点意思似乎不简洁而且如果使用这种方法的话还可能会引起SQL注入攻击 SQL注入攻击黑客通过代码的形式将我们构造的sql语句恶意篡改甚至可以通过一些方法看到我们数据库里的数据(对于学生党来说这个影响不大因为我们电脑里一般也没啥值钱的数据) 我们可以使用preparedStatement的占位符替换的方法来实现构造sql语句。
String sql (insert into score values(?,?,?,?));
这里的“?”就是占位符相当于告诉编译器这里有数据具体是我们还不确定先占个位置之后再使用setInt()来将占位符替换成我们想插入的数据。 String sql (insert into score values(?,?,?,?));PreparedStatement preparedStatement connection.prepareStatement(sql);preparedStatement.setInt(1,name);preparedStatement.setInt(2,Chinese);preparedStatement.setInt(3,English);preparedStatement.setInt(4,math);setInt()的第一个参数对应的数字就对应上述sql语句中第几个占位符1就对应第一个占位符2就对应第二个占位符后一个参数就是我们要替换的数据。 运行结果 可以看到运行结果和之前一样依旧可以成功的插入数据。
执行查找语句
查找语句和插入语句有所不同查找语句不需要我们输入数据而是需要获得一个查找后的结果集这里你是否有印象刚刚再介绍“执行sql语句”时有提到executeQuery()方法该方法执行后会返回查询到的单个结果集。 但是我们要注意executeQuery();的返回值是resultSet类型那么resulSet是什么 ResultSet对象它被称为结果集它代表符合SQL语句条件的所有行并且它通过一套getXXX方法提供 了对这些行中数据的访问。 ResultSet里的数据一行一行排列每行有多个字段并且有一个记录指针指针所指的数据行叫做当 前数据行我们只能来操作当前的数据行。我们如果想要取得某一条记录就要使用ResultSet的next() 方法 ,如果我们想要得到ResultSet里的所有记录就应该使用while循环。 具体操作如下 String sql (select * from score);PreparedStatement statement connection.prepareStatement(sql);//executeQuery();的返回值是resultSet类型//ResultSet是查询的结果集合(临时表)此处就需要对结果集合进行遍历ResultSet resultSet statement.executeQuery();while(resultSet.next()){int name resultSet.getInt(name);int Chinese resultSet.getInt(Chinese);int English resultSet.getInt(English);int math resultSet.getInt(math);System.out.println(name: name Chinese: Chinese English English math: math);}resultSet.close();statement.close();connection.close();
//通过next就可以获得临时表中的每一行数据如果到了最后一行再执行next就会返回fasle
//我们刚刚还有提到executeQuery()方法返回的是单个的结果集换句话说就是一次只能查询一行所以要使用循环
运行代码 和我们直接操作数据库的结果集一样
执行删除语句
执行删除语句的方法和前面一样这里我们根据name来进行条件筛选 Scanner scanner new Scanner(System.in);System.out.println(请输入名字);int name scanner.nextInt();String sql (delete from score where name ?);PreparedStatement preparedStatement connection.prepareStatement(sql);preparedStatement.setInt(1,name);
执行结果 可以发现我们刚刚插入的一条数据已经被删除了
执行修改语句
修改语句的执行方法和前面几乎类似这里我是以name作为条件筛选来修改math Scanner scanner new Scanner(System.in);System.out.println(请输入名字);int name scanner.nextInt();System.out.println(请输入数学成绩);int math scanner.nextInt();String sql (update score set math ? where name ?);PreparedStatement preparedStatement connection.prepareStatement(sql);preparedStatement.setInt(1,math);preparedStatement.setInt(2,name); //注意占位符的先后顺序
执行结果 可以看到数据已经发生改变说明我们已经成功修改 JDBC的优缺点
优点
Java语言访问数据库操作完全面向抽象接口编程开发数据库应用不用限定在特定数据库厂商的API程序的可移植性大大增强JDBC是Java数据库连接的标准API所有JDBC驱动都遵勖这个标准可以使用面向对象的方式操作数据库
缺点 需要处理可能发生的SQLException。 直接使用JDBC操作数据库可能会导致代码冗余不易维护。 对结果集的解析较为复杂需要手动解析。
练习--使用JDBC实现记账溥
为了可以对JDBC的使用更加熟练博主这里准备了一个小练习来对刚刚讲的使用方法进行巩固 使用JDBC做一个记账溥可以实现将日常的收入/支出账单存储再我们的数据库中 具体思路博主这里就不展示了实现结果如何其实无所谓(写这个代码目的只是为了巩固JDBC的使用方法) 以上就是博主对mysql--JDBC编程的分享如果有不懂的或者有其他见解的欢迎在下方评论或者私信博主也希望多多支持博主之后和博客