zoukankan      html  css  js  c++  java
  • JavaWeb 后端 <八> 之 JDBC基礎(全)

    一、JDBC简介

    1、JDBC是SUN公司为了简化操作数据推出一套规范。数据库厂商的驱动就是对JDBC的实现。

    2、Java Data Base Connectivity(java数据库连接),它主要由接口组成。

      java.sql.*    javax.sql.*   JDK中

      数据库的驱动jar包 (mysql-connector-java-5.0.8-bin.jar )

    二、JDBC的编码步骤

    0、前提:拷贝数据库的驱动到构建路径中(classpath)

    1、注册驱动

    2、获取与数据库的链接

    3、创建代表SQL语句的对象

    4、执行SQL语句

    5、如果是查询语句,需要遍历结果集

    6、释放占用的资源

    public class JdbcDemo1 {
    
      public static void main(String[] args) throws SQLException {
    	// 1、注册驱动
    	DriverManager.registerDriver(new com.mysql.jdbc.Driver());
    	// 2、获取与数据库的链接
    	Connection conn = DriverManager.getConnection(
    			"jdbc:mysql://localhost:3306/day15", "root", ""); //没有密码则“” 空
    	// System.out.println(conn.getClass().getName()); 要想知道具体类型,就这么办
    	// 3、创建代表SQL语句的对象
    	Statement stmt = conn.createStatement();
    	// 4、执行SQL语句
    	ResultSet rs = stmt.executeQuery("select id,name,password,email,birthday from users");
    	// 5、如果是查询语句,需要遍历结果集
    	while (rs.next()) {
    		System.out.println("---------------------");
    		System.out.println(rs.getObject("id"));
    		System.out.println(rs.getObject("name"));
    		System.out.println(rs.getObject("password"));
    		System.out.println(rs.getObject("email"));
    		System.out.println(rs.getObject("birthday"));
    	}
    	// 6、释放占用的资源
    	rs.close();
    	stmt.close();
    	conn.close();
      }	
    }
    

    三、JDBC中常用的接口详解

    1、DriverManager:

      作用:

        a、注册驱动:

        方式一:(不建议使用)

        DriverManager.registerDriver(new com.mysql.jdbc.Driver());

        原因:1、依赖具体驱动。2、导致驱动注册2遍

        方式二:(建议)

        Class.forName("com.mysql.jdbc.Driver");

        b、获取与数据库的链接

          url:SUN和数据库厂商间的协议。具体查阅数据库的文档。

          public static Connection getConnection(String url,String user,String password)

                                    throws SQLException

          public static Connection getConnection(String url,Properties info)

                                    throws SQLException

          public static Connection getConnection(String url)

                                    throws SQLException

    2、Connection

    所有的数据库操作都是基于链接之上的。

    Statement createStatement():创建向数据库发送sql的statement对象。

    //2、获取与数据库的链接
    //方式一:
    //Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day15", "root", "sorry");
    		
    //方式二:
    //Properties props = new Properties();
    //props.setProperty("user", "root");//  参数名:参考数据库的文档
    //props.setProperty("password", "sorry");
    //props.setProperty("useUnicode", "true");//编码有关的参数
    //props.setProperty("characterEncoding", "utf8");
    //Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day15",props);
    		
    //方式三
    Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day15?user=root&password=sorry");
    		

     Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day15?user=root&password=");

    3、Statement

    Statement stmt = conn.createStatement();

    作用:代表SQL语句对象。可以向数据库发送任何的SQL语句

    ResultSet executeQuery(String sql):sql一般都是查询语句

    int executeUpdate(String sql):sql一般是DML语句。insert update delete。返回值,操作几条记录。

    boolean execute(String sql):sql可以是任意的语句。返回值不是代表成功与否。如果是查询语句,就有结果集,返回true。没有返回结果集的,返回false。

    4、ResultSet

    作用:封装了查询的结果集

    ResultSet rs = stmt.executeQuery("select id,name,password,email,birthday from users");
    List<User> users = new ArrayList<User>();
    while(rs.next()){
      User user = new User();
      user.setId(rs.getInt("id"));
      user.setName(rs.getString("name"));
      user.setPassword(rs.getString("password"));
      user.setEmail(rs.getString("email"));
      user.setBirthday(rs.getDate("birthday"));
      users.add(user);
    }
    

    boolean next():游标下移。返回值是有无记录

    boolean previous():游标上移。

    boolean absolute(int count):定位到指定的行。第一行是1。

    void beforeFirst():移动游标到第一行的前面。

    void afterLast():移动游标到最后一行的后面。

    四、释放占用的资源

    //释放资源
    //JDBC编码的代码模板
    public class JdbcDemo5 {
    public static void main(String[] args) {
    	Connection conn = null;
    	Statement stmt = null;
    	ResultSet rs = null;
    	try {
    		Class.forName("com.mysql.jdbc.Driver");
    		conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/day15", "root", "sorry");
    		stmt = conn.createStatement();
    		rs = stmt.executeQuery("select id,name,password,email,birthday from users");
    		List<User> users = new ArrayList<User>();
    		while (rs.next()) {
    			User user = new User();
    			user.setId(rs.getInt("id"));
    			user.setName(rs.getString("name"));
    			user.setPassword(rs.getString("password"));
    			user.setEmail(rs.getString("email"));
    			user.setBirthday(rs.getDate("birthday"));
    			users.add(user);
    		}
    	} catch (Exception e) {
    		e.printStackTrace();
    	} 
          finally { if (rs != null) {   try {     rs.close();   } catch (SQLException e) {     e.printStackTrace();        }    rs = null; } if (stmt != null) {   try {     stmt.close();   } catch (SQLException e) {     e.printStackTrace();   }   stmt = null; } if (conn != null) {   try {     conn.close();   } catch (SQLException e) {     e.printStackTrace();   }   conn = null; } }   } }

    五、JDBC进行CRUD(增刪改查)操作

    工具類:

    getConnection() return conn; 獲取連接

    配置文件放在 dbcgf.properties 中

    release () 施放資源
    //工具类
    public class JdbcUtil {
    	
    private static String driverClass;
    private static String url;
    private static String user;
    private static String password;
    	
    static{
      try {
    	ClassLoader cl = JdbcUtil.class.getClassLoader();
    	InputStream in = cl.getResourceAsStream("dbcfg.properties");
    	Properties props = new Properties();
    	props.load(in);
    	driverClass = props.getProperty("driverClass");
    	url = props.getProperty("url");
    	user = props.getProperty("user");
    	password = props.getProperty("password");
    			
    	Class.forName(driverClass);
    	} catch (Exception e) {
    		throw new ExceptionInInitializerError(e);
    		}
    	}
    	
    	public static Connection getConnection() throws Exception{
    	  Connection conn = DriverManager.getConnection(url,user, password);
    	  return conn;
    	}
    	public static void release(ResultSet rs,Statement stmt,Connection conn){
    	  if(rs!=null){
    		try {
    		  rs.close();
    		} catch (SQLException e) {
    		  e.printStackTrace();
    		}
    		  rs = null;
    		}
    		if(stmt!=null){
    		try {
            	  stmt.close();
          	} catch (SQLException e) {
    		    e.printStackTrace();
    	  	}
    		  stmt = null;
    		}
    		if(conn!=null){
    		try {
    		  conn.close();
    		] catch (SQLException e) {
    			e.printStackTrace();
    		}
    		  conn = null;
    		}
    	}
    }
    
    
    

     測試:

    package com.yif.jdbc;
    import java.sql.Connection;
    import java.sql.ResultSet;
    import java.sql.Statement;
    
    import org.junit.Test;
    import com.yif.util.JdbcUtil;
    
    public class JdbcDemo6 {
    	@Test
    	  public void testAdd(){
    	  Connection conn = null;
    	  Statement stmt = null;
    	  ResultSet rs = null;
    	  try{
    	    conn = JdbcUtil.getConnection();
    	    stmt = conn.createStatement();
    	    stmt.executeUpdate("insert into users (name,password,email,birthday) values ('范青霞','123','fqx@itcast.cn','2000-10-01')");
    	  }catch(Exception e){
    	    throw new RuntimeException(e);
    	  }finally{
    	    JdbcUtil.release(rs, stmt, conn);
    	  }
    	}
    	@Test
    	public void testUpdate(){
    	  Connection conn = null;
    	  Statement stmt = null;
    	  ResultSet rs = null;
    	  try{
    	    conn = JdbcUtil.getConnection();
    	    stmt = conn.createStatement();
    	    stmt.executeUpdate("update users set password=111 where id=4");
    	  }catch(Exception e){
    	    throw new RuntimeException(e);
    	  }finally{
    	    JdbcUtil.release(rs, stmt, conn);
    	  }
    	}
    	@Test
    	public void testDelete(){
    	  Connection conn = null;
    	  Statement stmt = null;
    	  ResultSet rs = null;
    	  try{
    	    conn = JdbcUtil.getConnection();
    	    stmt = conn.createStatement();
    	    stmt.executeUpdate("delete from users where id=1");
    	  }catch(Exception e){
    	    throw new RuntimeException(e);
    	  }finally{
    	    JdbcUtil.release(rs, stmt, conn);
    	  }
    	}
    }
    

    sql 注入 :

    1、用户的表单输入域:防止一些特殊字符。

    2、对密码加密:MD5加密

    PreparedStatement接口

    1、支持SQL的预编译。得到该对象时,就必须给他SQL语句。

    2、支持参数占位符:  ?  一个问号代表着一个参数。

    注:能用PreparedStatement就不要用Statement。

    
    
  • 相关阅读:
    事件对象3
    事件对象2
    事件对象1
    编码、摘要、加密
    身份证号码的组成
    Oracle的TO_CHAR()格式化数字为百分数的字符串
    转载和补充:Oracle中的一些特殊字符
    linux Shell(待学)
    linux 管道相关命令(待学)
    linux用户权限、系统信息相关命令(待学)
  • 原文地址:https://www.cnblogs.com/loveincode/p/5251835.html
Copyright © 2011-2022 走看看