迅闻网
让更多人看到你

mysql jdbc(mysql和jdbc区别)

  mysqljdbc

JDBC(JavaDataBaseConnectivity,java数据库衔接)是一种用于履行SQL语句的JavaAPI,能够为多种联系型数据库供给一致访问,它是由一组用Java言语编写的类和接口组成的。
??JDBC标准界说接口,具体的完成由各大数据库厂商来完成。
JDBC是Java访问数据库的标准标准,真正怎样操作数据库还需要具体的完成类,也就是数据库驱动。每个数据库厂商依据自家数据库的通信格式编写好自己数据库的驱动。所以咱们只需要会调用JDBC接口中的办法即可,数据库驱动由数据库厂商供给。
本质
其实就是java官方供给的一套标准(接口)。用于帮助开发人员快速完成不同联系型数据库的衔接!
JDBC的7个过程
(1)导入jar包
(2)注册驱动
1
Class.forName(“com.mysql.cj.jdbc.Driver”);
留意:如果运用较高版本的MySQL,必须运用com.mysql.cj.jdbc.Driver的方式,否则会报错!
Loadingclass`com.mysql.jdbc.Driver’.Thisisdeprecated.Thenewdriverclassis`com.mysql.cj.jdbc.Driver’.ThedriverisautomaticallyregisteredviatheSPIandmanualloadingofthedriverclassisgenerallyunnecessary.
如果是低版本的能够运用com.mysql.jdbc.Driver
如果还是报错,能够运用在url上面参加时区!
url=jdbc:mysql://localhost:3306/数据库名?serverTimezone=UTC
(3)获取衔接
Stringurl=”jdbc:mysql://localhost:3306/db1″;
Connectioncon=DriverManager.getConnection(url,”root”,”888888″);
(4)获取履行者目标
Statementstat=con.createStatement();
(5)履行sql语句,并接收回来结果
Stringsql=”SELECT*FROMuser”;
ResultSetrs=stat.executeQuery(sql);
(6)处理结果
while(rs.next()){
System.out.println(rs.getInt(“id”)
+”\t”+rs.getString(“name”));
}
(7)释放资源
con.close();
stat.close();
rs.close();
JDBC入门示例代码
Connection目标中的用户名,数据库名,暗码改成你自己的哦!
publicclassjdbc_demo01{
publicstaticvoidmain(String[]args)throwsClassNotFoundException,SQLException{
//1.导入jar包
//2.注册驱动
Class.forName(“com.mysql.cj.jdbc.Driver”);
//3.获取衔接
Stringurl=”jdbc:mysql://localhost:3306/db1″;
Connectioncon=DriverManager.getConnection(url,”root”,”888888″);
//4.获取履行者目标
Statementstat=con.createStatement();
//5.履行sql语句,并且接收结果
Stringsql=”SELECT*FROMproduct”;
ResultSetrs=stat.executeQuery(sql);
//6.处理结果
while(rs.next()){
System.out.println(rs.getInt(“id”)+”\t”
+rs.getString(“name”)+”\t”
+rs.getInt(“price”)+”\t”
+rs.getString(“brand”)+”\t”
+rs.getInt(“stock”)
);
}
//7。释放资源
con.close();
stat.close();
rs.close();
}
}

SQL

mysql和jdbc区别

