JDBC-数据库连接

一.JDBC原理

           JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API。是Java应用程序访问数据库的里程碑式解决方案。Java研发者希望用相同的方式访问不同的数据库,以实现与具体数据库无关的Java操作界面。JDBC定义了一套标准接口,即访问数据库的通用API,不同的数据库厂商根据各自数据库的特点去实现这些接口。

二.接口Driver

            每个驱动程序类必须实现的接口。Java SQL 框架允许多个数据库驱动程序。每个驱动程序都应该提供一个实现 Driver 接口的类。DriverManager 会试着加载尽可能多的它可以找到的驱动程序,然后,对于任何给定连接请求,它会让每个驱动程序依次试着连接到目标 URL。强烈建议每个 Driver 类应该是小型的并且是单独的,这样就可以在不必引入大量支持代码的情况下加载和查询 Driver 类。在加载某一 Driver 类时,它应该创建自己的实例并向 DriverManager 注册该实例。这意味着用户可以通过调用以下程序加载和注册一个驱动程序

Class.forName("xx.jdbc.driver.xxDriver")

三.连接接口Connection

 与特定数据库的连接(会话)

四.语句对象接口

  • Statement
  • PreparedStatement
  • CallableStatement

            Statement:用于执行静态 SQL 语句并返回它所生成结果的对象。在默认情况下,同一时间每个 Statement 对象在只能打开一个 ResultSet 对象。因此,如果读取一个 ResultSet 对象与读取另一个交叉,则这两个对象必须是由不同的 Statement 对象生成的。如果存在某个语句的打开的当前 ResultSet 对象,则 Statement 接口中的所有执行方法都会隐式关闭它。

            PreparedStatement: 表示预编译的 SQL 语句的对象。SQL 语句被预编译并存储在 PreparedStatement 对象中。然后可以使用此对象多次高效地执行该语句。

方法摘要:


五.结果集接口

             表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。ResultSet 对象具有指向其当前数据行的光标。最初,光标被置于第一行之前。next 方法将光标移动到下一行;因为该方法在 ResultSet 对象没有下一行时返回 false,所以可以在 while 循环中使用它来迭代结果集。

六.访问数据库具体流程.

  1. 加载驱动,建立连接
  2. 创建语句对象
  3. 执行SQL语句
  4. 处理结果集
  5. 关闭连接  

具体事例:

1.获取所有图书信息:

package cuit.book;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;


public class BookDAO {
	//数据库连接字符串,注意数据库的名称(20150032)和字符编码(UTF-8)
	private String JDBCURL = "jdbc:mysql://localhost:3306/20150032?useUnicode=true&characterEncoding=UTF-8";
	//数据库访问账号
	private String user = "root"; 
	//账号密码
	private String password = "123456"; 
	//数据库连接对象
	private Connection conn = null;
	//数据库操作申明
	private Statement stmt = null;
	//数据库访问结果集
	private ResultSet rst = null;
	
