黑马程序员技术交流社区

标题: 【石家庄校区】JDBC高级、连接池、DBUtils、XML、Tomcat、Servlet [打印本页]

作者: chenlong43210    时间: 2018-5-21 15:14
标题: 【石家庄校区】JDBC高级、连接池、DBUtils、XML、Tomcat、Servlet
本帖最后由 小石姐姐 于 2018-5-23 15:59 编辑

JDBC事务管理

核心思想:业务逻辑的操作要使用同一个Connection对象
Connection管理事务API
        setAutoCommit(boolean) //设置是否自动提交事务(默认true)。设置为false,后面的execute不会自动提交,相当于开启事务,需手动提交
        commit() //提交
        rollback() //回滚
        rollback(Savepoint) //回滚到还原点
    Savepoint setSavepoint() //设置还原点


连接池
连接池:只对Connection进行操作。对连接close()方法增强,不会销毁,归还给连接池
Druid
阿里旗下开源连接池产品,使用非常简单,可以与Spring框架进行快速整合。
使用:
    1.导入jar包
    2.加载连接数据库的配置文件
    Properties properties = new Properties();
    properties.load(new FileInputStream("文件路径"));
    3.获取连接池
    DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
    4.获得连接
    Connection conn = dataSource.getConnection();


C3P0
使用:
    //1.导入jar包,配置文件
    //2.创建连接池,默认去类路径下(classpath)查找c3p0-config.xml
    ComboPooledDataSource dataSource = new ComboPooledDataSource(["指定配置名字"]]);
    // 3.从连接池中获得连接
    Connection conn = dataSource.getConnection();


配置文件:c3p0-config.xml
    <?xml version="1.0" encoding="UTF-8"?>
    <c3p0-config>
            <default-config>
                    <property name="driverClass">com.mysql.jdbc.Driver</property>
                    <property name="jdbcUrl">jdbc:mysql:///web_test4</property>
                    <property name="user">root</property>
                    <property name="password">123</property>
            </default-config>
    </c3p0-config>
DBCP
    //需依赖.pooljar包
    BasicDataSource 连接池
            //必须设置项(数据库连接信息)
            setDriverClassName("com.mysql.jdbc.Driver");        //设置数据库驱动
            setUrl("jdbc:mysql://localhost:3306/mybase");        //设置数据库地址
            setUsername("root");        //设置用户名
            setPassword("123");                //设置密码
            //基本项(扩展)
            initialSize        初始化连接,第一次启动时放入的连接数
            maxActive        最大连接数量
            minIdle                最小空闲连接
            maxIdle         最大空闲连接
            //获取连接对象
            getConnection()


DBUtils
DBUtils :封装并简化JDBC,不影响性能。
    QueryRunner 类。核心运行类
            //一般执行CRUD操作
            (DataSource) //自动事务,自动提交,自动释放资源
            int update(String sql,Object… args); //增删改
            T query(String sql,ResultSetHandler<T> rsh,Object… params) //查。T为封装的对象类型
            //有事务的CRUD操作
            () //手动事务
            int update(Connection conn,String sql,Object… params)
            T query(Connection conn,String sql,ResultSetHandler rsh,Object… params)
            //批处理
            int[] batch(Connection conn,String sql,Object[][] params)
            int[] batch(String sql,Object[][] params)
   
    DbUtils        工具类
            closeQuietly(连接等);        //安静的关闭
            //事务操作
            commitAndCloseQuietly(Connection conn) //提交并安静的关闭,自动处理异常
            rollbackAndCloseQueitly(Connection conn)
   
    ResultSetHandler<T>        接口。结果集处理
    实现类:
    BeanHandler<T>(Class type) //将结果集第一条记录封装到一个指定的javaBean中。没有返回null
            返回 T
    BeanListHandler<T>(Class type) //将结果集每一条记录封装到指定的javaBean中,将这些javaBean在封装到List集合中
            返回 List<T>
    MapHandler() //将结果集第一行封装到Map集合中,Key 列名, Value 该列数据
            返回 Map<String, Object>
    MapListHandler() //将结果集第一行封装到Map集合中,Key 列名, Value 该列数据,Map集合存储到List集合
            返回 List<Map<String,Object>>
    ScalarHandler() //单值封装。如:select count(*) from 表操作(会返回long类型)。
            返回 数值会返回long
    ArrayHandler() //将结果集第一条记录封装到Object[]数组中。没有返回长度0数组
            返回 Object[]
    ArrayListHandler //将结果集每一条记录都封装到一个Object[]数组中,再将这些数组在封装到List集合中。
            返回 List<Object[]>
    ColumnListHandler<Object>(String columnName) //将指定的列封装到一个List集合中
            返回 List<Object>
    KeyedHandler("列名作为外层key")
            返回 Map<Object,Map<String,Object>>


