JDBC看这篇就够了
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 前言
- 一、JDBC是什么?
- 二、JDBC原理图
- 三、JDBC的使用步骤
- 总结
前言
学了Mysql数据库后,花了两天时间学习了一下JDBC的使用,这里整理了一下笔者对jdbc的理解(注:本文所有代码针对Mysql数据库进行编码)
提示:以下是本篇文章正文内容,下面案例可供参考
一、JDBC是什么?
JDBC是SUN公司制定的一套接口,接口都有调用者和实现者,面向接口调用、面向接口写实现类、这都属于面向接口编程。
二、JDBC原理图
JDBC API是一系列的接口,它统一和规范了应用程序与数据库的连接,执行SQL语句,并得到返回结果等各类操作,相关类和接口在java.sql和javax.sql包中
三、JDBC的使用步骤
JDBC导入mysql驱动文件
(1) 在Mysql官网下载相应的驱动jar包,根据自己使用的mysql版本选择合适的版本进行下载,如果是Mac本,选择tar.gz文件下载,如果是win系统,选择zip文件下载,最后进行解压即可
(2)在IEDA中导入驱动文件
然后选择
这样就完成了对Mysql数据库驱动文件进行导入
四、JDBC编码步骤
1.注册驱动,获取连接
创建数据库连接的方式有五种,我简单的介绍一下
Driver接口的方法:
Connection |
connect(String url, Properties info)
尝试使数据库连接到给定的URL |
返回的connect对象就是连接数据的对象
第一种方式:
public void connect01() throws SQLException { //注册驱动 Driver driver = new Driver(); //jdbc:mysql://是规定好的协议,localhost:3306代表本机 和监听的端口,xyx_db02表示连接到xyx_db02这张表 String url = "jdbc:mysql://localhost:3306/xyx_db02"; //将 用户名 和 密码 放入到 Properties 对象中 Properties properties = new Properties(); properties.setProperty("user","root"); //用户 ,properties(key,value) key是规定好的 "user" properties.setProperty("password","123"); //密码 Connection connect = driver.connect(url, properties); //返回一个连接 System.out.println(connect); }
第二种方式:通过java的反射机制加载Driver类
public void connect02() throws Exception {//使用反射加载Driver类 ,动态加载,更加的灵活,减少依赖性 Class cls = Class.forName("com.mysql.jdbc.Driver");Driver driver = (Driver) cls.newInstance(); String url = "jdbc:mysql://localhost:3306/xyx_db02"; //将 用户名 和 密码 放入到 Properties 对象中 Properties properties = new Properties(); properties.setProperty("user","root"); //用户 ,properties(key,value) key是规定好的 "user" properties.setProperty("password","123"); //密码 Connection connect = driver.connect(url, properties); //返回一个连接 System.out.println("方式二"+connect); }
第三种方式:通过 DriverManager类的registerDriver方法传入driver对象完成对数据库的连接
static Connection |
getConnection(String url, String user, String password)
尝试建立与给定数据库URL的连接 |
public void connect03() throws InstantiationException, IllegalAccessException, ClassNotFoundException, SQLException {//使用反射加载Driver Class aClass = Class.forName("com.mysql.jdbc.Driver");Driver driver = (Driver) aClass.newInstance();//创建url 和 user 和password String url = "jdbc:mysql://localhost:3306/xyx_db02"; String user = "root"; String password = "xuyuxuan0724"; DriverManager.registerDriver(driver); //注册Driver驱动 Connection connection = DriverManager.getConnection(url, user, password); System.out.println("第三种方式= " + connection); }
第四种方式:Class.forName()方法,自动完成注册驱动
public void connect4() throws ClassNotFoundException, SQLException {//com.mysql.jdbc.Driver//使用反射加载Driver类 Class.forName("com.mysql.jdbc.Driver"); //创建url 和 user 和password String url = "jdbc:mysql://localhost:3306/xyx_db02"; String user = "root"; String password = "xuyuxuan0724"; Connection connection = DriverManager.getConnection(url, user, password); System.out.println("第四种方式 = " +connection); }
这里两点需要说明:
1.Mysql驱动5.1.6之后可以无需Class.forName("com.mysql.jdbc.Driver");
2.从jdk1.5使用了jdbc4,不再需要显示调用Class.forName()注册驱动,而是自动调用驱动jar包下META-INF\services\java.sql.Driver文本中的类名称去注册
第五种方式:写入配置文件,让mysql连接更灵活,减少代码冗余
public void connect05() throws IOException, ClassNotFoundException, SQLException {//通过Properties对象获取相关配置文件的信息 Properties properties = new Properties(); properties.load( new FileInputStream("src//mysql.Properties")); //获取相关的值 String user = properties.getProperty("user"); String password = properties.getProperty("password"); String driver = properties.getProperty("driver"); String url = properties.getProperty("url"); Class.forName(driver); Connection connection = DriverManager.getConnection(url, user, password); System.out.println("方式五 " +connection); }
DriverManager不调用registerDriver()方法传入driver是为什么?
是因为在类加载的时候,Driver类底层的static代码块中已经调用了该方法,是自动注册驱动
这里附上Driver类的底层源码:
public class Driver extends NonRegisteringDriver implements java.sql.Driver{ static { try{ java.sql.DriverManager.registerDriver(new Driver()); } catch(SQLException E) { throw new RuntomeExceptione("Can't register driver!"); } }
好了,相信小伙伴看到这里,对JDBC连接数据库的方式有了一个大概的认识,这里我们进入下一个步骤
2.组织SQL语句
String sql = "Update actor set name = '周星驰' "; //用于操作 sql语句 Statement statement = connect.createStatement(); // int rows = statement.executeUpdate(sql); //如果是 dml语句 返回的就是影响的行数 System.out.println(rows >0 ?"成功":"失败"); // 1
代码测试过,返回的是成功;
这里有一个问题,Statement类在开发中是不允许使用的,因为它存在一个SQL注入问题,我们来看一个典型的SQL注入问题:
如果我们使用select语句,这里会判断where后面的sql语句,我们原本想要查询的数据 name ='tom',pwd='123',而上图的sql语句就相当于写了个万能条件语句,name='1' 或者 pwd = ' 或者'1=1',这里显然是可以查询出我们想要的数据的,据说在2000年左右,因为sql注入问题让很多企业损失惨重,后面这个问题才被解决
这里我们介绍一下Statement类
Statement类
基本介绍:
1.用于执行静态Sql语句并返回其生成结果
2.在连接建立后,需要对数据库进行访问,执行命名或是SQL语句,可以通过Statement(存在SQL注入问题)PrepardStatement(预处理) CallableStatement(存储过程)
3.Statement对象执行SQL语句,存在SQL注入风险
4.SQL注入是利用某些系统没有对用户输入对数据进行充分对检查,而在用户输入数据中注入非法对SQL语句段或命令,恶意攻击数据库
5.要防范SQL注入,只要用PreparedStatement(从Statement扩展而来),取代Statement就可以了
聊到select语句,在这里介绍一下ResultSet类
ResultSet类
表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。
ResultSet
对象保持一个光标指向其当前的数据行。 最初,光标位于第一行之前。 next
方法将光标移动到下一行,并且由于在ResultSet
对象中没有更多行时返回false
,因此可在while
循环中使用循环来遍历结果集。
我们来看一下ResultSet底层
rows所有行,是一个ArrayList数组,internalRowDate是一个对象数组,每个对象数组包含各行的数据,比如说0对应的是49是id为1的ASCll码,1对应的name中的‘周星驰‘,UTF-8中每一个汉字占三个字节,所以对应了九个ascll码以此类推
由于只是测试,表我们已经建好了
mysql> select * from actor;+----+-----------+-----+---------------------+-------+| id | name | sex | borndate | phone |+----+-----------+-----+---------------------+-------+| 1 | 周星驰 | 男 | 1970-11-11 00:00:00 | 110 || 3 | 刘德华 | 男 | 1970-12-12 00:00:00 | 110 || 4 | 吴孟达 | 男 | 1969-01-01 00:00:00 | 1231 |+----+-----------+-----+---------------------+-------+
//1.注册驱动 Class.forName(driver); //2.得到连接 Connection connection = DriverManager.getConnection(url, user, password); //3.得到Statement Statement statement = connection.createStatement(); //4.组织sql语句 String sql = "select id,name,sex,borndate from actor"; //执行给定的sql语句,该语句返回单个 ResultSet对象 ResultSet resultSet = statement.executeQuery(sql); while (resultSet.next()){ //会让光标向后移动,如果没有更多行,则会返回false int id = resultSet.getInt(1);//获取该行第一列数据 String name = resultSet.getString(2); //获取该行第二列数据 String sex = resultSet.getString(3);//获取该行第三列数据 Date date = resultSet.getDate(4); System.out.println(id+"\t"+name+"\t"+sex+"\t"+date); }
返回结果为:
3.关闭资源
在JDBC编码过程中,我们创建了resultSet,statement,connection等资源,这些资源在使用完毕后一定要进行关闭资源,关闭的过程中遵循从里到外的原则,因为在增删改查中的操作中都要用到这样的关闭操作
resultSet.close(); statement.close(); connection.close();
下面附上关于select查询语句的完整代码:
import java.io.FileInputStream;import java.sql.*;import java.util.Properties;@SuppressWarnings({"all"})public class ResultSet_ { public static void main(String[] args) throws Exception { //通过Properties对象获取相关配置文件的信息 Properties properties = new Properties(); properties.load( new FileInputStream("src//mysql.Properties")); //获取相关的值 String user = properties.getProperty("user"); String password = properties.getProperty("password"); String driver = properties.getProperty("driver"); String url = properties.getProperty("url"); //1.注册驱动// Class.forName(driver); //2.得到连接 Connection connection = DriverManager.getConnection(url, user, password); //3.得到Statement Statement statement = connection.createStatement(); //4.组织sql语句 String sql = "select id,name,sex,borndate from actor"; //执行给定的sql语句,该语句返回单个 ResultSet对象 ResultSet resultSet = statement.executeQuery(sql); //5.使用while取出数据 /* mysql> select * from actor; +----+-----------+-----+---------------------+-------+ | id | name | sex | borndate | phone | +----+-----------+-----+---------------------+-------+ | 1 | 周星驰 | 男 | 1970-11-11 00:00:00 | 110 | | 3 | 刘德华 | 男 | 1970-12-12 00:00:00 | 110 | | 4 | 吴孟达 | 男 | 1969-01-01 00:00:00 | 1231 | +----+-----------+-----+---------------------+-------+ */ while (resultSet.next()){ //会让光标向后移动,如果没有更多行,则会返回false int id = resultSet.getInt(1);//获取该行第一列数据 String name = resultSet.getString(2); //获取该行第二列数据 String sex = resultSet.getString(3);//获取该行第三列数据 Date date = resultSet.getDate(4); System.out.println(id+"\t"+name+"\t"+sex+"\t"+date); } //6.关闭资源 resultSet.close(); statement.close(); connection.close(); }}
JDBC编程的内容就这些了,如果你已经全部掌握,还有事务,获取自增,连接池等等内容可以自行了解一下