JDBC指的是Java数据库连接,这是一个标准的Java应用程序编程接口(JAVAAPI),用于将Java编程语言与各种数据库连接起来。从根本上说,JDBC是一个标准,它提供了一套完整的接口,并允许对底层数据库的可移植访问。在本文中,我们将了解MySQL连接JDBC的过程。
目录
一、数据库编程必备条件二。Java数据库编程:JDBC 3。JDBC IV的工作原理。JDBC发展步骤诉JDBC操作步骤六。JDBC代码优化1的一部分。正在获取数据库连接对象2。操作命令对象语句3。结果集对象4。摘要
一、数据库编程的必备条件
编程语言:如Java、C、C、Python等。
数据库:如Oracle、MySQL、SQL Server等。
数据库驱动程序包:不同的数据库,当以一种编程语言运行时,需要使用数据库制造商提供的数据库驱动程序包。
比如mysql提供了java的驱动包mysql-connector-java,如果MySQL需要基于java操作就需要驱动包。同样,基于java操作Oracle数据库,需要Oracle的数据库驱动包ojdbc。
二、Java的数据库编程:JDBC
JDBC (java Database Connectivity)是一个用于执行SQL语句的java API,是Java中的数据库连接规范。这个API由java.sql. *、javax.sql. *包中的一些类和接口组成。它为java开发者提供了操作数据库的标准API,并能提供对多个关系数据库的统一访问。
三、JDBC工作原理
JDBC为许多关系数据库提供了统一的访问方法。作为特定厂商数据库访问API的高层抽象,主要包含一些通用接口类。
要访问JDBC数据库层次结构,请执行以下操作:
我们使用一套JDBC电码。数据库切换后,Java操作数据库的代码就可以搞定了(差不多),数据库的驱动包需要调整。sql也需要调整,因为标准sql的部分和数据库相关的关键字,比如mysql中的limit。
JDBC的优势:
Java语言access数据库操作完全面向抽象接口编程。
数据库应用的开发并不局限于某个特定数据库厂商的API。
它为Java操作不同的数据库提供了统一的标准,程序在不同数据库中的可移植性大大增强。
四、JDBC开发步骤
1.创建一个普通Java项目。
2.下载mysql的驱动包
下载驱动程序包网站
我用的是5.1.xx版本,意思是:不同版本的数据库驱动包可能有不同的类/接口。
3.在项目中添加数据库驱动程序包(依赖)
验证:写Java代码时,可以使用mysql驱动包中的类/接口,也就是说引入的依赖没有问题。
4.测试:连接到数据库。
注意:
1.起初,当我们写forName时,它会变成红色。这里不用担心,抛出一个异常就行了。出现进入如下界面,点击第一个:
2.获取数据库连接:连接接口,需要使用jdbc,而不是mysql。
3.URL参数格式为3。MySQL数据连接如下:
Jdbc:mysql://服务器地址:端口/数据库名?参数名=参数值
//加载JDBC驱动:反射方式,让调用初始化com.mysql.jdbc.Driver类
//即把类加载到JVM方法区,执行类的静态方法块和静态属性。
//数据库驱动包可以在这个操作下进行相应的初始化(驱动)。
class . forname(' com . MySQL . JDBC . driver ');
//获取数据库连接:连接接口,需要使用jdbc,而不是mysql。
connection conn=driver manager . getconnection(' JDBC:MySQL://localhost:3306/kang?'
user=root password=010124 use unicode=true character encoding=UTF-8 use SSL=false ');
五、JDBC操作步骤
1.获取数据库连接对象
连接(JDBC的接口)
2.使用数据库连接对象创建操作命令对象语句,它是sql操作的抽象对象。
//通过连接对象创建操作命令对象语句(使用jdbc),对象是操作sql的抽象对象。
语句s=conn . create statement();
3.调用操作命令对象的方法执行sql查询:executeQuery更新操作(插入、修改、删除):executeUpdate,返回值int,表示成功执行了几项。
//更新操作:调用executeUpdate方法,插入、修改、删除。
int n=s . execute update(' update exam _ result set math=60其中id=1 ');
System.out.println('修改成功次数:' n ');
4.如果是查询操作,需要查询ResultSet对象,返回ResultSet结果集对象,类似于数据结构中的ListMapString,对象。
//查询:
//(1)调用语句操作命令对象的executeQuery(sql)。
//(2)返回一个ResultSet结果集对象(查询sql执行的结果集)
ResultSet r=s . execute query(' select id,name,chinese,math,English from exam _ result where ID3 ');
//处理结果:结果集可能是多行数据,需要遍历才能得到。
//调用next移动到下一行。如果返回true,则新行中有数据;如果返回false,则该行中没有数据。
While(r.next()){//一路走到底
//进入循环,表示操作遍历的一行数据。
int id=r . getint(' id ');
string name=r . getstring(' name ');
int chinese=r.getInt('中文');
int math=r . getint(' math ');
int English=r . getint(' English ');
System.out.printf('id=%s,名称=%s,中文=%s,数学=%s,英文=%s\n '
、id、姓名、中文、数学、英文);
}
运行结果:
评论:
5.释放资源无论jdbc操作成功还是发生异常,都需要释放资源。考虑到异常对象尚未初始化或为空的情况,有必要反向释放资源。
公共类JDBC {
公共静态void main(String[] args)抛出ClassNotFoundException,SQLException {
连接连接=空;
语句s=null
结果集r=null
尝试{
//把之前写的程序全部放入try。
}最后{//不管怎样,释放资源。
//释放资源:
//(1)无论情况如何(异常)
//(2)释放的顺序与创造的顺序相反。
//(结果集对象、操作命令对象、数据库连接对象)
if(r!=null){
r . close();
}
如果(s!=null){
s . close();
}
如果(conn!=null){
conn . close();
}
}
}
}
六、优化JDBC的部分代码
1.获取数据库连接对象
连接实现类由数据库提供,通常有两种方法可以获得连接对象:
1.一种是通过DriverManager(驱动管理类)的静态方法获取,也就是我们上面说的方法。
2.一个是通过DataSourse(数据源/数据库连接池)对象获得的。在实践中,将使用DataSourse对象。
//先创建一个数据库连接池,然后通过连接池获取数据库连接对象。
data source ds=new MySQL data source();
//创建数据库连接池:初始化时,会创建一定数量的数据库连接,这些连接对象可以以更高的效率被重用。
//只有使用seturl方法,或者调用带参数的方法,才能设置带参数的整个URL。
((MysqlDataSource)ds)。setURL(' JDBC:MySQL://localhost:3306/kang ');
((MysqlDataSource)ds)。setUser(' root ');
((MysqlDataSource)ds)。set password(' 010124 ');
((MysqlDataSource)ds)。setuse unicode(true);
((MysqlDataSource)ds)。setCharacterEncoding(“UTF-8”);
((MysqlDataSource)ds)。setuse SSL(false);
conn=ds . getconnection();
system . out . println(conn);
两者的区别:
1.由1获得的连接。不能重用DriverManager类。每次资源被使用后释放,物理连接通过Connection.close()关闭。
2.DataSourse提供了连接池的支持。当连接池初始化时,会创建一定数量的数据库连接,这些链接可以重用。每次使用数据库连接时,释放资源并调用connection.close()会回收连接对象。效率更高。
2.操作命令对象Statement
语句对象主要是向数据库发送SQL语句,JDBC API主要提供三种语句对象。
语句:用于执行不带参数的简单SQL语句(简单操作命令对象)
PreParedStatement:(预编译操作命令对象)
用于执行带或不带参数的SQL语句。
SQL语句在数据库系统中预编译。
执行速度比语句对象快。
CallableStatement:用于执行数据库存储过程的调用(存储过程的操作命令对象)。存储过程:就是写一段sql代码,里面可以写变量,循环,条件判断等等。
查询操作:
s=conn . create statement();
//查询:在页面上模拟,输入学生姓名搜索该学生。
//(1)调用语句操作命令对象的executeQuery(sql)。
//(2)返回一个ResultSet结果集对象(查询sql执行的结果集)
查询名='孙权';//可以正常查询的输入
//(1)调用语句操作命令对象的executeQuery(sql)。
//(2)返回一个ResultSet结果集对象(查询sql执行的结果集)
String sql='select id,name,chinese,math,english from exam_result其中name=' ' queryName
system . out . println(SQL);
r=s . execute query(SQL);
While (r.next()) {//一路走到底
//进入循环,表示操作遍历的一行数据。
int id=r . getint(' id ');
string name=r . getstring(' name ');
int chinese=r.getInt('中文');
int math=r . getint(' math ');
int English=r . getint(' English ');
System.out.printf('id=%s,name=%s,中文=%s,数学=%s,英文=%s\n ',id,name,中文,数学,英文);
}
输出结果:
但是这里有一个现象:如果我们把这里的queryName改成“skdj”或者‘1’=‘1’,拼接sql字符串的时候可能会出现安全问题。输出是:
后面的' 1'=' 1 '是常量真条件,所以会导致整个or条件为真,输出所有成员。要解决上述安全问题,需要将上述操作命令的对象调整为PreparedStatement,并使用占位符。
//要解决上述安全问题,需要调整上述操作命令对象的PreparedStatement。
String queryName='skeij '或' 1 '=' 1 ';
int query id=6;
//准备一条腰带?占位符的Sql
String sql='select id,name,chinese,math,English from exam _ result where name=?或者id=?';
PS=conn . prepare statement(SQL);//创建预编译操作命令对象
//替换占位符:调用setXXX方法,第一个参数表示哪个占位符(从1开始),第二个参数表示要替换的值。
ps.setString(1,query name);//如果替换的值是什么类型,调用setXXX方法。
ps.setInt(2,queryId);
//要执行sql,需要使用不带参数的方法。
r=PS . execute query();
输出是:
插入操作:
int query id=7;
查询名称='图图';
int中文=60;
int math=98
int english=79
字符串SQL=' insert into exam _ result values(??)';
PS=conn . prepare statement(SQL);
ps.setInt(1,queryId);
ps.setString(2,query name);
ps.setInt(3,中文);
ps.setInt(4,数学);
ps.setInt(5,英语);
//executeUpdate()方法的返回值是整数,表示受影响的行数。它通常用于update、insert和delete语句。
int ret=PS . execute update();
system . out . println(ret);
其余的删除和更新操作和上面类似,这里就不做过多演示了。
3.ResultSet对象
result set对象,称为ResultSet,表示满足SQL语句条件的所有行,它通过一组getXXX方法提供对这些行中数据的访问。ResultSet中的数据是逐行排列的,每行有多个字段,有一个记录指针。指针指向的数据称为当前数据行,我们只能操作当前数据行。如果要获取记录,应该使用ResultSet的next()方法。如果我们想获得ResultSet中的所有记录,我们应该使用while循环。
//处理结果:结果集可能是多行数据,需要遍历才能得到。
//调用next移动到下一行。如果返回true,则新行中有数据;如果返回false,则该行中没有数据。
While (r.next()) {//一路走到底
//进入循环,表示操作遍历的一行数据。
int id=r . getint(' id ');
string name=r . getstring(' name ');
int chinese=r.getInt('中文');
int math=r . getint(' math ');
int English=r . getint(' English ');
System.out.printf('id=%s,name=%s,中文=%s,数学=%s,英文=%s\n ',id,name,中文,数学,英文);
}
4.总结
掌握执行SQL的两种方法:
1.executeQuery()方法执行后返回单个结果集,通常用在select语句中。
2.2.executeUpdate()方法的返回值是一个整数,表示受影响的行数。它通常用于update、insert和delete语句。
编制报表的注意事项:
1.参数化SQL查询
2.占位符不能使用多值。
3.占位符:下标从1开始
4.防止常见的SQL注入攻击
5.SQL预编译
6.绩效高于陈述
以上就是本文关于MySQL数据库JDBC编程的详细过程。有关MySQL JDBC的更多信息,请搜索我们以前的文章或继续浏览下面的相关文章。希望你以后能支持我们!
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。