其他分享
首页 > 其他分享> > JDBC学习笔记!

JDBC学习笔记!

作者:互联网

JDBC:Java DataBase Connectivity

JDBC是sun公司制定的一套接口,目的是为了进行面向接口编程。因为每个数据库底层实现原理不一样,这就需要制定这样一套接口来连接各大数据库。
为什么面向接口编程:解耦合。降低程序的耦合度,提高程序的扩展力。

DriverManager.registerDriver(Driver driver);
Connection conn = DriverManager.getConnection(String url,String user,String password);

url是网络资源定位符,由协议,ip地址,端口号,虚拟目录,文件名组成。

Statement stem = conn.createStatment()
String sql = "即将要执行的sql语句";
int count = stem.executeUpdate(String sql)//这条语句只能执行update,delete,insert语句,sql为要发送给数据库的sql语句
返回整数表示这条语句改变了数据库多少信息条数

怎么有效记住这六步,首先,注册驱动,如果要与数据库产生关系首先要连接起来,然后要执行Sql语句的话,要先获取数据库对象,然后才能对数据库进行操作,然后就是执Sql语句,对结果集进行处理,最后释放资源,关闭通道。

import java.sql.*;

public static void main(String[] args){
	Connection conn = null;
	Statement stem = null;
	try{
		//注册驱动
		//DriverManager.registDriver(new com.mysql.jdbc.Driver());这种方法不常使用,有一种更好的方法就是使用类加载
		//Class.forName(String path);
		Class.forName("com.mysql.jdbc.Driver");
		//使用类加载可以直接执行类中的静态代码块
		
		//获取连接
		String url = "*****";
		String user = "******";
		String password = "*********";
		
		conn = DriverManager.getConnection(url,user,passwoer);
		
		//获取数据库操作对象
		stem = conn.createStatement();
		//执行sql语句
		String sql = "sql语句";
		int count = stem.executeUpdate(sql);
		System.out.println(count == 1? "数据库连接成功" : "数据库连接失败");
	}catch(SQLException e){
		e.printStackTrace();
	}finall{
		//释放资源
		if(stem != null){
			try(){
				stem.close();			
			}catch(SQLException e){
				e.printStackTrace();
			}
		}
		if(conn != null){
			try(){
				conn.close();
			}catch(SqlException e){
				e.printStackTrace();
			}
		}
	}
}

在实际开发中,我们将用户名及密码通常写在配置文件中,再通过资源绑定器(ResourceBundle来获取)

import java.sql.*;
import java.uti.*;

public static void main(String[] args){
	//将用户名,密码,ip,协议写在属性配置文件里,然后通过ResourceBundle获取用户名,密码
	Connection conn = null;
	Statement stem = null;
	ResultSet rs = null;//用来处理查询结果集
	ResourceBundle re = ResourceBundle.getBundle("jdbc");
	String user = re.getString("user");
	String password = re.getString("password");
	String url = re.getString("url");
	String driver = re.getString("driver");
	try{
		Class.forName(driver);
		conn = DriverManager.getConnection(url,user,passwoer);
		stem = conn.createStatement();
		String sql = "sql语句";
		int count = stem.executeUpdate(sql);//支持增删改语句
		rs = stem.executeQuery(sql);//获取指定的sql查询语句,返回单个ResultSet对象
		/*
		对查询结果集进行遍历
		rs.next()将当前光标移至下一行,如果下一行有数据返回true,没有返回false
		
		while(rs.next()){
		
			//通过指定列获取查询结果集中的内容
			String no = rs.getString(1);
			String nnum = rs.getString(2);
			String name = rs.getString(3);
			
			//这种方法更为健壮
			//get方法中的字符串是sql查询语句中的名字,
			//比如select sno as no from t_student get方法里面的字符串应该是no而不是sno
			
			String no = rs.getString("no");
			String num = rs.getString("num");
			String name = rs.getString("name");
			//并不是只有getString()一种方法,还有getInt(" "),getDouble("")等方法
		}
		*/
		System.out.println(count == 1? "成功" : "失败");
	}catch(SQLException e){
		e.printStackTrace();
	}finall{
		if(stem != null){
			try(){
				stem.close();			
			}catch(SQLException e){
				e.printStackTrace();
			}
		}
		if(conn != null){
			try(){
				conn.close();
			}catch(SqlException e){
				e.printStackTrace();
			}
		}
	}
}

使用JDBC的好处

使用JDBC过程中使用的类

DriverManager(Conection conn = DriverManager.getConnection();连接数据库)
Statement(Statement stem = conn.createStatement();创建数据库操作对象)
ResultSet rs = stem.executeQuery(String sql);执行选择语句用executeQuery()
int count = stem.executeUpdate(String sql);执行增删改语句

Sql注入

原语句:

Statement stem = null;
stem = conn.getConnection();
String sql = "select * from t_user where loginName = '"+loginName+"'and loginPwd = '"+loginPwd+"'"
stem.executeQuery(sql);

修改后:

PreparedStatement ps = null;
//?被称作占位符
String sql = "select * from t_user where loginName = ? and loginPwd = ?";
ps = conn.prepareStatement(sql);
//给占位符赋值,赋的是什么值就用set什么,jdbc的下标是从1开始的
ps.setrString(1,loginName);
ps.setString(2,loginPwd);
ps.execureQuery();
//然后接下来的executeQuery()就不用再传递sql语句了;

Statement与PreparedStatement的区别

事务

JDBC工具类的封装

public class Test{
	public static void main(String[] args){
		Connection conn = null;
		PreparedStatement ps =null;
		ResultSet rs = null;
		try{
			//获取数据库操作对象
			conn = DBUtil.getConnection();
			//sql语句
			String sql = "select * from t_user where name = ?";
			ps = conn.prepareStatement(sql);
			//模糊查询
			ps.setString(1,"_A%");
			rs = ps.executeQuery();
			while(rs.next()){
				System.out.println(rs.getString("name"));
			}
		}catch(Exception e){
			e.printStackTrace();
		}finally{
		//		释放资源
			DBUtils.close(conn,stem,rs);
		}
	}
}



public class DBUtils{
	private DBUTils{};
	static{
	//静态代码块在类加载的时候执行且执行一次
		try{
			Class.forName("com.mysql.jdbc.Driver");
		}catch(Execption e){
			e.printStackTrace();
		}
	}
	//由于在调用这个类的类中有try catch所以这里直接抛出Exception即可
	public static Connection getConnection() throws Exception{
		return DriverManager.getConnection(url,user,password);
	}
	public static void close(Connection conn, PreparedStatement ps, ResultSet rs){
		if(rs != null){
			try{
				rs.close();
			}catch(Exception e){
				e.printStackTrace();
			}
		}

		if(stem != null){
			try{
				stem.close();
			}catch(Exception e){
				e.printStackTrace();
			}
		}

		if(conn != null){
			try{
				conn.close();
			}catch(Exception e){
				e.printStackTrace();
			}
		}
	}
}

行级锁(行级锁)

标签:语句,JDBC,String,rs,笔记,stem,学习,sql,conn
来源: https://blog.csdn.net/m0_48847163/article/details/115440643