关系型数据库(九)JDBC

在开发中我们使用的是JAVA,那么势必要通过java语言操作数据库中的数据。这节课要学的就是如何使用java去操作数据库

扩展:目前程序中有了框架以后,很少用到JDBC的原始写法,数据库事务的相关管理通常交由Spring框架去管理,导入一些开源的数据库连接池JAR包就可以进行数据库的数据操作,大大简化了代码量,C3P0、Druid、HikariCP 、DBCP

JDBC概念

JDBC 就是使用Java语言操作关系型数据库的一套API,是Java语言为了屏蔽具体的具体的数据库操作的细节不同提供的一个框架 全称:( Java DataBase Connectivity ) Java 数据库连接

没有JDBC的时候访问mysql的时候需要写一套代码,访问oracle数据库的时候需要有一套代码,有了JDBC以后只要修改数据库驱动(jar包),和连接字符串就可以了。JDBC提供了一套标准接口,而数据库各厂家提供驱动包,也就是接口的实现类。

JDBC的目标是使Java程序员使用JDBC可以连接任何提供了JDBC驱动程序的数据库系统,这样就使得程序员无需对特定的数据库系统的特点有过多的了解,从而大大简化和加快了开发过程。

如果没有JDBC,那么Java程序访问数据库时是这样的:

JDBC原理

  • 定义的一套操作所有关系型数据库的规则,即接口
  • 各个数据库厂商去实现这套接口,提供数据库驱动jar包
  • 我们可以使用这套接口(JDBC)编程,真正执行的代码是驱动jar包中的实现类

JDBC好处

1.各数据库厂商使用相同的接口,Java代码不需要针对不同数据库分别开发

2.可随时替换底层数据库,访问数据库的Java代码基本不变

编写操作数据库的代码只需要面向JDBC(接口),操作哪个关系型数据库就需要导入该数据库的驱动包,如需要操作MySQL数据库,就需要再项目中导入MySQL数据库的驱动包。

下图就是MySQL驱动包

Java操作数据库的流程

第一步:编写Java代码

第二步:Java代码将SQL发送到MySQL数据库服务器

第三步:MySQL数据库服务器接收到SQL语句并执行该SQL语句

第四步:将SQL语句执行的结果返回给Java代码

JDBC编程步骤

下载驱动程序 https://dev.mysql.com/downloads/connector/j/

在java中使用JDBC连接数据库时,首先我们要知道

    (1)数据库类型:MySQL、SQL Server、Oracle等

    (2)驱动程序jar包:相应的数据库驱动jar包,mysql-connector-java-5.1.5-bin.jar等

    (3)驱动类:com.mysql.cj.jdbc.Driver

    (4)JDBC URL:jdbc:mysql:// dbServerIP:dbPort/dbName

1.注册驱动

Driver接口由数据库厂家提供,作为java开发人员,只需要使用Driver接口就可以了。在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序,不同的数据库有不同的装载方法。如:

  装载MySql驱动:Class.forName("com.mysql.cj.jdbc.Driver");

装载Oracle驱动:Class.forName("oracle.jdbc.driver.OracleDriver");

字符串不同的数据库是不同的。

2.建立连接 // Connection 数据库连接对象  url(指定连接的路径 语法:“jdbc:mysql://ip地址:端口号/数据库名称”)

其他参数如:useUnicode=true&characterEncoding=utf8

Connection com = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/course1", "root", "1qazxdr5@");

Java代码需要发送SQL给MySQL服务端,就需要先建立连接,不同数据库的连接串是不同的

1.连接MySql数据库:Connection conn = DriverManager.getConnection("jdbc:mysql://host:port/database", "user", "password");

2.连接Oracle数据库:Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@host:port:database", "user", "password");

3.连接SqlServer数据库:Connection conn = DriverManager.getConnection("jdbc:microsoft:sqlserver://host:port; DatabaseName=database", "user", "password");

3.执行SQL语句需要SQL执行对象,而这个执行对象就是Statement对象

Statement stat = com.createStatement();

1)用于执行静态SQL语句并返回其生成结果的对象;

2)在建立连接后,需要对数据库进行访问,执行命令或是SQL语句,可以通过Statement【SQL注入】、PreparedStatement【预处理】、CallableStatement【存储过程】;

