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