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);
	  }
	}
}
				
时间: 2024-10-05 17:44:47

JavaWeb 后端 <八> 之 JDBC基礎(全)的相关文章

JavaWeb 后端 &lt;九&gt; 之 JDBC加强

一.大结果集的分页(重点,难点) 1.分批次查询:分页 2.基于数据库的分页:依赖的是数据库的分页语句(不同数据库是不同的) MySQL:每页显示10条. select * from XXX limit M,N; M:开始记录的索引.第一条记录的索引为0. N:一次查询几条记录. 第一页:select * from CUSTOMERS limit 0,10; 第二页:select * from CUSTOMERS limit 10,10; ...... 第n页:select * from CUS

邁向IT專家成功之路的三十則鐵律 鐵律八:IT人學習之道-基礎功

修練過中國武術的人都知道,任何一種拳法的學習最重要的就是基礎功,而基礎功又可分為內在與外在的修練,內在的修練強調在平心.靜氣.不爭的調息.至於外在這首重在站樁.鬆沉.不疾不徐的應對能力.有了深厚基礎的奠定,才能訓練出真正的武林高手.同樣的在IT技能專業的學習之路上,我們經常得在一兩年之內,就必須吸收一項全新的技術與應用,如何對於一門全新的技術並快速上手,以及擁有從故障排除到系統效調的能力,這些都得仰賴您相關的基礎功是否修練完善. 筆者曾經看過一些從事IT技術服務工作的朋友,對於「技術」這門課的學

文明5新手的基礎知識

文明玩到現在也累積了一些經驗.由於功力不夠,只能提供一些基礎中的基礎,盼能拋磚引玉,還請高手們不吝指正. 一.        坐城: 移民坐城的規則,應該已經是常識了.當一座城建立時,就會產生4紅臉(3城市紅臉和1人口紅臉).而城本身基礎產出是2糧1鎚.當坐地的地形+資源超過這個基礎值就維持,不夠就補滿. 舉例來說,丘陵的基本產出是2鎚.因此在丘陵上坐城,因為沒糧所以會補上2糧.而2鎚的部分會保留,所以城市產出就是2糧2鎚.這也就是許多人喜歡開在丘陵的緣故(另外還有防禦力的加乘). 如果坐在丘陵

JavaWeb 后端 &lt;二&gt; 之 Servlet 学习笔记

JavaWeb 后端 <二> 之 Servlet 学习笔记 一.Servlet概述 1.什么是Servlet Servlet是一个运行在服务器端的Java小程序,通过HTTP协议用于接收来自客户端请求,并发出响应. 2.Servlet中的方法 public void service(ServletRequest req,ServletResponse res) throws ServletException,java.io.IOException ServletRequest req:代表着请

GO語言基礎教程:流程控制

在開始一個新的章節之前先來回顧上一篇文章的部份,首先我們來看這段代碼: package main import ( "fmt" ) func main(){ var x,y int=1,2 { var x int=2 { var x int=3 fmt.Println(x,y) //首先輸出3,2 如果我把這行輸出語句注解掉,大家猜猜會如何? } fmt.Println(x,y) //其次輸出2,2 } fmt.Println(x,y) //最後輸出1,2 } 執行結果我已經加到註釋內

GO語言基礎教程:數據類型,變量,常量

GO類似PHP,每行的結尾要加分號來結束,不同點在於GO對此並不強制,這一點又像javascript,另外GO的語句塊是用一對大括號來包裹的,但是go要求左大括號必須要在語句的結尾處,不能在行首出現左大括號,這是一個新的特性,至少在我接觸的編程語言中第一次遇到這種狀況.還有就是GO對大小寫敏感,這一點相信大家不會有什麽爭議.    GO語言的註釋方法和PHP是相同的,單行註釋用//,而多行註釋用/*註釋內容*/,這一點是沒差別的. Go有眾所周知的數據類型int,這個類型很特殊,他會自動根據您的

Linux # 基礎匯總

主題彙總: Linux 輸入法/裝機軟件/rpm 安装 Linux 輸入法: 註:安裝了sougou後,切換很方便,shift直接漢英切換 Linux 修改键盘设置_helengreens_新浪博客 http://blog.sina.com.cn/s/blog_5445585e0100ophj.html Linux设备配置之键盘配置 - 51CTO.COM http://os.51cto.com/art/201101/243342.htm 裝機軟件 http://www.onlinedown.n

深入探索spring技术内幕(八): Spring +JDBC组合开发和事务控制

一. 配置数据源 <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="org.gjt.mm.mysql.Driver"/> <property name="

JDBC之——一个单线程JDBC基类和一些注意事项

下面的一个DBase基类提供了一些jdbc的基本操作,配置文件的配置部分并不准确,只是在自己机器上的mysql中测试过.. 数据库的增删改方法中都在开始调用了getConnection方法,末尾调用了Close方法:数据库的查询中没有调用close方法,因为一旦调用了close方法,就无法用RecodeSet操作查询结果了,所以在调用了查询方法后,要调用close方法,防止出现 too many connections 错误. 此外,DBase中的所有对象都是static的,所以在使用时不要调用