一.jdbc基礎
(1)Java 數據庫連接(Java DataBase Connectivity)
作用:通過java語言操作數據庫
本質:是官方(sun公司)定義的一套操作所有關係型數據庫的規則(接口);各個數據庫廠商去實現這套接口,提供數據庫驅動jar包,我們可以使用這套接口(jdbc)編程,運行時的代碼其實就是驅動jar包中的實現類。
(2)案例:通過java代碼向數據庫user表插入一條記錄。
- 準備數據庫
CREATE DATABASE IF NOT EXISTS crmproject;
CREATE TABLE IF NOT EXISTS USER(
id INT AUTO_INCREMENT PRIMARY KEY,
NAME VARCHAR(50),
PASSWORD VARCHAR(50)
)
INSERT INTO USER(NAME,PASSWORD) VALUES('admin','123456'),('root','1234567');
SELECT * FROM USER;
- 創建java工程,導入mysql驅動jar包
- 編寫代碼
// 1.註冊驅動
// 2.建立連接
// 3.編寫sql
// 4.獲取sql執行對象
// 5.執行sql並返回結果
// 6.處理結果
// 7.釋放資源
public class JDBCQuick {
public static void main(String[] args) throws Exception {
// 1.註冊驅動
DriverManager.registerDriver(new Driver());
// 2.建立連接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/crmproject", "root", "root");
// 3.編寫sql(在java編寫sql 結尾;可以省略)
String sql = "insert into user values(null,'luy','666')";
// 4.獲取sql執行對象
Statement statement = connection.createStatement();
// 5.執行sql並返回結果
int i = statement.executeUpdate(sql);
// 6.處理結果
if (i>0) {
System.out.println("添加成功");
}else{
System.out.println("添加失敗");
}
// 7.釋放資源
statement.close();
connection.close();
}
}
(3)API介紹
sun公司提供的:java.sql包下
DriverManager:驅動管理對象
1. 註冊驅動
1)
static void registerDriver(Driver driver)
我們通過翻看MySQL Driver實現類的源碼發現內部的靜態代碼已經提供了註冊驅動功能
static {
try {
DriverManager.registerDriver(new Driver());
} catch (SQLException var1) {
throw new RuntimeException("Can't register driver!");
}
}
2)反射
Class.forName("com.mysql.jdbc.Driver");
3)SPI 服務提供接口 【Service Provider Interface】
2. 建立連接
static Connection getConnection(String url, String user, String password)
參數說明:
url:連接指定數據庫地址【固定格式】
格式:jdbc:mysql://ip地址+端口/數據庫名
實例:
jdbc:mysql://localhost:3306/crmproject
jdbc:mysql:///crmproject
user:用戶名
password:密碼
Connection:數據庫連接對象
1. 獲取sql執行對象
Statement createStatement()
PreparedStatement prepareStatement(String sql)
2. 事務管理
1)關閉自動提交(開啓事務)
void setAutoCommit(boolean autoCommit)
參數:
true:自動提交【默認值】
false:手動提交
2)提交事務
void commit()
3)回滾事務
void rollback()
Statement:執行sql的對象
1. 執行所有類型sql語句
boolean execute(String sql)
----------------------------------
2. 僅執行DML類型sql語句
int executeUpdate(String sql)
參數:dml類型sql(insert、update、delete)
返回值:影響行數
3. 僅執行DQL類型sql語句
ResultSet executeQuery(String sql)
參數:dql類型sql(select)
返回值:結果集
ResultSet:結果集對象,封裝查詢結果
1. 指針下移
boolean next()
返回值:
true:表示此行有數據
false:表示此行沒有數據
2. 獲取數據
T getXxx(int 列編號)
T getXxx(String 列名)
補充:獲取所有類型
Object getObject(String 列名)
String getString(String 列名)
(4)CRUD操作
// 1.註冊驅動
// 2.建立連接
// 3.編寫sql
// 4.獲取sql執行對象
// 5.執行sql並返回結果
// 6.處理結果
// 7.釋放資源
user表修改一條記錄
// 修改
@Test
public void testUpdate()throws Exception{
// 1.註冊驅動
Class.forName("com.mysql.jdbc.Driver");
// 2.建立連接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/crmproject", "root", "root");
// 3.編寫sql
String sql = "update user set username = '布朗' where id = 5";
// 4.獲取sql執行對象
Statement statement = connection.createStatement();
// 5.執行sql並返回結果
int i = statement.executeUpdate(sql);
// 6.處理結果
if (i>0) {
System.out.println("修改成功");
}else{
System.out.println("修改失敗");
}
// 7.釋放資源
statement.close();
connection.close();
}
user表刪除一條記錄
// 刪除
@Test
public void testDelete()throws Exception{
// 1.註冊驅動
Class.forName("com.mysql.jdbc.Driver");
// 2.建立連接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/crmproject", "root", "root");
// 3.編寫sql
String sql = "delete from user where id = 7";
// 4.獲取sql執行對象
Statement statement = connection.createStatement();
// 5.執行sql並返回結果
int i = statement.executeUpdate(sql);
// 6.處理結果
if (i>0) {
System.out.println("刪除成功");
}else{
System.out.println("刪除失敗");
}
// 7.釋放資源
statement.close();
connection.close();
}
user表查詢所有記錄
// 查詢
@Test
public void testFindAll() throws Exception {
// 1.註冊驅動
Class.forName("com.mysql.jdbc.Driver");
// 2.建立連接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/crmproject", "root", "root");
// 3.編寫sql
String sql = "select * from user";
// 4.獲取sql執行對象
Statement statement = connection.createStatement();
// 5.執行sql並返回結果
ResultSet resultSet = statement.executeQuery(sql);
// 6.處理結果
while (resultSet.next()) {
// 獲取數據
int id = resultSet.getInt("id");
String username = resultSet.getString("username");
String password = resultSet.getString("password");
System.out.println("編號:" + id + " 用戶名:" + username + " 密碼:" + password);
}
// 7.釋放資源
resultSet.close();
statement.close();
connection.close();
}
(5)工具類
每次去執行SQL語句都需要註冊驅動,獲取連接,得到Statement,以及釋放資源。發現很多重複的勞動,我們可以將重複的代碼定義到一個工具類中
分析:目標簡化書寫,一勞永逸
public class JdbcUtils{
// 1.註冊驅動【保證一次】
static{
}
// 2.提供獲取連接的靜態方法
public static Connection getConnection(){
return null;
}
// 3.提供釋放資源的方法
public void close(){
}
}
第一種方式:
public class JdbcUitls1 {
// 1.註冊驅動【保證一次】
static {
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
// e.printStackTrace();
throw new RuntimeException("加載mysql驅動失敗");
}
}
// 2.提供獲取連接的靜態方法
public static Connection getConnection()throws SQLException {
return DriverManager.getConnection("jdbc:mysql://localhost:3306/crmproject", "root", "root");
}
// 3.提供釋放資源的方法
public static void close(ResultSet resultSet, Statement statement,Connection connection) {
if (resultSet!=null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (statement!=null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection!=null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
// 重載關閉方法
public static void close(Statement statement,Connection connection){
close(null, statement, connection);
}
}
第二種方式:
抽取配置文件
工具類:
public class JdbcUitls {
// 聲明變量
private static String driver = null;
private static String url = null;
private static String user = null;
private static String password = null;
// 加載jdbc.properties配置文件,初始化變量
static {
// sun公司專門提供了一從src目錄下加載properties類型的工具類 ResourceBundle
ResourceBundle jdbc = ResourceBundle.getBundle("jdbc");
driver = jdbc.getString("jdbc.driver");
url = jdbc.getString("jdbc.url");
user = jdbc.getString("jdbc.user");
password = jdbc.getString("jdbc.password");
}
// 1.註冊驅動【保證一次】
static {
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
// e.printStackTrace();
throw new RuntimeException("加載mysql驅動失敗");
}
}
// 2.提供獲取連接的靜態方法
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url, user, password);
}
// 3.提供釋放資源的方法
public static void close(ResultSet resultSet, Statement statement, Connection connection) {
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
// 重載關閉方法
public static void close(Statement statement, Connection connection) {
close(null, statement, connection);
}
}
(6)事務操作
* 事務
如果一個包含多個步驟的業務操作,被事務管理,那麼這些操作要麼同時成功,要麼同時失敗。
* MySQL操作
1.開啓事務
begin | start transaction;
2.提交事務
commit;
3.回顧事務
rollback;
* java操作(使用Connection對象)
1.關閉自動提交(開啓事務)
void setAutoCommit(false);
2.提交事務
void commit();
3.回顧事務
void rollback();
案例:轉賬案例:
//添加數據表
CREATE TABLE account(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(10),
money DOUBLE
)
//添加數據
INSERT INTO account (NAME,money) VALUES('蝴蝶結',1000),('羅志祥',1000);
SELECT * FROM account;
編寫轉賬代碼:
public class testTX{
@Test
public void testTX(){
try{
// 1.獲取連接【JdbcUtils工具類】
// 2.開啓事務
// 3.羅志祥扣錢
// 機器故障
// 4.蝴蝶結加錢
// 5.提交事務
}catch(Exception e){
// 6.回滾事務
}finally{
// 7.釋放資源
}
}
}
public class testTX{
@Test
public void testTX() {
Connection connection = null;
Statement statement = null;
try {
// 1.獲取連接【JdbcUtils工具類】
connection = JdbcUitls.getConnection();
// 2.開啓事務
connection.setAutoCommit(false);
statement = connection.createStatement();
// 3.羅志祥扣錢
String xiangSql = "update account set money = money-100 where id = 2";
int xiangResult = statement.executeUpdate(xiangSql);
if (xiangResult > 0) {
System.out.println("羅志祥支付成功~~~");
}
// 機器故障
int a = 1 / 0;
// 4.蝴蝶結加錢
String dieSql = "update account set money = money + 100 where id = 1";
int dieResult = statement.executeUpdate(dieSql);
if (dieResult > 0) {
System.out.println("蝴蝶結收款成功~~~");
}
// 5.提交事務
connection.commit();
} catch (Exception e) {
e.printStackTrace();
try {
// 6.回滾事務
connection.rollback();
} catch (SQLException e1) {
e1.printStackTrace();
}
} finally {
// 7.釋放資源
JdbcUitls.close(statement, connection);
}
}
}
二.案例,用戶登錄
用戶輸入賬號,密碼,實現登錄網站功能。
創建工程結構:
工具類:
package com.wsl.login.util;
import java.sql.*;
import java.util.ResourceBundle;
public class JdbcUtils {
//聲明初始化變量
private static String driver = null;
private static String url =null;
private static String user =null;
private static String password =null;
//加載jdbc文件
static {
ResourceBundle jdbc = ResourceBundle.getBundle("jdbc");
driver = jdbc.getString("jdbc.driver");
url = jdbc.getString("jdbc.url");
user = jdbc.getString("jdbc.user");
password = jdbc.getString("jdbc.password");
}
//初始化註冊驅動
static {
try {
Class.forName(driver);
} catch (ClassNotFoundException e) {
// e.printStackTrace();
throw new RuntimeException("加載mysql驅動失敗");
}
}
//創建連接器
public static Connection getConnection() throws SQLException{
return DriverManager.getConnection(url,user,password);
}
//提供釋放資源的方法
public static void close(ResultSet resultSet, Statement statement,Connection connection){
if (resultSet!=null){
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (statement!=null){
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (connection!=null){
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
//方法重載
public static void close(Statement statement,Connection connection){
close(null,statement,connection);
}
}
LoginServlet
package com.wsl.login.web;
import com.wsl.login.domain.User;
import com.wsl.login.service.UserService;
import org.apache.commons.beanutils.BeanUtils;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.util.Map;
@WebServlet("/LoginServlet")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
try {
Map<String, String[]> parameterMap = request.getParameterMap();
User user=new User();
BeanUtils.populate(user,parameterMap);
UserService userService = new UserService();
int flag = userService.loginUser(user);
if (flag==1){//成功
request.getSession().setAttribute("loginUsername",user.getName());
response.sendRedirect(request.getContextPath()+"/list.jsp");
}else{//失敗
request.setAttribute("error","用戶名或密碼錯誤");
request.getRequestDispatcher("/login.jsp").forward(request,response);
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (InvocationTargetException e) {
e.printStackTrace();
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request,response);
}
}
package com.wsl.login.service;
import com.wsl.login.dao.UserDao;
import com.wsl.login.domain.User;
import java.util.List;
public class UserService {
UserDao userDao = new UserDao();
public int loginUser(User user){
return userDao.loginUser(user);
}
}
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.List;
public class UserDao {
public int loginUser(User user) {
try {
Connection connection = JdbcUtils.getConnection();
String sql = "select * from user where name='"+user.getName()+"' and password = '"+user.getPassword()+"'";
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(sql);
if (resultSet.next()){
return 1;
}else{
return 0;
}
} catch (SQLException e) {
e.printStackTrace();
}
return 0;
}
}
public class User {
private String id;
private String name;
private String password;
public User() {
}
public User(String id, String name, String password) {
this.id = id;
this.name = name;
this.password = password;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
<form action="${pageContext.request.contextPath}/LoginServlet" method="post">
<h4>登錄人是:${pageContext.session.getAttribute("loginUsername")}</h4>