JDBC浅析与java连接mysql数据库
最近复习到了jdbc与mysql数据库,写篇文章加深下印象,(文章部分图片来源于速学堂)
一:什么是jdbc
JDBC(Java Database Connection)为java开发者使用数据库 提供了统一的编程接口,它由一组java类和接口组成。是java 程序与数据库系统通信的标准API。JDBC API 使得开发人员 可以使用纯java的方式来连接数据库,并执行操作。
sun公司由于不知道各个主流商用数据库的程序代码,因此无 法自己写代码连接各个数据库,因此,sun公司决定,自己提 供一套api,凡是数据库想与Java进行连接的,数据库厂商自己必须实现JDBC这套接口。而数据库厂商的JDBC实现,我们就叫他此数据库的数据库驱动。
二:jdbc访问数据库流程:
大体分为4步,如下图。
三:jdbc常用接口
1.Driver接口
Driver接口由数据库厂家提供,对于java开发者而言,只需要使用 Driver接口即可。
在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序。不同的数据库有不同的装载方法。
– 驱动:就是各个数据库厂商实现的Sun公司提出的JDBC接口。 即对 Connection等接口的实现类的jar文件(链接数据库时必须先导入jar包 不然会出错)
– 装载MySql驱动 • Class.forName(“com.mysql.jdbc.Driver”);
– 装载Oracle驱动 • Class.forName(“oracle.jdbc.driver.OracleDriver”);
2.DriverManager接口
– DriverManager是JDBC的管理层,作用于用户和驱动程序之间。
– DriverManager跟踪可用的驱动程序,并在数据库和相应的驱动程序 之间建立连接。
3.Connection接口
– Connection与特定数据库的连接(会话),在连接上下文中执行 SQL 语句并返回结果。 – DriverManager的getConnection()方法建立在JDBC URL中定义的数 据库Connection连接上
– 连接MYSQL数据库:
Connection con= DriverManager.getConnection(“jdbc:mysql://host:port/database”,“user”, “password”);
– 连接ORACLE数据库:
Connection con = DriverManager.getConnection(“jdbc:oracle:thin:@ n:@host:port:databse”,“user”,“password”);
4.Statement接口
– 用于执行静态 SQL 语句并返回它所生成结果的对象。
– 三种Statement类:
• Statement:
– 由createStatement创建,用于发送简单的SQL语句。(不带参数的)
问题:可能产生sql注入,具体情况见代码
• PreparedStatement:
– 继承自Statement接口,由prepareStatement创建,用于发送含有一个或多 个输入参数的sql语句。PreparedStatement对象比Statement对象的效率更 高,并且可以防止SQL注入。我们一般都用PreparedStatement.
• CallableStatement:
– 继承自PreparedStatement 。由方法prePareCall创建,用于调用存储过程。
– 常用的Statement方法:
• execute():运行语句,返回是否有结果集。
• executeQuery():运行select语句,返回ResultSet结果集。
• executeUpdate():运行insert/update/delete操作,返回更新的行数。
5.ResultSet接口
– Statement执行SQL语句时返回ResultSet结果集。
– ResultSet提供的检索不同类型字段的方法,常用的有:
• getString():获得在数据库里是varchar、char等数据类型的对象。
• getFloat():获得杂数据库里是Float类型的对象。
• getDate():获得在数据库里面是Date类型的数据。
• getBoolean():获得在数据库里面是Boolean类型的数据
四:jdbc具体步骤
(使用前应在项目中导入相应的jar包)
• 1:加载一个Driver驱动
• 2:创建数据库连接(Connection)
• 3 :创建SQL命令发送器Statement
• 4:通过Statement发送SQL命令并得到结果
• 5:处理结果(select语句)
• 6:关闭数据库资源 • ResultSet • Statement • Connection。
五:代码实现
数据库如图
1.student
2.login
1:jdbc连接mysql数据库
package com.jdbc.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
* @author 作者 :北城
*目的:实现jdbc链接数据库(mysql)
*步骤:(使用前应在项目中导入相应的jar包)
• 1:加载一个Driver驱动
• 2:创建数据库连接(Connection)
• 3:关闭数据库资源 Connection。
*/
public class Demo01 {
public static void main(String[] args) {
Connection coon=null;
try {
//1:加载一个Driver驱动
Class.forName("com.mysql.jdbc.Driver");
// 2:创建数据库连接(Connection)
//建立连接(连接对象内部其实包含了Socket对象,是一个远程的连接。
//比较耗时!这是Connection对象管理的一个要点!)
//真正开发中,为了提高效率,都会使用连接池来管理连接对象!测试一下时间
long start=System.currentTimeMillis();
coon=DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc","root","1111");
long end=System.currentTimeMillis();
System.out.println("连接数据库成功"+coon);
System.out.println("连接用时--"+(end-start)+"ms");
} catch (ClassNotFoundException e) {
System.out.println("加载驱动失败");
e.printStackTrace();
} catch (SQLException e) {
System.out.println("连接数据库失败");
e.printStackTrace();
}finally {
//3:关闭数据库资源 Connection。
if(coon!=null) {
try {
coon.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
2:查询操作为例实现一般操作步骤
package com.jdbc.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* @author 作者 :北城
*目的:使用jdbc连接mysql数据库并进行增删改查等操作
*步骤
*(使用前应在项目中导入相应的jar包)
• 1:加载一个Driver驱动
• 2:创建数据库连接(Connection)
• 3 :创建SQL命令发送器Statement
• 4:通过Statement发送SQL命令并得到结果
• 5:处理结果(select语句)
• 6:关闭数据库资源 • ResultSet • Statement • Connection。
*/
public class Demo02 {
public static void main(String[] args) {
Connection coon=null;
Statement st=null;
ResultSet rs=null;
try {
//1:加载一个Driver驱动
Class.forName("com.mysql.jdbc.Driver");
// 2:创建数据库连接(Connection)
coon=DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc", "root", "1111");
//3 :创建SQL命令发送器Statement
st=coon.createStatement();
//4:通过Statement发送SQL命令并得到结果
String sql="select * from student";
st.execute(sql);
//5:处理结果(select语句)
rs=st.executeQuery(sql);
while(rs.next()) {
System.out.println(rs.getInt(1)+"--"+rs.getString(2)+"--"+rs.getString(3));
}
} catch (ClassNotFoundException e) {
System.out.println("加载驱动失败");
e.printStackTrace();
} catch (SQLException e) {
System.out.println("数据库连接失败");
e.printStackTrace();
}finally {
//6:关闭数据库资源 • ResultSet • Statement • Connection。
if(st!=null) {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
if(coon!=null) {
try {
coon.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
}
3:Statement的sql注入问题和用PreparedStatement基本用法
package com.jdbc.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* @author 作者 :北城
* 目的:探究Sql注入问题
*
*/
public class Demo03 {
public static void main(String[] args) {
Connection coon=null;
Statement st=null;
ResultSet rs=null;
try {
Class.forName("com.mysql.jdbc.Driver");
coon=DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc?characterEncoding=utf8", "root", "1111");
st=coon.createStatement();
String account="0 or 10=10";
String sql="select *from login where id="+account;
st.execute(sql);
rs=st.executeQuery(sql);
while(rs.next()) {
System.out.println(rs.getInt(1)+"--"+rs.getString(2)+"--"+rs.getString(3));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
if(st!=null) {
try {
st.close();
} catch (SQLException e) {
e.printStackTrace();
}
if(coon!=null) {
try {
coon.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
}
账号不对也访问了数据库,此时数据库完全没有安全性可言
package com.jdbc.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
/**
* @author 作者 :北城
* 目的:解决Sql注入问题(prepareStatment)
* PreparedStatement继承于Statement 可以解决注入问题
*
*
*/
public class Demo04 {
public static void main(String[] args) {
Connection coon=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
Class.forName("com.mysql.jdbc.Driver");
coon=DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc?characterEncoding=utf8", "root", "1111");
// String sql="insert into login (name,account,pwd) values(?,?,?)";
// ps=coon.prepareStatement(sql);
// ps.setObject(1, "上官飘雪");
// ps.setObject(2, "0001");
// ps.setObject(3, "0001");
// ps.execute();
//
String account="0 or 10=10";
String account2="0001";
String sql2="select *from login where account=?";
ps=coon.prepareStatement(sql2);
ps.setObject(1, account);
rs=ps.executeQuery();
while(rs.next()) {
System.out.println(rs.getInt(1)+"--"+rs.getString(2)+"--"+rs.getString(3));
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
if(ps!=null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(coon!=null) {
try {
coon.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
4:封装方法和JDBCUtils和采用List保存结果
package com.jdbc.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* @author 作者 :北城
*
*/
public class JDBCUtils {
public static Connection getMysqlCoon() {
try {
Class.forName("com.mysql.jdbc.Driver");
return DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc?characterEncoding=utf8", "root", "1111");
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
public static void close(ResultSet rs,Statement ps,Connection conn) {
if (rs==null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(ps!=null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(Statement ps,Connection conn) {
if(ps!=null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void close(Connection conn) {
if(conn!=null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
package com.jdbc.test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/**
* @author 作者 :北城
* 目的:封装JDBCUtils
*
*
*/
public class Demo05 {
public static void main(String[] args) {
List<Object[]> list=new ArrayList<Object[]>();
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
try {
conn=JDBCUtils.getMysqlCoon();
String sql2="select *from login";
ps=conn.prepareStatement(sql2);
//ps.setObject(1, 0001);
rs=ps.executeQuery();
while(rs.next()) {
// System.out.println(rs.getInt(1)+"--"+rs.getString(2)+"--"+rs.getString(3));
Object[] obj=new Object[3];
obj[0]=rs.getInt(1);
obj[1]=rs.getString(2);
obj[2]=rs.getString(3);
list.add(obj);
}
} catch (Exception e) {
e.printStackTrace();
}finally {
JDBCUtils.close(rs, ps, conn);
}
for(Object[] objs:list){
System.out.println(""+objs[0]+objs[1]+objs[2]);
}
}
}
```