XML
概述:XML(Extensible Markup Language) 可扩展标记语言:允许自定义标签。最原始标签类型语言,应用于配置文件。由W3C组织(World Wide Web Consortium 万维网联盟)发布,目前遵循2000年发布的XML1.0规范。
设计宗旨:描述数据,传输和存取数据
作用:软件的配置文件。辅助Tomcat服务器,定位用户访问的java程序
语法
基本语法:
- 区分大小写
- 只允许有一个根标签
- 标签必须闭合
- 特殊字符需转义
元素命名:
- 可以包含字母、下划线、数字、减号、英文句点
- 严格区分大小写
- 只能字母或下划线开头
- 不能以xml(XML、XML等)开头。W3C保留日后使用
- 名称字符之间不能有空格或制表符
- 名称字符之间不能使用冒号(有特殊用途)


文档声明:必须在第一行第一列
    1.<?xml version="1.0" encoding="UTF-8"?>
    encoding:字符集。使用浏览器打开时采用的字符集
    2.处理指令(PI,Processing Instruction):用来指挥软件如何解析XML文档
    <?xml-stylesheet type="text/css" href="xxx.css" ?>
注释:只能写在文档声明的后面
    <!-- 注释 -->
元素(标签)、属性
    <根标签>
            <子标签 属性名="属性值"></子标签> //包含标签体
            <子标签 属性名="属性值"/>                //不包含标签体
    </根标签>
特殊字符
    &        &
    <        <
    >        >
    "        "
    '        '
CDATA区(Character Data):该区域字符不被解释和解析,保证数据原样输出
    <![CDATA[ 内容 ]]>


XML解析
解析方式:
1. sax(Simple Api for XML):事件驱动的方式,逐行解析
   优点:如果文档特别大,不会导致内存溢出
   缺点:不能对XML进行增删改操作,只能查
2. dom(Document Object Model):一次性将文档加载到内存,形成树型结构
   优点:可对XML进行增删改查操作
   缺点:如果文档特别大,容易导致内存溢出
解析技术:
        dom4j:开源组织,hibernate底层采用(常用)
        JDOM:开源组织,dom4j兄弟
        JAXP:sun公司,支持DOM和SAX的API
        pull:应用Android手机端解析XML
        jsoup:一种处理HTML特定解析开发包


