0202 JDBC

JDBC是接口,JDBC中提供了一种工具和接口让开发人员能够编写数据库的程序

java提供的访问数据规范叫JDBC,生产厂商提供规范的数据类称为驱动

导入驱动jar包:

(1)创建lib目录,用于存放当前项目需要的所有jar包

(2)选择jar包,右键执行build path / Add to Build Path

以mySql为例

JDBC开发步骤

(1)注册驱动:Class.forName("com.mysql.jdbc.Driver");

(2)获得链接:

String url="jdbc:mysql://localhost:3306/java1127?characterEncoding=utf-8";
String user="root";
String pwd="123456";
Connection conn=DriverManager.getConnection(url,user,pwd);

(3)获得sql执行语句对象:

格式:

String sql = "某SQL语句";

获取Statement语句执行平台:Statement stmt = con.createStatement();

该对象的常用方法: 

int executeUpdate(String sql); --执行insert update delete语句.

ResultSet executeQuery(String sql); --执行select语句

(4)执行sql语句

(5)处理结果集:

处理结果集常用方法:因为查询到的结果是放在resultSet结果集里边需要去遍历得到每一个值,

rs.next();//指向第一行 rs.getInt(1);//获取第一行第一列的数据,类似迭代器

注:如果是用的查询则需要处理结果集,如果是其他的不用这一步

(6)释放资源:按照先开后关原则

代码展示:

public class Demo01 {

	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		// TODO Auto-generated method stub

		//注册驱动
		Class.forName("com.mysql.jdbc.Driver");
		//获得连接对象
		String url="jdbc:mysql://localhost:3306/java1127?characterEncoding=utf-8";
		String user="root";
		String pwd="123456";
		Connection conn=DriverManager.getConnection(url,user,pwd);
		//获得语句执行对象
		Statement sta=conn.createStatement();
		//执行sql语句
		String sql="insert into sort(sname,sdesc) value('口红','骗钱')";
		int row=sta.executeUpdate(sql);
		System.out.println(row);
		//释放资源
		sta.close();
		conn.close();
	}
}

  SQL注入问题:

当我们模拟一个登录界面

代码展示

public class Demo03 {

	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		// TODO Auto-generated method stub

		//注册驱动
		Class.forName("com.mysql.jdbc.Driver");
		//获得链接对象
		String url="jdbc:mysql://localhost:3306/java1127?characterEncoding=utf-8";
		String user="root";
		String pwd="123456";
		Connection conn=DriverManager.getConnection(url,user,pwd);
		//获取语句执行对象
		Statement sta=conn.createStatement();
		//执行sql语句
		Scanner sc=new Scanner(System.in);
		System.out.println("请输入用户名");
		String name=sc.next();
		System.out.println("请输入密码");
		String password=sc.next();
		String sql="select count(*)from user where uname='"+name+"' and pwd='"+password+"' ";
		ResultSet rs=sta.executeQuery(sql);
		//处理结果集
		int count=0;
		while(rs.next()){
			count=rs.getInt(1);
		}
		if(count>0){
			System.out.println("登陆成功");
		}else{
			System.out.println("用户名或密码错误");
		}
		//释放资源
		rs.close();
		sta.close();
		conn.close();
		
	}

}

  当用户输入密码 ‘or’ 1=1;类似这种数据也能登录成功,原因是代码中运用了字符拼接,误将用户输入的or当做了代码中的关键字去使用,多以导致了这样的结果,那为了避免这个结果的发生,提供了预处理对象去创建sql语句执行对象,预处理对象PreparedStatement,建议用预处理对象时建议将所有的实际参数用?代替,然后用setInt,setString方法为?赋准确的值

运用预处理对象,代码展示

public class Demo04 {

	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		// TODO Auto-generated method stub

