JDBC技术与JavaBean对数据的处理

一、JDBC 与数据库进行交互
Java数据库连接技术(Java DataBase Connectivity),Java 程序要与数据库进行交互,必须使用JDBC技术。JDBC 有一系列的API,这些API对数据进行操作,它们在Java.sql包与Javax.sql包中。同时,要与数据库连接,则还需要数据库厂商提供的连接驱动。

(一)JDBC 工厂原理
JDBC技术与JavaBean对数据的处理_第1张图片
(二) JDBC操作步骤

1.加载驱动,驱动由数据库生产厂商提供。
2.通过驱动管理器创建与数据库的连接对象Connection对象
3.向数据库发送SQL指令。
4.根据SQL指令的返回结果对数据进行处理。返回结果有两种:增删改,从数据库返回一个int型的数据,表示数据库受影响行数。查询则返回一个查询结果集。
5.关闭数据库连接对象Connection。

案例:增删改操作

// 1. 加载驱动,驱动名称表示需要连接什么类型的数据库
try {
	Class.forName("com.mysql.jdbc.Driver");  
} catch (ClassNotFoundException e) {
System.err.println(e.getMessage());
}
// 2.通过驱动管理类创建连接,与数据库建立联系,创建连接需要3个参数,数据库服务器的地址,用户名,密码
// 连接字符串上的?characterEncoding=utf-8作用是解决SQL指令中的中文乱码问题。
Connection connection=null;
try {
	connection = DriverManager.getConnection(						 
"jdbc:mysql://localhost:3306/myschool?characterEncoding=utf-8","root","");
	//通过连接对象创建命令对象
	Statement st =  connection.createStatement();
	//这是增删改的操作,返回一个int值,表示数据库受影响的行数
	int result =  st.executeUpdate("insert into admin values(null,'sgxy','123456','否')");
	if(result == 1)
		System.out.println("操作成功");
	else 
		System.out.println("操作失败");
	} catch (SQLException e) {
	    System.err.println(e.getMessage());
	}finally {
		try {
			connection.close();//关闭连接
		} catch (SQLException e) {
			System.err.println(e.getMessage());
		}  
}

查询操作,登录实现

// 1. 加载驱动,驱动名称表示需要连接什么类型的数据库
try {
	Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
	System.err.println(e.getMessage());
}
// 2.通过驱动管理类创建连接,与数据库建立联系,创建连接需要3个参数,数据库服务器的地址,用户名,密码
// 连接字符串上的?characterEncoding=utf-8作用是解决SQL指令中的中文乱码问题。
Connection connection = null;
try {
	connection = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/myschool?characterEncoding=utf-8","root", "");
	// 通过连接对象创建命令对象
	Statement st = connection.createStatement();
String sql = "select count(*) from admin where loginId='" + name + "' and loginPwd='" + pwd + "'";
	// 查询,从数据库返回的是一个结果集,用ResultSet对象接收。
	ResultSet rs = st.executeQuery(sql);
// next方法是向下读取一条数据,如果有数据,则返回true,如果没有数据,返回false
if (rs.next()) { 		
// 获取数据
	   int result = rs.getInt(1); // 1表示数据行中第一列的数据
	  // 从数据库进行查询,用户名和密码是否正确。
		if (result == 1) { // 登录成功,跳转到首页
			// 判断是否需要保存用户名与密码到cookie中。
			if (request.getParameter("isSave") != null) {
				Cookie c1 = new Cookie("n", name);
				Cookie c2 = new Cookie("p", pwd);
				c1.setMaxAge(120); // 设置Cookie的过期时间,单位是秒
				c2.setMaxAge(120);
				// 把Cookie写出到客户端
				response.addCookie(c1);
				response.addCookie(c2);
			}
			// 把当前登录的用户信息存储在Session中
			request.getSession().setAttribute("userName", name);
			// 跳转叫页面重定向,会产生新的请求,一共向服务发送两次请求,浏览器的地址栏改变
			response.sendRedirect("index.jsp");
		} else { // 失败,跳转到登录页
			request.setAttribute("name", name);
			request.setAttribute("pwd", pwd);
			request.setAttribute("msg", "登录失败,用户名或密码错误..");
			// 页面转发,不会产生新的请求,在服务端的内部进行跳转,浏览器的地址栏不会改变
			request.getRequestDispatcher("login.jsp").forward(request, response);
		}
	}
	} catch (SQLException e) {
	    System.err.println(e.getMessage());
	} finally {
	    try {
			connection.close();// 关闭连接
		} catch (SQLException e) {
			System.err.println(e.getMessage());
		}
}
}