XML约束
作用:用来规范XML的写法
分类:
- DTD:语法是自成一体的
- Schema:语法就是XML的语法,更容易被解析器所解析;支持名称空间;有比DTD更加强大的语义和语法的约束
DTD约束
DTD(Document Type Definition) 文档类型定义:文件扩展名dtd
一个XML只能引入一个DTD约束文档
语法:
    引入方式
        1.内部DTD
        <!DOCTYPE 根元素名 [
        ]>
        2.外部DTD
            本地DTD:<!DOCTYPE 根元素名 SYSTEM "DTD文档路径">
            网络DTD:<!DOCTYPE 根元素名 PUBLIC "//UNKNOWN/" "DTD文档的URL">
    元素:<!ELEMENT 元素名 元素类型>
            元素类型:
        EMPTY                用于指示元素的主体为空。比如:<br/>
        (#PCDATA)        指示元素的主体内容只能是普通的文本
        ANY                        用于指示元素的主体内容为任意类型
        (子元素)        指示元素中包含的子元素
        是否有序: 使用 逗号(,)或者竖线(|)表示.
        出现的次数:?:零次或一次 +:一次或多次 *:零次或多次
    属性:<!ATTLIST 元素名称 属性名称 属性的类型 属性的约束>
            属性的类型:
            ID类型:表示属性值需要是唯一的.
            CDATA类型:普通的字符串.
            枚举
            属性的约束:
            #REQUIRED        属性是必需的
            #IMPLIED        属性不是必需的
            #FIXED value属性值是固定的


Schema约束
文件自身就是一个XML文档,扩展名为 xsd
XML Schema约束文档通常称之为模式文档(约束文档);遵循约束xml文件称之为实例文档
一个XML可以引入多个Schame约束文档


服务器
概述:服务器从硬件和软件两个方面说:
        硬件:指的就是一台配置很高的计算机。
        软件:需要在这台电脑上安装服务器软件。这台电脑称为web服务器


常见web服务器(中间件)               
  weblogic,        BEA,Oracle收购        大型,收费,支持javaEE所有规范   
  webspere(was),大型,收费,支持javaEE所有规范   
  Tomcat,中小型,免费,支持servlet和jsp规范               


Tomcat服务器
- 下载:官网下载,常用7
  .tar | .tar.gz        linux系统
  .zip | .ext            window系统


- 安装:解压即可,英文目录下
- 启动:Tomcat/bin/startup.bat
  查看是否启动成功:浏览器打开http://localhost:8080


- 退出:
  关闭窗口
  ctrl+c
  双击 shutdown.bat


常见问题
1. 启动时一闪而过。正确配置:JAVA_HOME
2. 端口冲突问题。修改Tomcat端口号
   - 一:将占用端口的应用结束
   查看程序占用的端口:netstat -ano
   根据PID打开任务管理器干掉
   - 二:修改自身的端口号。
       tomcat/conf/server.xml。(70行左右)
       <Connector port="8080" protocol="HTTP/1.1"
3. 环境变量中配置CATALINA_HOME,会启动同一个Tomcat。删除


目录结构
- bin:tomcat执行文件
- conf:tomcat 配置文件
- lib :Tomcat运行时需要的jar包
- logs:运行日志文件
- temp:临时文件
- webapps:发布web项目路径
- work:tomcat运行JSP的时候,JSP翻译成Servlet的代码,Servlet再被编译成class文件


项目发布(虚拟目录的映射)
方式一:项目直接放到tomcat/webapps下(了解)
方式二:配置 tomcat 虚拟路径(核心配置文件不推荐修改)
      tomcat/conf/server.xml 中:
      <Host> 标签中添加:
      <Context path="/虚拟路径" docBase="项目磁盘目录" />
              path:虚拟路径用于浏览器访问
              docBase:项目所在的真实磁盘目录


方式三:配置 tomcat 虚拟路径(官方推荐)
      tomcat/conf/Catalina/localhost/xxx.xml
              xxx:虚拟路径的名称用于浏览器访问
      文件中写入配置:
              <?xml version="1.0" encoding="UTF-8"?>
              <Context docBase="项目磁盘目录" />
(开发)打成war包。将war包放入tomcat/webapps下,当服务器启动时,会自动解压到当前目录。


Servlet
概述
servlet:运行在WEB服务器上的小的Java程序,用来接收和响应客户端发送过来的的数据,通常使用HTTP协议。就是SUN公司提供的一个动态WEB开发技术。
作用:用来处理从客户端浏览器发送的请求,并且可以对请求作出响应


使用配置
1. 编写一个类实现Servlet接口,重写service() 方法
1. 将这个类配置到服务器中(web-inf/web.xml)
    //配置servlet
    <servlet>
            <servlet-name>Servlet名称(任意,用于关联映射)</servlet-name>
              <servlet-class>Servlet全类名</servlet-class>
        //配置服务器启动时就创建Servlet,1留给虚拟机用,越小越优先
        //思想:有一些资源初始化很耗时,第一次访问时初始化资源(耗时)以后访问都无需初始化。
        //     可以这样配置。把耗时的操作放在服务器启动的时后
              <load-on-startup>2</load-on-startup>
              //配置初始化参数,可多个
        <init-param>
                      <param-name>键</param-name>
                      <param-value>值</param-value>
              </init-param>
    </servlet>
    <servlet-mapping> //绑定路径,Servlet的映射
            <servlet-name>Servlet名称</servlet-name>
         //Servlet的访问路径(自定义)
            <url-pattern>/hello</url-pattern>
    </servlet-mapping>
   
    //配置session过期时间
    <session-config>
        <session-timeout>30</session-timeout>
    </session-timeout>
   
    //配置全局错误页面,可多个
    <error-page>
              <error-code>404</error-code>
              <location>/404.jsp</location>
    </error-page>
        
    url-pattern三种配置方式
      1.完全路径匹配:以 / 开始。如:/servlet/aaa/ccc
      2.目录匹配:以 / 开始,以 * 结束。如: /* ,/aaa/* ,/aaa/bbb/*
      3.扩展名匹配:以 * 开始的。如: *.do , *.action
      优先级:完全路径匹配 > 目录匹配 > 扩展名匹配


1. 访问原理:根据<url-pattern>的路径访问,根据<servlet-name>找到对应的<servlet-class>,再找到Servert类,服务器调用service()方法
2. 导入jar包:直接放入 WEB-INF 下,无需BuildPath
路径问题
- 相对路径:不能 / 开头,找位置相对关系
  ./ 或 不写 表示当前路径
  ../ 表示上一级路径
- 绝对路径:以 / 开始的
  - 客户端路径:客户端访问服务器时一定要加工程名
  - 服务器端路径:服务器中文件之间的访问,可以不需要加工程名


    Servlet 接口
            init()|(ServletConfig config) //初始化。服务器开启第一次访问时执行一次
            service(ServletRequest request,ServletResponse response) //服务,处理业务逻辑。每请求一次,服务器创建一个线程,执行一次
            destroy() //销毁。servlet被移除或服务器正常关闭时执行一次
            //获取当前servlet的配置对象
            ServletConfig getServletConfig()
            //获取当前项目ServletContext对象
            ServletContext getServletContext()
    GenericServlet 抽象类
            除了service方法没有显示,其他都实现了
    HttpServlet 抽象类
            service做了实现,把参数强转,调用了重载的service方法
            重载的service方法获取请求的方式,根据请求方式的不同调用相应doXxx()方法


Servlet生命周期
默认用户第一次访问Servlet时,服务器会创建这个Servlet实例,并执行init()初始化方法。
任何一次请求服务器都会创建一个线程执行service()方法,在service()方法内部会根据请求方式的不同执行不同的doxxx()方法。
当关闭服务器或从服务器中移除项目时,Servlet的实例就会被销毁,并且执行destroy方法。
Servlet生命周期从始至终有且仅有一个Servlet实例。


ServletContext
    ServletContext 接口。上下文/全局管理者。作用:
        //1. 作为域对象存储数据/共享资源
        setAttribute(String key,Object value) //设置值
            Object getAttribute(String key) //获取值
            removeAttribute(String key) //删除值
            
        //2. 读取web项目下文件
        InputStream getResourceAsStream("/WEB-INF/classes/...") //获取资源以流的形式
            String getRealPath("/WEB-INF/classes/...") //获取文件磁盘真实路径
             方式二:类加载器读取文件,局限于/WEB-INF/classes下的文件
               类名.class.getClassLoader().getResourceAsStream("文件名")
        
        //3. 获得全局初始化参数(web.xml - <context-param>)
        String  getInitParameter(String key) //通过名称获取指定的参数值
            Enumeration getInitParameterNames()  //获取所有的参数名称
        
        //4. 获得文件的MIME类型(大类型/小类型)
        String getMimeType(String 文件名称)
   
    配置全局初始化参数:WEB-INF/web.xml - <web-app> -
      <context-param>
              <param-name>username</param-name>
              <param-value>root</param-value>
      </context-param>
   
ServletConfig
    ServletConfig (web.xml配置文件中当前Servlet的配置对象)
            //获取名称(的servlet-name)
            String getServletName()
            //参数操作(<init-param> 标签下)
            String getInitParameter(String key) //通过参数名称获取指定参数值
            Enumeration getInitParameterNames() //获取所有的参数名称<servlet-name>
    对象创建时机:由服务器创建,通过servlet的init(ServletConfig config)将该对象传入







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2