javaWeb 简单注册登录(含数据库连接) -- (二) MySQL数据库配置和连接

因为这个项目需要使用数据库, 下面就先讲数据库连接
使用的是MySQL数据库

MySQL数据库连接

环境什么的就不讲了, 网上都有
这个“项目”使用了一个user用户表, 信息如下
这里写图片描述

先插入一条用户数据:
这里写图片描述


jdbc连接MySQL数据库:

  1. jdbc是用来执行sql语句的java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序
  2. 使用jdbc访问MySQL数据库:
    首先加载驱动程序类
    然后根据url, DBMS用户和密码建立连接对象
    根据该对象就可以访问数据库

加载驱动程序

  1. 首先需要包含MySQL为jdbc提供的驱动程序类的jar包, 这个包可以自己下, 事实上我最近才发现MySQL的目录里面也有这个包
    这里写图片描述
    这里写图片描述
  2. 新建一个项目测试数据库连接(保证MySQL服务开启):
    这里写图片描述
    导入jar包:
    右击JRE System Library-> Build Path->Configure Build Path
    点击Add Extern JARs浏览jar包的目录
    TestDemo.java代码:
package jdbcTest;
import java.sql.*;
public class TestDemo {
    private static String driver = "com.mysql.jdbc.Driver";
    private static String url = "jdbc:mysql://localhost:3306/database";//协议:自协议:数据源标识
    private static String user = "root";//DBMS用户
    private static String pass = "password";//密码
    public static void main(String[] args) throws SQLException{
        try{
            Class.forName(driver);//加载驱动程序类, DriverManager将注册加载的类实例
            Connection conn = DriverManager.getConnection(url, user, pass);//获取连接
            Statement state = conn.createStatement();
//  state.executeUpdate("delete from user where Sno like 'E%'");
            ResultSet rs = state.executeQuery("select * from user");//查询
            System.out.println("Sno\tUser\tPass");
            while(rs.next()){
                for(int i = 1; i <= 3; ++i){

                    System.out.print((i > 1 ? "\t" : "") + rs.getString(i));
                }
                System.out.println("");
            }
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }
}

console输出:
这里写图片描述


在“项目”中实现数据库连接

问题:
注册、登录都需要对数据库进行查询或更新, 意味着都需要连接目标数据库, 如果每次都重新加载驱动获取连接处理请求的效率会很低, 如何解决?
我们知道, 对于整个web应用, 有一个servletContext对象, 能够被所有servlet访问, 所以我们把目标数据库连接对象“放”在这个对象中, 就可以在请求时直接获取连接对象了
如何“放”?
在web.xml中只能配置上下文参数, 参数能被应用中请求的servelt获取上下文对象访问, 但是参数形式为:name-value, 名和值都为字符串对象, 连接对象显然不是字符串对象
但是和数据库连接相关的驱动程序类、url、user、pass是啊, 我们是可以把他们设置成上下文参数的
那么如何何时获取Connection对象?
需要明确的是, 这个对象需要在应用加载之时就创建, 原因是它不对应任何特定的servlet, 且每个servlet有访问它的可能
所以要在应用加载时创建Connection对象, 加载应用会先读取web.xml然后为应用创建ServletContext对象, ServeletContext会获取所有上下文参数
在这里, 如果我们设置一个上下文监听者, 在上下文初始化时通知由它负责获取上下文参数, 获取连接数据库对象, 并把它设置成上下文属性, 那么在应用加载完成后, 其他servlet就能通过获取上下文对象的该属性值获取数据库的连接了.

监听者配置:
在web.xml中加入

<listener>
    <listener-class>
        <!-- 类名 -->adrui.MyContextListener
    </listener-class>
</listener>

这样应用就知道它是一个监听者, 至于监听的对象要看它实现的接口, 显然可监听的对象分不止一种


监听者类:

package adrui;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import java.sql.*;
import javax.servlet.*;
//实现监听者接口
public class MyContextListener implements ServletContextListener {

    @Override
    //应用关闭, 销毁上下文对象之时调用
    public void contextDestroyed(ServletContextEvent event){
        // TODO Auto-generated method stub



    }

    @Override
    //应用开启, 加载上下文之时调用
    public void contextInitialized(ServletContextEvent event) {
        // TODO Auto-generated method stub
        ServletContext sc = event.getServletContext();
        //获取上下文对象
        String driver = sc.getInitParameter("driver");
        String url = sc.getInitParameter("url");
        String user = sc.getInitParameter("user");
        String pass = sc.getInitParameter("pass");
        //获取上下文参数(在web.xml里配置)
        try{
            Class.forName(driver);//加载驱动程序类
            Connection conn = DriverManager.getConnection(url, user, pass);
            sc.setAttribute("conn", conn);
            System.out.println("Connect Succeed!");
            //获取连接并设置成上下文属性, 属性名为conn
        }
        catch(Exception e){
            e.printStackTrace();
        }
    }

}

可以加一些查询语句测试是否连接成功

这样就实现了数据库连接, 且每个servlet都能获取该连接对象, 并对数据库进行增删查改之类的操作

  • 7
    点赞
  • 84
    收藏
    觉得还不错? 一键收藏
  • 11
    评论
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值