在开发中我们使用的是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多表操作
- 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);
}
- 多表插入,修改
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();