A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 学习让我快乐啊 于 2018-5-21 18:01 编辑

JDBC

一个应用:
​        高性能,高可用
高可用:
​        代码的复用性
对扩展是开放的,对修改源码是关闭的
模糊查询时,最好将占位符放到变量中
preparedstatement批处理只预编译一次
  • 概述:Java Data Base Connectivity是一种用于执行SQL语句的Java API
  • 驱动:两个设备(应用)之间通信的桥梁

相关API
  • DiverManager

    • 注册驱动

      • static void registerDriver(Diver driver):一般不使用
      • Class.forName("驱动全名"):一般使用这种方式(右键-Copy Qualified Name可以复制类全名)

        • 在驱动类中存在一个静态代码块,在加载字节码文件时,会调用DriverManager的registerDriver()方法
          static {
              try {
                  DriverManager.registerDriver(new Driver());
              } catch (SQLException var1) {
                  throw new RuntimeException("Can't register driver!");
              }
          }

    • 获得连接

      • static Connection getConnection(String url, String user, String password)
      • url格式:数据库协议://IP地址:端口号/数据库(数据库可以不写);
        例子:jdbc:mysql://localhost:3306/web_test3


  • Connection

    • 创建执行SQL语句的对象

      • Statement createStatement():创建Statement对象,执行SQL语句(存在SQL注入漏洞)
      • CallaleStatement prepareCall(String sql):创建CallableStatement对象调用数据库存储过程
      • PreparedStatement prepareStatement(String sql):创建PreparedStatement对象将参数化的SQL语句发送到数据库(解决了SQL注入漏洞)

    • 管理事务

      • void setAutoCommit(boolean autoCommit):将此链接的自动提交模式设置为给定状态
      • void commit:提交,并释放此Connection对象当前持有的所有数据库锁
      • void rollback():回滚,并释放此Connection对象当前持有的所有数据库锁


  • Statement

    • 执行SQL语句

      • boolean execute(String sql)
      • esultSet executeQurey(String sql)
      • int excuteUpdate()

    • 批处理

      • void addBatch(String sql)
      • void excuteBatch()
      • void clearBatch()


  • ResultSet

    • boolean next()用于遍历结果集

      while(rs.next()){
          rs.getXXX(column);
      }
    • XXX getXXX(String column):获取相应记录的值
    • Object getObject(String column)


JDBC开发步骤
step1:注册驱动:Class.forName()
step2:获得连接:Connection conn = DriverManger.getConnection(url,username,password)
step3:编写SQL语句,String sql ="",值的地方用占位符?代替
step4:预编译sql并且获得可执行sql语句的对象PreparedStatement ps = conn.prepareStatemet(String sql)
step5:为sql语句设置值,用值代替sql语句中的?  ps.setXXX(int n,值) n:代表第几个问号的意思,从1开始
step6:执行sql语句
    如果是查询:ResutSet rs = ps.executeQuery();//获得结果集
    如果是增删改:int num = ps.executeUpdate() ;// num 代表影响的行数
step7:释放资源CRUD操作属性Properties
  • Properties对象的使用


Properties prop = new Properties();
prop.load(new FileInputeStream(String path或File对象));
prop.getProperty(String key);
  • 注:

    • .properties文件的编码格式为ISO-8859-1,内容不能有中文;如果想把值设置成中文,需要写成\uXXXX形式
    • 包含了程序解耦和的思想;


批处理
String sql = "insert into user values (null,?)";
// 预编译SQL:
pstmt = conn.prepareStatement(sql);
for(int i=1;i<=10000;i++){
    pstmt.setString(1, "name"+i);
    // 添加到批处理
    pstmt.addBatch();//注意内存溢出
    if(i % 1000 == 0){
        // 执行批处理:
        pstmt.executeBatch();
        // 清空批处理:
        pstmt.clearBatch();
    }
}事务
  • 开启事务:setAutoCommit(false)
  • 提交:commit()
  • 回滚:rollback()
  • 核心思想:事务管理要使用同一个connection对象

连接池
  • 使用连接池的原因:提升性能,从内存中获取和归还的效率要远远高于创建和销毁的效率

增强类中方法的方式
java的23种设计模式
  • 采用继承

    • 最简单,但有使用条件:必须能控制这个类的构造

  • 装饰者模式
  • 动态代理

Druid的概述
Druid阿里旗下开源连接池产品,使用非常简单,可以与Spring框架进行快速整合。
C3P0的连接池的概述
c3p0是一个开源的,JDBC来连接池,它实现了数据源和JND绑定,支持JDBC3规范和JDBC2的标准扩展。
DBUtils
DButils为web阶段用到的,封装JDBC,抽取成工具类,简化代码.
  • QueryRunner

    • 构造方法:

      • QueryRunner()
      • QueryRunner(DataSource ds)

    • 方法:

      • int update(String sql. Object...parsms)
      • int update(Connection conn, String sql, Object... params)
      • query(String sql, ResultSetHandler<T> rsh, Object... params)
      • query(Connection conn, String sql, ResultSetHandler<T> rsh, Object... params)



