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