	/**
	 * 获取所有图书信息
	 * @return
	 */
	public List<Book> getAll(){
		List<Book> books = new ArrayList<Book>();
		try {
			//加载MySQL数据库驱动程序
			Class.forName("com.mysql.jdbc.Driver");
			//创建数据库连接
			conn = DriverManager.getConnection(JDBCURL,user,password);
			//定义数据库操作SQL语句:查询t_book表所有记录和所有字段
			String sql = "SELECT * FROM t_book";
			//创建数据库操作申明
			stmt = conn.createStatement();
			//执行数据库查询,返回结果集
			rst = stmt.executeQuery(sql);
			Book book = null;
			//对结果集进行遍历,
			while(rst.next()){
				//将每条数据封装成一个新的Book对象,一定要new
				book = new Book();
				book.setUuid(rst.getInt("id"));
				book.setBookName(rst.getString("bookname"));
				book.setPicUrl(rst.getString("pic_url"));
				book.setPrice(rst.getFloat("price"));
				//将Book对象保存到List集合中
				books.add(book);
			}	
		} catch (Exception e) {
			e.printStackTrace();
		}finally{  //一定要使用finally,释放资源
			try {
				stmt.close();  //关闭申明
				conn.close();  //关闭连接
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		//返回结果集
		return books;		
	}

根据id获取某条Book对象:

public Book getById(int id){
		Book book = null;
		try {
			//加载MySQL数据库驱动程序
			Class.forName("com.mysql.jdbc.Driver");
			//创建数据库连接
			conn = DriverManager.getConnection(JDBCURL,user,password);
			//定义数据库查询SQL语句:根据id查询t_book表某条记录的所有字段		
			String sql = "SELECT * FROM t_book WHERE ";
			sql += " id=" + id;
			System.out.println(sql);
			//创建数据库操作申明
			stmt = conn.createStatement();
			//执行数据库查询,返回结果集		
			rst = stmt.executeQuery(sql);
			while(rst.next()){
				book = new Book();
				book.setUuid(rst.getInt("id"));
				book.setBookName(rst.getString("bookname"));
				book.setPicUrl(rst.getString("pic_url"));
				book.setPrice(rst.getFloat("price"));
			}	
		} catch (Exception e) { 
			//程序运行异常处理:显示出错的堆栈信息
			e.printStackTrace();
		}finally{  //一定要使用finally,释放资源
			try {
				stmt.close();  //关闭申明
				conn.close();  //关闭连接
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return book;		
	}

添加与更新:

/**
	 * 添加Book记录
	 * @param book
	 * @return
	 */
	public int add(Book book){
		int result = -1;
		try {
			//加载MySQL数据库驱动程序
			Class.forName("com.mysql.jdbc.Driver");
			//创建数据库连接
			conn = DriverManager.getConnection(JDBCURL,user,password);
			//定义数据库新增语句
			String sql = "INSERT INTO t_book(bookname,pic_url,price) VALUES(";
			sql += "'" + book.getBookName();
			sql += "','" + book.getPicUrl();
			sql += "'," + book.getPrice() + ")";
			System.out.println(sql);
			//创建数据库操作申明
			stmt = conn.createStatement();
			//执行数据库更新操作,返回影响行数
			result = stmt.executeUpdate(sql);	
		} catch (Exception e) {
			e.printStackTrace();
		}finally{  //一定要使用finally,释放资源
			try {
				stmt.close();  //关闭申明
				conn.close();  //关闭连接
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return result;		
	}

	/**
	 * 根据id更新Book信息
	 * @param book
	 * @return
	 */
	public int update(Book book){
		int result = -1;
		try {
			//加载MySQL数据库驱动程序
			Class.forName("com.mysql.jdbc.Driver");
			//创建数据库连接
			conn = DriverManager.getConnection(JDBCURL,user,password);
			//定义数据库更新语句		
			String sql = "UPDATE t_book SET";
			sql += " bookname='" + book.getBookName();
			sql += "',pic_url='" + book.getPicUrl();
			sql += "',price=" + book.getPrice() + " WHERE ";
			sql +=	" id="	+ book.getUuid();
			System.out.println(sql);
			//创建数据库操作申明
			stmt = conn.createStatement();
			//执行数据库更新操作,返回影响行数		
			result = stmt.executeUpdate(sql);	
		} catch (Exception e) {
			e.printStackTrace();
		}finally{  //一定要使用finally,释放资源
			try {
				stmt.close();  //关闭申明
				conn.close();  //关闭连接
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return result;		
	}

注意:利用SQL注入存在安全问题,建议用预处理。


删除:

/**
	 * 根据id删除Book对象
	 * @param bookid
	 * @return
	 */
	public int delete(int bookid){
		int result = -1;
		try {
			//加载MySQL数据库驱动程序
			Class.forName("com.mysql.jdbc.Driver");
			//创建数据库连接
			conn = DriverManager.getConnection(JDBCURL,user,password);
			//定义数据库删除语句			
			String sql = "delete from t_book WHERE";
			sql +=	" id="	+ bookid;
			System.out.println(sql);
			//创建数据库操作申明
			stmt = conn.createStatement();
			//执行数据库更新操作,返回影响行数		
			result = stmt.executeUpdate(sql);
		} catch (Exception e) {
			e.printStackTrace();
		}finally{  //一定要使用finally,释放资源
			try {
				stmt.close();  //关闭申明
				conn.close();  //关闭连接
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
		return result;		
	}

测试:

/**
	 * BookDAO方法测试
	 * @param args
	 */
	public static void main(String[] args) {
		BookDAO bookDao = new BookDAO();	
		//删除测试
		System.out.println("delete:" + bookDao.delete(1));
		//查询测试
		Book book = bookDao.getById(2);
		if(book != null){
			System.out.println("book:" + book.toString());
		}
		//查询集合测试
		for(Book book1 : bookDao.getAll()){
			System.out.println(book1.toString());
		}
	}

}


 



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值