數據庫 = JDBC數據庫連接基礎

 

一.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>

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章