zoukankan      html  css  js  c++  java
  • .Net转Java自学之路—基础巩固篇三十(JDBC)

    JDBC:Java数据库连接

      JDBC的四大配置参数:

        dirverClassName:com.mysql.jdbc.Dirver

        url:jdbc:mysql://localhost:3306/数据库名称

        username:数据库用户名

        password:数据库密码

      各大数据库的dirverClassName与url:

        mysql:

          >dirverClassName:com.mysql.jdbc.Dirver

          >url:jdbc:mysql://localhost:3306/数据库名称

        mssql:

          >dirverClassName:com.microsoft.jdbc.sqlserver.SQLServerDriver

          >url:jdbc:sqlserver://127.0.0.1:1433;DatabaseName=数据库名

        orcale:

          >dirverClassName:oraccle.jdbc.dirver.OracleDriver

          >url:jdbc:oracle:thin:@localhost:1521:数据库名称

        access:

          >dirverClassName:sum.jdbc.odbc.JdbcOdbcDriver

          >url:jdbc:odbc:driver=(Microsoft Access Driver (*.mdb);DBQ=mdb\mydb.mdb)

      Connection:

    Class.forName(dirverClassName);
    Connection conn=DirverManager.getConnection(url,username,password);

      Statement:

    Statement stmt=conn.createStatement();
    int index=stmt.executeUpdate(sql);//增、删、改
    ResultSet rs=stmt.executeQuery(sql);//
    boolean isTrue=stmt.execute(sql);//增、删、改、查

        Statement批处理:

          addBatch();//批添加

          executeBatch();//执行批

        在MySql中的批处理默认是关闭状态,要在配置参数url中添加参数:rewriteBatchedStatements=true 来开启MySql的批处理。如下:

        url:jbdc:mysql://localhost:3306/数据库名?rewriteBatchedStatements=true

      ResultSet:

        表示结果集。

        ResultSet提供了一系列的方法移动游标:

    void beforeFirst();//把光标放到第一行的前面,默认位置。
    void afterLast();//最后一行后面
    boolean first();//第一行,返回值表示调控光标是否成功
    boolean last();//最后一行
    
    boolean isBeforeFirst();//是否再第一行前面
    boolean isAfterLast();//是否再最后一行后面
    boolean isFirst();//是否在第一行
    boolean isLast();//是否在最后一行
    
    boolean previous();//上挪一行
    boolean next();//下挪一行
    boolean relative(int);//相对位移。正数:下移n行。负数:上移n行
    boolean absolute(int);//绝对位移。把光标移动到指定的行上
    int getRow();//获取当前光标所有行
    int getMetaData().getColumnCount();//获取结果集列数
    String getMetaData().getColumnName(int);//获取指定列字段名称
    
    ResultSetmetaData getMetaData();//获取结果集元数据
    int getColumnCount();//获取结果集列数
    String getColumnName(int);//获取指定列字段名称

        ResultSet提供的一系列获取列数据的方法:

    String getString(int);//获取指定列的String类型数据
    int getInt(int);//获取指定列的int类型数据
    double getDouble(int);//获取指定列的double类型数据
    boolean getBoolean(int);//获取指定列的boolean类型的数据
    Object getObject(int);//获取指定列的Object类型数据
    ......

        ResultSet提供的通过列名称获取数据的方法:

    String getString(String);
    int getInt(String);
    double getDouble(String);
    boolean getBoolean(String);
    Object getObject(String);
    ......

      PreparedStatement:

        是Statement的子接口。防sql攻击;提高可读、可维护性;提高效率。

    String sql="select * from t_tbable where column1=? and column2=?";
    PreparedStatement pstmt=conn.prepareStatement(sql);
    pstmt.setString(1,value1);//给第一个参数(问号)赋值,值为value1
    pstmt.setString(2,value2);//给第二个参数赋值,值为value2
    ReusltSet rs=pstmt.executeQuery();

      时间类型:

        数据库类型与Java中类型的对应关系:

          java.util.Date >> java.sql.Date

          java.util.Time >> java.sql.Time

          java.util.Timestamp >> java.sql.Timestamp

        领域对象(domain)中的所有属性不能出现java.sql包下的东西。即不能使用java.sql.Date

        时间类型转换:

          java.util.Date >> java.sql.Date、Time、Timestamp

            把util的Date转换成毫秒值;使用毫秒值创建sql的Date

          java.sql.Date、Time、Timestamp >> java.util.Date

            该转换不需要处理;因为java.sql.Date是java.util.Date的子类。

    java.util.Date date=new java.util.Date();
    long ltime=date.getTime();
    java.sql.Date sqlDate=new java.sql.Date(ltime);

    事物:

      四大特性(ACID)

        原子性(Atomicity):事物中所有操作时不可再分隔的原子单位。事物中的所有操作要么全部执行成功,要么全部执行失败。

        一致性(Consistency):事物执行后,数据库状态与其他业务规则保持一致。

        隔离性(Isolation):指在并发操作中,不同事物之间应该隔离开来,使每个并发中的事物不会相互干扰。

        持久性(Durability):一旦事物提交成功,事物中所有的数据操作都必须被持久化到数据库中,即使提交事物中数据库马上崩溃,在数据库重启时,也必须能保证通过某种机制恢复数据。

      MySql中处理事物:

        开启事物:start transaction

        结束事物:commit(提交)或  rollback(回滚)

      JDBC中处理事物:

        在JDBC中处理事物,都是通过Connection来完成。同一事物中所有的操作,都在使用同一个Connection对象。

        Connection的三个与事物有关的方法:

          setAutoCommit(boolean):设置是否为自动提交事物,true(默认):自动提交;也就是每条执行的sql语句都是一个的单独的事物。false:相当于开启事物。

          commit();提交。

          rollback();回滚。

      三种并发事物问题:

        脏读:读到另一个事物的未提交数据。

        不可重复度:对同一记录的俩次读取不一致,因为另一事物对该记录做了修改。

        幻读(虚度):对同一张表的俩次查询不一致,因为另一事物进行了插入数据的操作。

      四大隔离级别:

        不同事物隔离级别能够解决的数据并发问题的能力是不同的。

        SERIALIZABLE(串行化):

          不会出现任何并发问题,因为它是对同一数据的访问是串行的,非并发访问的。

          性能差

        REPEATABLE READ(可重复读;MySql):

          防止脏读和不可重复读,不能处理幻读问题。

          性能比 SERIALIZABLE 好。

        READ COMMITTED(读已提交数据;Oracle):

          防止脏读,没有处理不可重复读,也没有处理幻读。

          性能比 REPEATABLE READ 好。

        READ UNCOMMITTED(读未提交数据):

          可能出现任何事物并发问题。

          性能最好。

        MySql的默认级别为 REPEATABLE READ

        select @@tx_isolation  默认隔离级别查看语句。

        set  transaction  isolationlevel[4选1]  设置隔离级别。

      JDBC设置隔离级别:

        com.setTransactionIsolation(int);

        参数选值如下:

          Connection.TRANSACTION_READ_UNCOMMITTED;
          Connection.TRANSACTION_READ_COMMITTED;
          Connection.TRANSACTION_REPEATABLE_READ
          Connection.TRANSACTION_SERIAUZABLE;

    数据连接池 简述:

      连接池也是要使用四大连接参数来完成创建连接对象。连接池必须实现:javax.sql.DataSource接口。连接池返回的Connection对象,它的close()方法与众不同。调用它的close()不是关闭,而是把连接归还给池。

      DBCP连接池:

    BasicDataSource dataSource=new BasicDataSource();
    dataSource.setDriverClassName("com.mysql.jdbc.Dirver");
    dataSource.setUrl("jdbc:mysql://locahost:3306/数据库名称");
    dataSource.setUsername(uname);
    dataSource.setPassword(pwd);
    
    dataSource.setMaxActive(int);//最大活动连接
    dataSource.setMinIdle(int);//最小空闲连接
    dataSource.setMaxWait(long);//最大等待时间
    
    Connection conn=dataSource.getConnection();//得到连接对象

    装饰者模式 简述:

      对象增强手段:

        继承:被增强的对象固定。增强的内容也固定。

        装饰者模式:被增强的对象可以切换。增强的内容固定。

        动态代理(AOP):被增强的对象可以切换。增强的内容可以切换。

      为避免继承所造成的类的增多。需使用装饰者模式。

      当A、B、C三个类都有一个父类O时,O a=new A(); O b=new B(a);这种被称为是对进行装饰。是你、有你、一切都靠你

    class B excutes A{
        private A a;
        public B(A a){
            this.a=a;
        }
        public void method(){
            //Code...
        }
    }

      C3P0连接池 简述:

        ComboPooledDataSource

    ComboPooledDataSource cpds=new ComboPooledDataSource();
    cpds.setDriverClass("com.mysql.jdbc.Dirver");
    cpds.setJdbcUrl("jdbc:mysql://localhost:3306/数据库名称");
    cpds.setUser("");
    cpds.setPassword("");
    
    cpds.AcquireIncrement(int);//增量
    cpds.setInitialPoolSize(int);
    cpds.setMinPoolSize(int);
    cpds.setMaxPoolSize(int);

    Connection conn=cpds.getConnection();

        配置文件:

          C3P0的配置文件必须在src目录下,名称必须是:c3p0-config.xml

    <?xml version="1.0" encoding="utf-8"?>
    <c3p0-config>
        <default-config>
            <!-- 四大参数配置 -->
            <property name="jdbcUrl"></property>
            <property name="driverClass"></property>
            <property name="user"></property>
            <property name="password"></property>
            <!-- 池配置 -->
            <property name="acquireIncrement"></property>
            <property name="initialPoolSize"></property>
            <property name="minPoolSize"></property>
            <property name="maxPoolSize"></property>
        </default-config>
    </c3p0-config>

    Tomcat配置JNDI资源:

      JNDI:Java Naming and Directory Interface,Java命名和目录接口。

      作用:在服务器上配置资源,然后通过同一的方式来获取配置的资源。

    <Context>
        <Resource name="" factory="org.apache.naming.factory.BeanFactory" type="" />
    </Context>

      name:指定资源名称。

      factory:资源由谁负责创建

      type:资源类型

      该三个属性必须配置。其他的属性都是资源的参数。

    //获取资源:
    
    //创建JNDI的上下文对象
    Context ct=new InitialContext();
    //查询出入口
    Context enCt=(Context) ct.lookup("java:comp/env");
    //进行二次查询,找到配置的资源
    //参数是使用的是名称与<Resource>元素的name对应值
    DataSource ds=(DataSource)enCt.lookup("");
    Connection conn=ds.getConnection();

      ThreadLocal:类中由三个方法,set()、get()、remove()。

  • 相关阅读:
    非科班能学会编程吗,怎么学习
    自学Java最起码要学到什么程度?
    一个 Java 线程生命周期,我竟然可以扯半小时
    Java基础编程练习题
    Java程序员从小工到专家成神之路(2020版)
    学习 JAVA,有什么书籍推荐?学习的方法和过程是怎样的?
    初学者该如何学习Java(附带Java学习路线)
    Java程序员必备基础:Object的十二个知识点
    Web前端和JAVA应该学哪个?哪个就业形势更好?
    随笔(三十)
  • 原文地址:https://www.cnblogs.com/zltao/p/10429717.html
Copyright © 2011-2022 走看看