.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()。

原文地址:https://www.cnblogs.com/zltao/p/10429717.html