1什么是JDBC
?JDBC(JavaDataBaseConnectivity)java数据库衔接?是JavaEE平台下的技术规范?界说了在Java言语中衔接数据,履行SQL句子的规范?能够为多种关系数据库提供统一访问
2什么是数据库驱动程序
?数据库厂商对JDBC规范的详细完结?不同数据产品的数据库驱动名字有差异?在程序中需求依靠数据库驱动来完结对数据库的操作
3程序操作数据库流程
二、JDBC3.0规范中常用接口与类
1Driver接口
Driver接口的作用是来界说数据库驱动目标应该具有的一些才能。比方与数据库树立连接的办法的界说一切支撑java言语衔接的数据库都完结了该接口,完结该接口的类咱们称之为数据库驱动类。在程序中要衔接数据库,必须先经过JDK的反射机制加载数据库驱动类,将其实例化。不同的数据库驱动类的类名有区别。加载MySql驱动:Class.forName(“com.mysql.jdbc.Driver”);加载Oracle驱动:Class.forName(“oracle.jdbc.driver.OracleDriver”);
2DriverManager类
DriverManager经过实例化的数据库驱动目标,能够树立应用程序与数据库之间树立连接。并回来Connection接口类型的数据库衔接目标。
2.1常用办法
?getConnection(StringjdbcUrl,Stringuser,Stringpassword)该办法经过访问数据库的url、用户以及密码,回来对应的数据库的Connection目标。
2.2JDBCURL
与数据库衔接时,用来衔接到指定数据库标识符。在URL中包含了该数据库的类型、地址、端口、库称号等信息。不同品牌数据库的衔接URL不同。
3Connection接口
Connection与数据库的衔接(会话)目标。咱们能够经过该目标履行sql句子并回来结
果。
衔接MySql数据库:Connectionconn=DriverManager.getConnection(“jdbc:mysql://host:port/database”,”user”,”password”);衔接Oracle数据库:Connectionconn=DriverManager.getConnection(“jdbc:oracle:thin:@host:port:database”,”user”,”password”);衔接SqlServer数据库:Connectionconn=DriverManager.getConnection(“jdbc:microsoft:sqlserver://host:port;DatabaseName=database”,”user”,”password”);
3.1常用办法
?createStatement():创立向数据库发送sql的Statement接口类型的目标。?preparedStatement(sql):创立向数据库发送预编译sql的PrepareSatement接口类型的
目标。?prepareCall(sql):创立履行存储进程的CallableStatement接口类型的目标。?setAutoCommit(booleanautoCommit):设置业务是否主动提交。?commit():在链接上提交业务。?rollback():在此链接上回滚业务。
4Statement接口
用于履行静态SQL句子并回来它所生成成果的目标。由createStatement创立,用于发送简单的SQL句子(不支撑动态绑定)。
4.1常用办法
?execute(Stringsql):履行参数中的SQL,回来是否有成果集。?executeQuery(Stringsql):运转select句子,回来ResultSet成果集。?executeUpdate(Stringsql):运转insert/update/delete操作,回来更新的行数。?addBatch(Stringsql):把多条sql句子放到一个批处理中。?executeBatch():向数据库发送一批sql句子履行。
5PreparedStatement接口
承继自Statement接口,由preparedStatement创立,用于发送含有一个或多个参数的SQL句子。PreparedStatement目标比Statement目标的功率更高,并且能够避免SQL注入,所以咱们一般都运用PreparedStatement。
5.1常用办法
?addBatch()把当时sql句子加入到一个批处理中。?execute()履行当时SQL,回来个boolean值?executeUpdate()运转insert/update/delete操作,回来更新的行数。?executeQuery()履行当时的查询,回来一个成果集目标?setDate(intparameterIndex,Datex)向当时SQL句子中的指定方位绑定一个java.sql.Date
值。
?setDouble(intparameterIndex,doublex)向当时SQL句子中的指定方位绑定一个double

?setFloat(intparameterIndex,floatx)向当时SQL句子中的指定方位绑定一个float值?setInt(intparameterIndex,intx)向当时SQL句子中的指定方位绑定一个int值?setString(intparameterIndex,Stringx)向当时SQL句子中的指定方位绑定一个String值
6ResultSet接口
ResultSet提供检索不同类型字段的办法。
6.1常用办法
?getString(intindex)、getString(StringcolumnName)取得在数据库里是varchar、char等类型的数据目标。?getFloat(intindex)、getFloat(StringcolumnName)取得在数据库里是Float类型的数据目标。?getDate(intindex)、getDate(StringcolumnName)取得在数据库里是Date类型的数据。?getBoolean(intindex)、getBoolean(StringcolumnName)取得在数据库里是Boolean类型的数据。?getObject(intindex)、getObject(StringcolumnName)获取在数据库里恣意类型的数据。
6.2ResultSet对成果集进行翻滚的办法
?next():移动到下一行。?Previous():移动到前一行。?absolute(introw):移动到指定行。?beforeFirst():移动resultSet的最前面。?afterLast():移动到resultSet的最终面。
7CallableStatement接口
承继自PreparedStatement接口,由办法prepareCall创立,用于调用数据库的存储进程。
三、JDBC的运用
加载数据库驱动程序→树立数据库衔接Connection→创立履行SQL的句子Statement→处理履行成果ResultSet→释放资源
1下载数据库驱动
1.1MySQL驱动
1.2Oracle驱动
数据库安装目录\oracle\product\11.2.0\dbhome_1\jdbc\lib
2创立项目增加驱动
3经过Statement向表中刺进数据
3.1注册驱动
Class.forName(“com.mysql.jdbc.Driver”);
3.2获取衔接
//创立衔接conn=DriverManager.getConnection(“jdbc:mysql://localhost:3306/
+mysql?useSSL=false&useUnicode=true&”+
“characterEncoding=utf-8″,”root”,”root”);
//jdbc:mysql://衔接地址:衔接端口号/衔接那个数据库?是否验证&敞开编码&编码办法
//root登陆数据库的账户//root登陆数据库的密码
3.3履行SQL
sta=conn.createStatement();//用于去提交业务的目标
Stringsql=”insertintousertablevalues(default,'”+age+”‘,'”+userName+”‘,'”+password+”‘)”;
//所要履行的sql句子
booleanflage=sta.execute(sql);//履行sql句子
3.4释放资源
finally{
try{
if(sta!=null){//先封闭Statement
sta.close();
}
if(conn!=null){//后封闭衔接
conn.close();
}
}catch(SQLExceptione){
e.printStackTrace();
}
更新表中的数据
publicvoidupdateUer(StringuserName,Stringpassward,intage){
Connectionconn=null;
Statementsta=null;
try{
Class.forName(“com.mysql.jdbc.Driver”);
conn=DriverManager.getConnection(“jdbc:mysql://localhost:3306/mysql?”
+”useSSL=false&useUnicode=true&”+
“characterEncoding=utf-8″,”root”,”root”);
sta=conn.createStatement();
Stringsql=”updateusertablesetname='”+userName+”‘,passward=”
+”‘”+passward+”‘,age='”+age+”‘”;
sta.executeUpdate(sql);
}catch(Exceptione){
e.printStackTrace();
}finally{
try{
if(sta!=null){
sta.close();
}
if(conn!=null){
conn.close();
}
}catch(SQLExceptione){
e.printStackTrace();
}
}
4ResultSet讲解
留意ResultSet中封装的并不是咱们查询到的一切的成果集,而是回来了查询到的成果集的数据库游标。经过ResultSet中的next()办法操作游标的方位获取成果集。
5经过ResultSet完结逻辑分页
sta=conn.createStatement();
Stringsql=”select*fromusertable”;
res=sta.executeQuery(sql);
intbegin=(curretPage-1)*pageSize+1;//指向当时页的开端数据
intend=curretPage*pageSize;//指向当时页的最终一条数据
intcurrentCount=begin;//指向当时页的第几条数据,最开端是指向第一条的
while(res.next()){
if(currentCount>=begin&&currentCount<=end){
System.out.println(
res.getInt(“id”)+”\t”+res.getString(“name”)+”\t”+res.getString(“passward”));
if(currentCount==end){
break;
}
currentCount++;
}
}
6SQL注入问题
6.1什么是SQL注入
所谓SQL注入,便是经过把含有SQL句子片段的参数刺进到需求履行的SQL句子中,最终达到诈骗数据库服务器履行歹意操作的SQL指令。
6.2SQL注入事例
//SQL注入
publicvoidsqlInject(Stringname){
Connectionconn=null;
Statementsta=null;
ResultSetres=null;
try{
Class.forName(“com.mysql.jdbc.Driver”);
conn=DriverManager.getConnection(“jdbc:mysql://localhost:3306/mysql?useSSL=false&
+”useUnicode=true&characterEncoding=utf-8″,”root”,”root”);
sta=conn.createStatement();
Stringsql=”select*fromusertablewherename='”+name+”‘”;
res=sta.executeQuery(sql);
while(res.next()){
System.out.println(res.getString(“name”)+”\t”+res.getString(“id”));
}
}catch(SQLExceptione){
e.printStackTrace();
}
}
publicstaticvoidmain(String[]args){
JDBCTesttest=newJDBCTest();
test.sqlInject(“李四’or1=1–“);//–空格在数据库中表明注释,会查出数据库中的一切数据
}
7.PreparedStatement目标的运用(重点)
7.1PreparedStatement特色:
?PreparedStatement接口承继Statement接口
?PreparedStatement功率高于Statement
?PreparedStatement支撑动态绑定参数
?PreparedStatement具有SQL句子预编译才能
?运用PreparedStatement可避免出现SQL注入问题
7.2经过PreparedStatement目标向表中刺进数据
代码
publicvoidinsert(intage,Stringname,Stringpassword){
Connectionconn=null;
PreparedStatementps=null;
Class.forName(“com.mysql.jdbc.Driver”);
conn=DriverManager.getConnection(“jdbc:mysql://localhost:3306/mysql?useSSL=false&
+”useUnicode=true&characterEncoding=utf-8″,”root”,”root”);
Stringsql=”insertintousertablevalues(default,?,?,?)”;
try{
ps=conn.prepareStatement(sql);
ps.setInt(1,age);//将第一个问号的方位设置值
ps.setString(2,name);//将第二个问号的方位设置值
ps.setString(3,password);//将第三个问号的方位设置值
ps.execute();
}catch(SQLExceptione){
e.printStackTrace();
}
}
8PreparedStatement的预编译才能
8.1什么是预编译
8.1.1SQL句子的履行步骤
?语法和语义解析
?优化sql句子,拟定履行计划
?履行并回来成果
可是很多状况,咱们的一条sql句子可能会重复履行,或许每次履行的时候只要个别的值不同(比方select的where子句值不同,update的set子句值不同,insert的values值不同)。假如每次都需求经过上面的词法语义解析、句子优化、拟定履行计划等,则功率就明显不行了。所谓预编译句子便是将这类句子中的值用占位符代替,能够视为将sql句子模板化或许说参数化预编译句子的优势在于:一次编译、屡次运转,省去了解析优化等进程;此外预编译语句能避免sql注入
8.1.2解析进程
8.1.2.1硬解析在不敞开缓存履行计划的状况下,每次SQL的处理都要经过:语法和语义的解析,优化器处理SQL,生成履行计划。整个进程咱们称之为硬解析。
8.1.2.2软解析假如敞开了缓存履行计划,数据库在处理sql时会先查询缓存中是否含有与当时SQL句子相同的履行计划,假如有则直接履行该计划。
8.2预编译办法
开端数据库的日志showVARIABLESlike’%general_log%’setGLOBALgeneral_log=onsetGLOBALlog_output=’table’
8.2.1依靠数据库驱动完结预编译
假如咱们没有敞开数据库服务端编译,那么默认的是运用数据库驱动完结SQL的预编译处理。
8.2.2依靠数据库服务器完结预编译
咱们能够经过修正衔接数据库的URL信息,增加useServerPrepStmts=true信息敞开服务端预编译。
9PreparedStatement批处理操作
代码
Stringsql=”insertintousertablevalues(default,?,?,?)”;
ps=conn.prepareStatement(sql);
for(Useruser:list){
ps.setInt(1,user.getAge());
ps.setString(2,user.getName());
ps.setString(3,user.getPassword());
ps.addBatch();
}
ps.executeBatch();//提交
10JDBC中的业务处理
在JDBC操作中数据库业务默认为主动提交。假如业务需求修正为手动提交,那么咱们需求运用Connection目标中的setAutoCommit办法来封闭业务主动提交。然后经过Connection目标中的commit办法与rollback办法进行业务的提交与回滚。
Stringsql=”deletefromusertablewherenamelike?”;
conn.setAutoCommit(false);//将业务设置为手动提交,默认是主动提交
ps=conn.prepareStatement(sql);
ps.setString(1,”%”+name+”%”);
ps.execute();
conn.commit();//提交业务
四、JDBC进阶
1动态查询
动态删除:根据用户给定的条件来决定履行什么样的查询。
//动态删除publicvoiddynamicDelete(Useruser){
Connectionconn=null;
PreparedStatementps=null;
conn=DriverManager.getConnection(“jdbc:mysql://localhost:3306/mysql?useSSL=false&+”useUnicode=true&characterEncoding=utf-8″,”root”,”root”);Stringsql=connectSQL(user);try{conn.prepareStatement(sql);}catch(SQLExceptione){e.printStackTrace();}}publicStringconnectSQL(Useruser){StringBuildersb=newStringBuilder(“deletefromusertablewhere1=1”);if(user.getAge()>0){sb.append(“andage=”).append(user.getAge());}if(user.getName()!=null){sb.append(“addname='”).append(user.getName()).append(“‘”);}if(user.getPassword()!=null){sb.append(“andpassword='”).append(user.getPassword()).append(“‘”);
}
returnsb.toString();
}

未经允许不得转载:迅闻网 » mysql jdbc(mysql和jdbc区别)
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!

 

迅闻网-让更多人看到你

登录/注册返回首页