3)Statement对象执行SQL语句,存在SQL注入风险;

4)SQL注入是利用某些系统没有对用户输入的数据进行充分的检查,而在用户输入数据中注入非法的SQL语句段或者命令,恶意攻击数据库;

5)要防范SQL注入,只要用PreparedStatement(从Statement扩展而来)取代Statement就可以。

 String sql = "delete from admin where name = ? and pwd = ?";

 PreparedStatement preparedStatement = connection.prepareStatement(sql);

preparedStatement.setString(1,admin_name);  //与sql语句中的?对应

preparedStatement.setString(2,admin_pwd);   //与sql语句中的?对应

4.定义SQL语句

String sql = "SELECT * FROM sudent";

5.执行SQL 

// 执行 增删改查 (DML)语句用 int executeUpdate(Sting sql);

ResultSet rs = stat.executeQuery(sql);

//如果有数据,rs.next()返回true

while (rs.next()){
    System.out.println(rs.getInt("student_no") + "\t" + rs.getString("student_name"));
}

DriverManager:用于注册驱动
Connection: 表示与数据库创建的连接
Statement: 操作数据库sql语句的对象
ResultSet: 结果集或一张虚拟表

7.释放资源

 数据库连接(Connection)非常耗资源,尽量晚创建,尽量早的释放,都要加try catch finally 以防前面关闭出错,后面的就不执行了

关闭资源时遵循

先来后走,因此,当collection,statement,resultSet三个资源同时存在时,我们应该resultSet,statement,collection的顺序关闭

rs.close();
stat.close();
com.close();

重点:遍历查询结果

ResultSet rs = stat.executeQuery(sql);
while (rs.next()){
System.out.println(rs.getInt("student_no") + "\t" +              rs.getString("student_name"));  
}

ResultSet

1)表示数据库结果集的数据表,通常通过执行查询数据库语句生成;

2)ResultSet对象保持一个光标指向其当前的数据行,初始,光标位于第一行之前;

3)next方法将光标移动到下一行,并且由于在ResultSet对象中没有更多行时返回false,因此可以在while循环中使用循环来遍历结果集。

提取数据使用 ResultSet接口中的getXXX方法

getString

getInt

getFloat

getDouble

getBoolean

getDate

getTime

getTimeStamp

两种参数形式

int   列号-从1开始计

String-列名,不区分大小写

思考,如何将获得的学生信息放入到一个类对象里,多个学生对象如何放入到一个集合里

更新操作
//3. 定义sql
String sql = "update student set money = 2000 where student_no = 5";
//4. 获取执行sql的对象 Statement
Statement stmt = conn.createStatement();
//5. 执行sql
int count = stmt.executeUpdate(sql);//受影响的行数

插入操作

//3. 定义sql
String sql = "insert into student(student_name,student_sex,money) values('范芬','',100)";
//4. 获取执行sql的对象 Statement
Statement stmt = conn.createStatement();
//5. 执行sql
int count = stmt.executeUpdate(sql);//受影响的行数

删除操作

String sql = "delete from student where student_no=5";

将连接数据库的所有信息配置到配置文件中

jdbc.properties放在根目录下面

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/database1
user=root
password=1qazxdr5@

ResourceBundle bundle = ResourceBundle.getBundle("jdbc");
String driver = bundle.getString("driver");
String url = bundle.getString("url");
String user = bundle.getString("user");
String password = bundle.getString("password");
Class.forName(driver);
Connection conn = DriverManager.getConnection(url,user,password);

JDBC多表操作

  1. JDBC多表插入

Statement stmt = conn.createStatement();
//5. 执行sql
int count = stmt.executeUpdate(sql,Statement.RETURN_GENERATED_KEYS);//受影响的行数
ResultSet rs = stmt.getGeneratedKeys();
if(rs.next()){
    int id = rs.getInt(1);
    System.out.println("id的值是:"+id);
}

  1. 多表插入,修改

String sql = "delete from student where student_no=10";
String sql1 = "delete from student_desc where id=10";
//4. 获取执行sql的对象 Statement
Statement stmt = conn.createStatement();
stmt.addBatch(sql);
stmt.addBatch(sql1);
int[] sucessayyray = stmt.executeBatch();

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

薛定谔的猫1981

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值