一、JDBC 与数据库进行交互
Java数据库连接技术(Java DataBase Connectivity),Java 程序要与数据库进行交互,必须使用JDBC技术。JDBC 有一系列的API,这些API对数据进行操作,它们在Java.sql包与Javax.sql包中。同时,要与数据库连接,则还需要数据库厂商提供的连接驱动。
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对象的相关方法:
ResultSet对象
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是一个实体类,作用是封装数据,把数据行变成对象.
在开发中,实体类的命名与数据库中的表名一致,实体类中的属性通常与表中的字段一致。