		//注册驱动
		Class.forName("com.mysql.jdbc.Driver");
		//获得链接对象
		String url="jdbc:mysql://localhost:3306/java1127?characterEncoding=utf-8";
		String user="root";
		String pwd="123456";
		Connection conn=DriverManager.getConnection(url,user,pwd);
		//获取语句执行对象
		String sql="select count(*) from user where uname=? and pwd=?";
		PreparedStatement pst=conn.prepareStatement(sql);
		//执行sql语句
		Scanner sc=new Scanner(System.in);
		System.out.println("请输入用户名");
		String name=sc.next();
		System.out.println("请输入密码");
		String password=sc.next();
		//给占位符赋值
		pst.setString(1, name);
		pst.setString(2, password);
		ResultSet rs=pst.executeQuery();
		//处理结果集
		int count=0;
		while(rs.next()){
			count=rs.getInt(1);
		}
		if(count>0){
			System.out.println("登陆成功");
		}else{
			System.out.println("用户名或密码错误");
		}
		//释放资源
		rs.close();
		pst.close();
		conn.close();
		
	}

}

  

1、插入

public class Demo05 {

	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		// TODO Auto-generated method stub

		//注册驱动
		Class.forName("com.mysql.jdbc.Driver");
		//获得链接对象
		String url="jdbc:mysql://localhost:3306/java1127?characterEncoding=utf-8";
		String user="root";
		String pwd="123456";
		Connection conn=DriverManager.getConnection(url,user,pwd);
		//获得语句执行兑现
		String sql="insert into sort(sname,sdesc) value(?,?)";
		PreparedStatement pst=conn.prepareStatement(sql);
		//执行sql
		pst.setString(1, "汽车");
		pst.setString(2, "男人的钱");
		int row=pst.executeUpdate();
		System.out.println(row);
		//释放资源
		pst.close();
		conn.close();
		
	}

}

  

2、修改

ublic class Demo06 {

	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		// TODO Auto-generated method stub

		//注册驱动
		Class.forName("com.mysql.jdbc.Driver");
		//获得链接对象
		String url="jdbc:mysql://localhost:3306/java1127?characterEncoding=utf-8";
		String user="root";
		String pwd="123456";
		Connection conn=DriverManager.getConnection(url,user,pwd);
		//获得语句执行兑现
		String sql="update sort set sname=?,sdesc=? where sid=?";
		PreparedStatement pst=conn.prepareStatement(sql);
		//执行sql
		//给占位符赋值
		pst.setString(1, "修脚");
		pst.setString(2, "抠脚");
		pst.setInt(3, 1);
		int row=pst.executeUpdate();
		System.out.println(row);
		//释放资源
		pst.close();
		conn.close();
		
	}

}

  

3、删除

public static void shanchu() throws ClassNotFoundException, SQLException{
		//注册驱动
		Class.forName("com.mysql.jdbc.Driver");
		//获得链接
		String url="jdbc:mysql://localhost:3306/java1127?characterEncoding=utf-8";
		String user="root";
		String pwd="123456";
		Connection conn=DriverManager.getConnection(url,user,pwd);
		//获取第二个数据库对象
		Scanner sc=new Scanner(System.in);
		System.out.println("请您输入您要删除的序号");
		int id2=sc.nextInt();
		String sql3="delete from sort where sid=?";
		PreparedStatement pst3=conn.prepareStatement(sql3);
		pst3.setInt(1, id2);
		int row3=pst3.executeUpdate();
		if(row3>0){
			System.out.println("删除成功!");
		}
		//释放资源
				pst3.close();
				conn.close();
	}

  

4、查询

public class Demo07 {

	public static void main(String[] args) throws ClassNotFoundException, SQLException {
		// TODO Auto-generated method stub

		//注册驱动
		Class.forName("com.mysql.jdbc.Driver");
		//获得链接对象
		String url="jdbc:mysql://localhost:3306/java1127?characterEncoding=utf-8";
		String user="root";
		String pwd="123456";
		Connection conn=DriverManager.getConnection(url,user,pwd);
		//获得语句执行兑现
		String sql="select * from sort";
		PreparedStatement pst=conn.prepareStatement(sql);
		//执行sql
		ResultSet rs=pst.executeQuery();
		//处理结果集
		while(rs.next()){
			System.out.println(rs.getInt("sid")+".."+rs.getString("sname")+"..."+rs.getString("sdesc"));
		}
		//释放资源
		rs.close();
		pst.close();
		conn.close();
		
	}

}

  

上一篇:leetcode 有效括号和循环队列


下一篇:神秘题目4