将琴存诗
人生 可以不要那么 耀 ,只需要有 一个  平凡的梦想  足以 。—— loveincode -_^ RSS
Fork me on GitHub

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。


posted @ 2016-03-07 20:42  loveincode  阅读(412)  评论(0编辑  收藏  举报
最简单即最美
有了信仰,自己要坚持努力 2017.07.09 21:34