数据库 = 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>

 

 

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