文章目录
- 前言
- 一、JDBC是什么?
- 二、JDBC原理图
- 三、JDBC的使用步骤
- 总结
前言
学了Mysql数据库后,花了两天时间学习了一下JDBC的使用,这里整理了一下笔者对jdbc的理解(注:本文所有代码针对Mysql数据库进行编码)
提示:以下是本篇文章正文内容,下面案例可供参考
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编程的内容就这些了,如果你已经全部掌握,还有事务,获取自增,连接池等等内容可以自行了解一下
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)