JDBC

JDBC基本概念

Java数据库连接,(Java Database Connectivity,简称JDBC)是Java语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。

本质:其实是官方定义的一套操作所有关系型数据库的规则,即接口,各个数据库厂商去实现这个接口,提供数据库驱动的jar包。我们可以使用这套接口(JDBC)变成,真正执行的是驱动jar包中的实现类。

快速入门

步骤:
    1.将驱动jar包导入到工程中!
        复制jar包放在项目的libs目录下
        右键选择添加为库(Add As Library)
    2.注册驱动
         Class.forName("com.mysql.jdbc.Driver");//8.0以下
         Class.forName("com.mysql.cj.jdbc.Driver");//8.0
    3.获取数据库的链接对象 Connection
    url("jdbc:mysql://localhost:3307/db?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true";)
    4.定义sql语句
    5.获取执行sql语句的对象 Statement(不再用) PreparedStatement(防止sql注入)
    6.执行sql,接受返回结果
    7.处理结果
    8.释放资源
        需要判断是否空指针异常
        
        
        
        
bug测试
        请输入账户
        awfefeg
        请输入密码
        a' or 'a = 'a

详解各个对象

DriverManager:驱动管理
    功能:
        1.注册驱动
        2.获取数据库连接
Connection:数据库链接
        1.获取执行sql的对象
        2.管理事务
PreparedStatement:执行sql
Resultset:结果集


执行DDL语句时  并没有返回结果

ResultSet

next() //光标从当前位置向下移动一行;
getXXX(参数)//获取数据
    XXX:代表数据类型   例:getINt()  getString()
    参数:
        1.Int 代表列的编号,从1开始   例:getString(1) //获取第一列的
        2.String 代表列的名称  例:getString("name") //获取name列

JDBC工具类

JDBCUtils

目的:简化书写
分析:
    1.注册驱动抽取
    2.抽取一个方法获取连接对象
        需求:不想传递参数,还低保证工具的通用性
        解决:通过配置文件解决问题
            
    3.抽取一个方法释放资源

实现

package util;

import java.io.FileReader;
import java.io.IOException;
import java.net.URL;
import java.sql.*;
import java.util.Properties;

/**
 * @author XuHu
 * @version 1.0
 * @date 2020/9/23 13:32
 * JDBC工具类
 */
public class JDBCUtils {

    // 定义静态变量,使用静态代码获取配置文件的值

