JDBC浅析与java连接mysql数据库(java)

本文介绍了JDBC的基本概念、访问数据库的流程、主要接口的作用,包括Driver、DriverManager、Connection、Statement和ResultSet。详细阐述了JDBC连接MySQL数据库的步骤,并通过示例展示了Statement和PreparedStatement的使用,特别提到了PreparedStatement防止SQL注入的安全性。同时,讨论了JDBC操作数据库的封装方法和JDBCUtils工具类的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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]);
		 }
		}
		
	}
 



```![在这里插入图片描述](https://img-blog.csdnimg.cn/20190603164119227.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ0MDk1NDYw,size_16,color_FFFFFF,t_70)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值