工具类编写原则:把相同或相似的代码抽取出来
  • ResultHandler
  • ResultHandler实现类

    • ArrayHandler
    • ArrayListHandler
    • BeanHandler
    • BeanListHandler
      如果表字段与实体类属性名称不同,可以利用别名
      决定属性封装能否成功的是get和set方法的名称,而不是属性名称
      实体类一定要有一个无参构造方法
    • MapHandler
    • MapListHandler
    • ColumnListHandler
    • SaclaHandler

      • select count(XXX) from table返回的是一个long值

    • keyedhandler


DBUtils的查询操作步骤:query
1.查询表中的多条记录,把每条记录封装成一个对象,放进一个List集合.  2.查询一条记录,直接使用这个封装记录的对象.
XML
XML作为配置文件完成模拟Tomcat
  • 什么是XML?

    • 可扩展的标记语言

  • 作用

    • 传输和存取数据

      • 限制传输数据用JSon,存取数据用数据库

    • 软件的配置文件

  • XML的使用

    • 基本语法:
      *标签必须有开始和结束.
      ​            *必须有跟标签
      ​            *区分大小写.
      ​            *正确嵌套.
      XML的文档声明:<?xml version=”1.0” encoding=”UTF-8”?>
      ​      
      ​     


XML的语法
  • XML的文档声明

    • 通常出现在XML文档的第一行第一列
    • <?xml 属性名="属性值" 属性名="属性值" ?>

      • 属性有三个
      • version是必需的,一般是1.0,2.0不向下兼容,所以一般使用1.0
      • encoding:字符集,是使用浏览器打开的时候采用的默认的字符集的编码.(可选)
      • standalone:描述XML文档是否需要依赖其他的文件,(可选)值是yes或者no.


  • XML的注释
    <!-- 注释 -->
  • XML的元素

    • XML的元素:

    • 命名规范 :不能以数字开头,标签包含字母或数字,不能以xml开头,不能出现空格冒号.

  • XML的属性

    • *命名规范:与元素一致.属性必须加引号

  • XML的特殊字符和CDATA区

    • 特殊字符

      • < ; 是 <
      • > ; 是 >
      • & ; 是 &
      • &apos 是 '(单引号)
      • 分号要挨着特殊字符结尾,中间不能有空格.

    • CDATA区

      • character Data的缩写
      • 写在这个区域的都会被当做字符串,不会当做特殊字符
      • <![CDATA[ 内容 ]]>



XML的解析
  • XML解析的方式

    • DOM解析

      • Document Object Model

    • ​SAX解析  

      • Simple Api for XML

    • DOM和SAX的区别

      • DOM :一次性将整个文档加载到内存,进行树形结构解析.

        • 缺点:如果文档特别大,容易导致内存溢出
        • 优点:可以对XML进行增删改的操作

      • SAX:是以事件驱动方式,逐行进行解析的.

        • 缺点:不能对文档进行增删改的操作
        • 优点:就算文档特别大不会导致内存的溢出


    • 针对这两种解析方式,不同的公司提供了不同的API的实现

      • JAXP:SUN公司提供的一套XML的解析的API
      • JDOM:开源组织提供了一套解析XML的API叫jdom
      • DOM4J:开源组织提供了一套解析XML的API叫dom4j
      • pull:主要应用在Android手机的解析



  • 使用DOM4J来解析
  • 导入jar包
  • 创建解析器

    • SaxRader sr = new SaxReader();

  • 解析文档获得代表整个文档的对象:document,包含element ,attribute,text这三个同城为node(节点).NOde就相当于java中的Object.

    • Document dc = sr.read("文件路径");

  • 先要获得根节点

    • Element root = dc.getRootElement();

  • 从根节点开始查找其他节点:element(),elements();

    • Element el = root.element("元素名");根节点下的第一级元素中指定元素第一次出现的那个元素
    • String s = el.getText(),元素对象中的文本


XPath
  • dom4j 支持XPath的jar包

    • jaxen.jar

  • dom4j的XPath支持的API:

    • LIst
    • Node

  • 常用的命令

    • 看API中的实例2,5,6


XML的约束
  • 用来约束XML的文档中可以出现哪些标签,不能出现哪些标签,标签中是否有顺序,出现的次数
  • 用来规范XML的写法
    XML的约束有哪些区别是什么?
    ​        * DTD和Schame:
    ​            * DTD的语法是自成一体,Schema使用的XML的语法.
    ​            * Schema有比DTD更强大的语义和语法的约束.
    ​            * Schema支持名称空间.

0 个回复

您需要登录后才可以回帖 登录 | 加入黑马