    private static String url;
    private static String user;
    private static String password;
    private static String driver;
    // 使用静态代码注册驱动并给静态变量赋值
    static {

        try {
            // 创建Properties集合类
            Properties properties = new Properties();
            // 获取src路径下文件,使用ClassLoader类加载器
            ClassLoader classLoader = JDBCUtils.class.getClassLoader();
            // URL定位文件的绝对地址
            URL res = classLoader.getResource("jdbc.properties");
            // 获取字符串路径
            String path = res.getPath();
            // 读取文件
            properties.load(new FileReader(path));
            // 静态变量赋值
            url = properties.getProperty("url");
            user = properties.getProperty("user");
            password = properties.getProperty("password");
            driver = properties.getProperty("driver");
            // 注册驱动
            Class.forName(driver);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
    /**
     * 获取链接
     * @return
     * @throws SQLException
     */
    public static Connection getConnection() throws SQLException {
        return DriverManager.getConnection(url,user,password);
    }
    /**
     * @author XuHu
     * @Description 释放资源
     * @param conn Connection        数据库连接对象
     * @param pre  PreparedStatement 执行sql操作
     */
    public static void close(Connection conn, PreparedStatement pre) {
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if (pre != null) {
            try {
                pre.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }

    /**
     * @author XuHu
     * @Description 释放资源 Res 版
     * @param conn Connection        数据库连接对象
     * @param pre  PreparedStatement 执行sql操作
     * @param res  ResultSet         结果集对象
     */
    public static void close(Connection conn, PreparedStatement pre, ResultSet res) {
        if (conn != null) {
            try {
                conn.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if (pre != null) {
            try {
                pre.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if (res != null) {
            try {
                res.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
}

JDBC控制事务

事务:一个包含多个步骤的业务操作,如果这个业务操作背事务管理,则这多个步骤要么同时成功们要么同时失败。
操作:
    1.开启事务
    2.提交事务
    3.回滚事务
使用Connection对象来管理事务
    开启事务: setAutoCommit (boolean autoCommit) : 调用该方法设置参数为false,即开启事务
        在执行sgl之前开启事务
    提交事务: commit()
        当所有sql都执行完提交事务
    回滚事务: rollback()
        在catch中回滚事务

数据库连接池

概念

其实就是一个容器(集合),存放数据库连接的容器。
    当系统初始化后,容器就会被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还给容器。
    
好处:
    节约资源
    用户访问高效
    
实现:
    标准接口:DaraSource  javax.sql包下
        方法:
            获取连接:getConnection()
            归还连接:Connection.close() //如果连接对象Connection是从连接池获取的,那么调用Connection.close()方法,则不会关闭连接,而是归还连接
        2.一般我们不去实现它,有数据库厂商来实现
            C3P0 :数据库连接池技术
            Druid :数据库连接池实现技术(德鲁伊 阿里提供)

C3P0:数据库连接技术

步骤

1.导入jar包(两个) c3p0.jar   mchange-commons-java.jar
    不要忘记导入数据库驱动jar包
2.定义配议文件:
    *名称: c3pθ. properties 或者c3p0-config.xml
    路径:直接将文件放在src目录下即可。
3.创建核心对象数据库连接池对象ComboPool edDataSource
4.获取连接: getConnection

Druid:数据库连接技术

步骤

Tomcat

目录结构

目录结构

配置

*部署项目的方式:
    1.直接将项目放到webapps目录下即可。
         /hello :项目的访问路径-- >虚拟目录
        简化部署:将项目打成一 个war包, 再将war包放置到webapps目录下。
        war包会自动解压缩
    2.配置conf/server.xml文件
        在<Host>标签体中配置
        <Context docBase="D:\hello" path=" /hehe" />
        docBase:项目存放的路径     path :虚拟目录
    3。 在conf\Catalina\localhost创建任意名称的xml文件。在文件中编写
            <Context docBase="D: \hello" />
            虚拟目录: xml文件的名称
            
静态项目和动态项目
    *目录结构:
        java动态项目:
        项目名称-- WEB- INF
            web.xml :该项目的核心配置文件
            classes目录:放置字节码文件
            lib目录:放置项目依赖的jar包

Servlet

概念

运行在服务器端的小程序
    servlet就是一个接口,定义了java类被浏览器所识别的接口
    将来我们自定义一个类,实现servlet接口,复写方法

快速入门

1.创建javaEE的项目
2.定义一个类,实现Servlet的实现类
    public class SevrletDemo1 implements Servlet 
3.实现接口中的抽象类
4.配置Servlet
 在web.xml中写
    <!--    配置Servlet-->
    <servlet>
        <servlet-name>demo1</servlet-name>
        <servlet-class>cn.web.serlet.SevrletDemo1</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>demo1</servlet-name>
        <url-pattern>/demo1</url-pattern>
    </servlet-mapping>

执行原理

1.当服务器接收到客户端浏览器的请求后,会解析请求的url路径,获取访问的servlet的资源路径
2.查找web.xml文件,是否有对应的<url-patterb>标签体内容
3.如果有,则会找到对应的<servlet-class>全类名
4.tomcat会将字节码文件加载进内存,并且创建其对象。
5调用其方法。

Servlet 方法

/**
 * @author XuHu
 * @date 2020/9/24 15:38
 * @version 1.0
 */
public class ServletDemo2 implements Servlet {
    /**
     * 初始化方法
     * 在Servlet被创建时执行,执行一次
     * @param servletConfig
     * @throws ServletException
     */
    @Override
    public void init(ServletConfig servletConfig) throws ServletException {
        System.out.println("Servlet Start");
    }
    /**
     * 获取ServletConfig对象
     * ServletConfig:Servlet配置对象
     * @return
     */
    @Override
    public ServletConfig getServletConfig() {
        return null;
    }
    /**
     * 提供服务方法
     * 每一次Servlet被访问时执行,可执行多次
     * @param servletRequest
     * @param servletResponse
     * @throws ServletException
     * @throws IOException
     */
    @Override
    public void service(ServletRequest servletRequest, ServletResponse servletResponse) throws ServletException, IOException {
        System.out.println("hello,Servlet");
    }
    /**
     * 获取Servlet一些信息,版本,作者等等
     * @return
     */
    @Override
    public String getServletInfo() {
        return null;
    }
    /**
     * 销毁方法
     * 在服务器关闭时执行,执行一次
     */
    @Override
    public void destroy() {
        System.out.println("Servlet End");
    }
}

Servlet 生命周期

1.被创建:执行init方法,只执行一次
    Servlet什么时候被创建?
        默认情况下,第一次被访问时,Servlet被创建
           可以配道执行Servlet的创建时机。
            在<servlet>标签下配
                1.第一次被访问时,创建
                    <load-on- startup>的值为负数
                2.在服务器启动时,创建
                    <load-on-startup>的值为0或正整数
     Servlet的init方法, 只执行- -次, 说明一个Servlet在内存中只存在一个对象, Servlet是 单例的
        多个用户同时访问时,可能存在线程安全问题。
        解决:尽量不要在Servlet中定义成员变量。即使定义了成员变量,也不要对修改值
2.提供服务:执行service方法,执行多次
    每次访问Servlet时, Service方法都会被调用一次。
3。被销毁:执行destrov方法,只执行一次
    Servlet被销毁时执行。服务器关闭时,Servlet被销毁
    只有服务器正常关闭时,才会执行destroy方法。
    destroy方法在Servlet被销毁之前执行,一般用于释放资源

Servlet 3.0

好处:
    支持注解配置,可以不使用web.xml

步骤

1.创建javaEE项目,选择Servlet的版本3.0以上,可以不创建web.xml
2.定义一个类实现Servlet接口
3.复写方法
4.在类上使用@WebServlet注解,进行配置
        可以:@WebServlet(urlPatterns = "/demo")
        也可以:@WebServlet("/demo")  value的特性 只有value时 只写值就行

IDEA 与 tomcat的相关配置

IDEA会为每一个tomcat部署的项目单独建立一份配置文件
工作空间项目和tomcat部署的web项目 
    tomcat真正访问的是“tomcat部署的web项目 ”,“tomcat部署的web项目 ”对应着“工作空间项目”web项目下的所有资源
    WEB-INF下的资源不能被浏览器直接访问。
    断点调试:需要点击调试按钮启动
Last modification:September 24th, 2020 at 06:45 pm