JDBC操作数据库的公共代码的提取封装

package com.icss.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
 * JDBC工具类,封装了与数据库交互公共代码
 * @author Administrator
 *
 */
public class JdbcUtil {
	// 1. 加载驱动,驱动名称表示需要连接什么类型的数据库
	static {
		try {
			Class.forName("com.mysql.jdbc.Driver");
		} catch (ClassNotFoundException e) {
			System.err.println(e.getMessage());
		}
	}
	/**
	 * 向处提供一个方法,返回Connection连接对象
	 * @return
	 */
	public static Connection getconConnection() {
		Connection connection=null;
		try {
			// 2.通过驱动管理类创建连接,与数据库建立联系,创建连接需要3个参数,数据库服务器的地址,用户名,密码
			// 连接字符串上的?characterEncoding=utf-8作用是解决SQL指令中的中文乱码问题。
			connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/myschool?characterEncoding=utf-8",
					"root", "");
		} catch (SQLException e) {
			System.err.println(e.getMessage());
		}
		return connection;
	}
	/**
	 * 释放资源的方法,结果集对象,命令对象,连接对象,都需要释放
	 * @param connection
	 * @param st
	 * @param rs
	 */
	public static void closeAll(Connection connection,Statement st,ResultSet rs) {
		try {
			if(rs != null)
				rs.close();
			if(st != null)
				st.close();
			if(connection != null)
				connection.close();
		} catch (Exception e) {
			System.err.println(e.getMessage());
		}
	}
	/**
	 * 增删改操作也可以进行封装
	 */
	public int update(String sql) {
		Connection connection = getconConnection();
		Statement st = null;
		try {
			st = connection.createStatement();
			return st.executeUpdate(sql);
		} catch (SQLException e) {
			System.err.println(e.getMessage());
		}finally {
			closeAll(connection, st, null);
		}
		return 0;
	}
}

Statement对象的相关方法:
JDBC技术与JavaBean对数据的处理_第2张图片
ResultSet对象
JDBC技术与JavaBean对数据的处理_第3张图片
PreparedStatement对象
这个对象实现了Statemet接口,对SQL语句进行了预编译,同时,需要对SQL语句有数据添加的以占位符占位,再进行添加数据,有效的避免了SQL注入攻击,同时,因为预编译了SQL指令,所以,执行速度要快。

// 通过连接对象创建命令对象
// Statement st = null;
PreparedStatement st = null;
ResultSet rs = null;
try {
	// String sql = "select count(*) from admin where loginId='" + name + "' and
	// loginPwd='" + pwd + "'";
	String sql = "select count(*) from admin where loginId=? and loginPwd=?";

	// st = connection.createStatement();
	st = connection.prepareStatement(sql);
	// 为占位符赋值,有2个占位符,索引从1开始,
	st.setString(1, name);
	st.setString(2, pwd);
	// 查询,从数据库返回的是一个结果集,用ResultSet对象接收。
	rs = st.executeQuery();

二、JavaBean对数据的处理
JavaBean是一个实体类,作用是封装数据,把数据行变成对象.
在开发中,实体类的命名与数据库中的表名一致,实体类中的属性通常与表中的字段一致。

你可能感兴趣的:(后端知识点)