Java语言访问数据库的一种规范
无人不晓数据库连接的进度,不过近来面试的人(菜面菜),都在说用的SSM框架,可是自个儿问了一下,mybatis是怎么总是上mysql的,基本上都会说:配置好的,直接用了,昨天自己来投石问路一下,接待拍砖!
原稿链接:
什么是JDBC?
什么是JDBC?
Java语言访谈数据库的意气风发种规范,是风度翩翩套API。JDBC (Java Database Connectivity) API,即Java数据库编制程序接口,是大器晚成组正式的Java语言中的接口和类,使用那几个接口和类,Java顾客端程序能够访谈各样分裂门类的数据库。JDBC标准应用接口和兑现抽离的思考设计了Java数据库编制程序的框架。接口蕴含在java.sql及javax.sql包中,当中java.sql归于JavaSE,javax.sql归属JavaEE。为了使客商端程序独立于特定的数据库驱动程序,JDBC标准建议开荒者使用基于接口的编制程序方式,即尽量使应用仅注重java.sql及javax.sql中的接口和类。
Java言语访谈数据库的风流罗曼蒂克种标准,是大器晚成套API
JAVA使用JDBC访谈数据库的步调:
JDBC (Java Database Connectivity) API,即Java数据库编制程序接口,是生龙活虎组正式的Java语言中的接口和类,使用那几个接口和类,Java顾客端程序能够访谈各样分化档案的次序的数据库。举例建设构造数据库连接、施行SQL语句实行多少的存取操作。
1.拿到数据库驱动程序
2.创造数据库连接
JDBC标准接纳接口和达成抽离的观念设计了Java数据库编制程序的框架。接口饱含在java.sql及javax.sql包中,当中java.sql归属JavaSE,javax.sql归属JavaEE。那个接口的贯彻类叫做数据库驱动程序,由数据库的厂家或别的的商家或个体提供。
3.执行SQL语句
4.到手结果集
为了使客商端程序独立于特定的数据库驱动程序,JDBC规范建议开垦者使用基于接口的编制程序方式,即尽量使应用仅信赖java.sql及javax.sql中的接口和类。
5.对结果集做相应的拍卖(增,删,改,查)
6.闭馆财富:这里释放的是DB中的资源
mysql的驱动包提供了java.sql.Driver那一个SPI的兑现,达成类是com.mysql.jdbc.Driver,在mysql-connector-java-5.1.6.jar中,大家能够见到有三个META-INF/services目录,目录下有多个文件名字为java.sql.Driver的公文,个中的故事情节是com.mysql.jdbc.Driver。
在运维DriverManager.getDriver并传到参数“com.mysql.jdbc.Driver”时,DriverManager会从mysql-connector-java-5.1.6.jar中找到com.mysql.jdbc.Driver并实例化再次来到贰个com.mysql.jdbc.Driver的实例。而SPI(ServiceProvider
Interface卡塔 尔(阿拉伯语:قطر是指部分提要求你继续、扩张,完成自定义功效的类、接口可能措施。
JDBC驱动程序:
怎么着是JDBC驱动程序?
SPI是大器晚成种回调的考虑,回调是指大家在应用api时,大家得以向API传入一个类依旧措施,API在方便的年月调用类大概措施。SPI是在局地通用的正规化中,为职业的实现产商提供的扩充点。标准在上层提供API,API内部采纳了SPI,当API被客商使用时,会动态得从如今运作的classpath中找出该SPI的贯彻,然后接纳该SPI的实现来形成API的效力。
那个是种种数据库厂商依照JDBC的正儿八经制作的JDBC达成类
SPI的贯彻形式是:提供完成的落实类打包成Jar文件,那几个Jar文件里面必需有META-INF目录,其下又有services目录,其下有一个文件文件,文件名即为SPI接口的真名,文件的剧情该jar包中提供的SPI接口的贯彻类名。
JDBC驱动程序的八系列型:
我们看档案的次序中Mybaits的jar包会发现:
1. 第风度翩翩类别型的驱动程序的贯彻是透过将JDBC的调用全部寄托给任何编制程序接口来促成的,举个例子ODBC。那连串型的驱动程序需求安装本地代码库,即依据于本地的次第,所以便携性非常差。举例JDBC-ODBC桥驱动程序
private class SqlSessionInterceptor implements InvocationHandler {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
SqlSession sqlSession = getSqlSession(
SqlSessionTemplate.this.sqlSessionFactory,
SqlSessionTemplate.this.executorType,
SqlSessionTemplate.this.exceptionTranslator);
try {
Object result = method.invoke(sqlSession, args);
if (!isSqlSessionTransactional(sqlSession, SqlSessionTemplate.this.sqlSessionFactory)) {
// force commit even on non-dirty sessions because some databases require
// a commit/rollback before calling close()
sqlSession.commit(true);
}
return result;
} catch (Throwable t) {
Throwable unwrapped = unwrapThrowable(t);
if (SqlSessionTemplate.this.exceptionTranslator != null && unwrapped instanceof PersistenceException) {
// release the connection to avoid a deadlock if the translator is no loaded. See issue #22
closeSqlSession(sqlSession, SqlSessionTemplate.this.sqlSessionFactory);
sqlSession = null;
Throwable translated = SqlSessionTemplate.this.exceptionTranslator.translateExceptionIfPossible((PersistenceException) unwrapped);
if (translated != null) {
unwrapped = translated;
}
}
throw unwrapped;
} finally {
if (sqlSession != null) {
closeSqlSession(sqlSession, SqlSessionTemplate.this.sqlSessionFactory);
}
}
}
}
2. 第三种等级次序的驱动程序的完成是有的基于Java语言的。即该驱动程序后生可畏都部队分是用Java语言编写,其它一些委托本地的数据库的顾客端代码来实现。同类型1的驱动同样,该品种的驱动程序也凭仗地方的次序,所以便携性很糟糕
sqlSessionTemplate.SqlSessionInterceptor源码,有未有大器晚成种很熟知的痛感?至于getConnection自个儿去看;用过ElasticSearch和Redis的童鞋,留心的童鞋会开掘三番五次字符串都大约,连接都以相似的,标准的连年情势,提升效能,有效调控连接;
3. 第三种等级次序的驱动程序的达成是漫天基于JAVA语言的。该项指标驱动程序平常由某此中间件服务器提供,那样顾客端程序能够利用数据库无关的商谈和中间件服务器实行通讯,中间件服务器再将客户端的JDBC调用转载给数据库进行管理
ElasticSearch的连年字符串:
4. 第各种档次的驱动程序的落到实处是百分百基于JAVA语言的。该项目标驱动程序中富含了特定数据库的走访合同,使得客商端能够间接和数据库举行通讯
protected SearchResponse getSearchResponse(String fieldName, String indexName) {
client = null;
SearchResponse response = null;
try {
getClient();
MaxAggregationBuilder aggregation =
AggregationBuilders
.max("agg")
.field(fieldName);
SearchRequestBuilder request = client.prepareSearch(indexName).addAggregation(aggregation);
response = request.execute().actionGet();
} catch (Exception ex) {
logger.error("getSearchResponse", ex);
} finally {
if (client != null) {
client.close();
}
return response;
}
}
Jedis连接字符串:
JDBC类结构:
执行命令如下:
Jedis jedis = null;
try {
jedis = jedisPool.getResource();
//具体的命令
jedis.executeCommand()
} catch (Exception e) {
logger.error("op key {} error: " + e.getMessage(), key, e);
} finally {
//注意这里不是关闭连接,在JedisPool模式下,Jedis会被归还给资源池。
if (jedis != null)
jedis.close();
}
DriverManager
拦截器的贯彻都以基于代理的设计情势完毕的,简单的讲就是要开创三个指标类的代理类,在代理类中实践目的类的诀要并在措施在此以前施行拦截器代码,拦截器常有登录拦截器——验证会话音讯,权限拦截器——验证权限新闻,那么SqlSessionInterceptor是为何的?
Mybatis拦截器设计的叁个最初的愿景正是为了供客商在一些时候可以兑现团结的逻辑而不必去动Mybatis固有的逻辑。打个举个例子,对于Executor,Mybatis中有二种完成:BatchExecutor、ReuseExecutor、SimpleExecutor和CachingExecutor。
本条时候假若你以为这几种完毕对于Executor接口的query方法都不能满意你的供给,那怎么做呢?是要去改源码吗?当然不。大家得以成立贰个Mybatis拦截器用于拦截Executor接口的query方法,在阻拦之后完毕和睦的query方法逻辑,之后方可选用是还是不是继续试行原本的query方法。允许你在已映射语句实行进程中的某一点展开拦截调用。有的用Mybatis拦截器统封装分页,有的用它完结读写剥离等,假若读写分离仍旧提出配置好些个据源;
Driver Driver
spring整合mybatis之后,通过动态代理的不二诀窍,使用SqlSessionTemplate持有的sqlSessionProxy属性来代理试行sql操作,由spring管理的sqlSeesion在sql方法(增删改查等操作)实施达成后就自动关闭了sqlSession,无需大家对其进展手动关闭。
愿你有恋人终成亲属,愿你有个有意思的神魄,愿你拍本人少年老成砖!
Connection Connection
Statement Statement
Resultset Resultset
DriverManager:那么些是贰个得以完成类,它是三个厂子类,用来临盆Driver对象的
以此类的结构设计格局为工厂方法
Driver:那是驱动程序对象的接口,它指向八个无疑的数据库驱动程序对象,那么那么些数据库驱动程序对象是从何地来的啊?
DriverManager工厂中有个格局:getDriver(String U福特ExplorerL),通过那几个方法能够获得驱动程序对象,那个法子是在每种数据库厂商按JDBC规范设计的数据库驱动程序包里的类中静态完结的,也正是在静态块中
Connection:这几个接口能够制向二个数据库连接对象,那么怎么着获取那么些一而再对象啊?
是由此DriverManager工厂中的getConnection(String UEvoqueL)方法拿到的
Statement:用于推行静态的SQL语句的接口,通过Connection中的createStatement方法获得的
Resultset:用于指向结果集对象的接口,结果集对象是经过Statement中的execute等措施获得的
JAVA使用JDBC访谈数据库的步骤:
1. 获得数据库驱动程序
2. 创建数据库连接
3. 执行SQL语句
4. 得到结果集
5. 对结果集做相应的拍卖(增,删,改,查)
6. 关闭财富:这里释放的是DB中的能源
设置classpath:
1. 在java文件中起的包名应当固然工程基目录下的子目录,classpath:基目录
2. .jar包,须要将以此.jar包的路径不外乎这几个文件的真名增加到classpath中来
Oracle连天字符串的书写格式:
“oracle:jdbc:thin:@ip:1521: 数据库名”,”数据库顾客名”,”数据库密码”
简短的事例:
package moudule1.first;
import java.sql.*;
public class FirstJdbc
{
public static void main(String[] args)
{
String sql="select * from yuchen_user";
Connection con=null;
Statement st=null;
ResultSet rs=null;
try
{
Class.forName("oracle.jdbc.driver.OracleDriver");
con=DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:name", "scott","tiger");
st=con.createStatement();
rs=st.executeQuery(sql);
while(rs.next())
{
System.out.println(rs.getInt("id"));
System.out.println(rs.getString("name"));
}
}catch(Exception e)
{
e.printStackTrace();
}finally
{
try
{
con.close();
}catch(Exception e)
{}
try
{
st.close();
}catch(Exception e)
{
}
try
{
rs.close();
}catch(Exception e)
{
}
}
}
}
常用数据库的驱动程序及JDBC U福睿斯L:
Oracle数据库:
驱动程序包名:ojdbc14.jar
驱动类的名字:oracle.jdbc.driver.OracleDriver
JDBC URL:jdbc:oracle:thin:@dbip:port:databasename
表明:驱动程序包名有一点都不小恐怕会变
JDBC UPAJEROL中深深蓝字体部分必得未有丝毫改动的保存,为该驱动识别的U君越L格式。杏黄字体部分要求基于数据库的设置情状填写。个中各种部分含义如下:
dbip –为数据库服务器的IP地址,假设是本土可写:localhost或127.0.0.1。
port –为数据库的监听端口,须求看安装时的配置,缺省为1521。
databasename –为数据库的SID,日常为大局数据库的名字。
举个例子如若要访谈本地的多少库allandb,端口1521,那么U安德拉L写法如下:
jdbc:oracle:thin:@localhost:1521:allandb 下载地址如下:
SQL Server数据库
驱动程序包名:msbase.jar mssqlserver.jar msutil.jar
驱动类的名字:com.microsoft.jdbc.sqlserver.SQLServerDriver
JDBC URL:jdbc:microsoft:sqlserver://dbip:port;DatabaseName=databasename
表明:驱动程序包名有相当的大恐怕会变
JDBC U卡宴L中海洋蓝字体部分务必维持原状的保存,为该驱动识其他ULX570L格式。铁锈色字体部必要依靠数据库的装置情状填写。当中各样部分含义如下:
dbip –为数据库服务器的IP地址,假若是本地可写:localhost或127.0.0.1。
port –为数据库的监听端口,需求看安装时的布局,缺省为1433。
databasename –数据库的名字。
比方若是要寻访当地的数额库allandb,端口1433,那么UQashqaiL写法如下:
jdbc: microsoft: sqlserver:@localhost:1433; DatabaseName =allandb
下载地址:
MySQL数据库
驱动程序包名:mysql-connector-java-3.1.11-bin.jar
驱动类的名字:com.mysql.jdbc.Driver
JDBC URL:jdbc:mysql://dbip:port/databasename
说明:驱动程序包名有一点都不小只怕会变
JDBC USportageL中浅碧绿字体部分必须未有丝毫校勘的保存,为该驱动识其余UEvoqueL格式。黄褐字体部须要基于数据库的设置景况填写。此中各样部分含义如下:
dbip –为数据库服务器的IP地址,倘诺是本地可写:localhost或127.0.0.1。
port –为数据库的监听端口,需求看安装时的配置,缺省为3306。
databasename –数据库的名字。
比如若是要拜谒本地的数据库allandb,端口1433,那么U奥迪Q3L写法如下:
jdbc:mysql://localhost:3306/allandb
下载地址:
Access数据库
驱动程序包名:该驱动程序包涵在JavaSE中,无需非凡安装。
驱动类的名字:sun.jdbc.odbc.JdbcOdbcDriver
JDBC URL:jdbc:odbc:datasourcename
表达:该驱动只好职业在Windows系统中,首先必要在操作系统中国建工总集团立二个得以访谈Access数据库之处数据源(ODBC),借使名叫allandb,那么UTiggoL写法如下:
jdbc:odbc:allandb
PreparedStatement接口:
预编写翻译的sql语句对象
效率: 消除了书写sql语句时某个非同小可的字符与sql保留字符冲突的主题材料,非常便于
/**
*知识点:
*PreparedStatement接口及方法的使用
*程序目标:
*java文件:
*PreparedInsert.java:连接数据库,插入一条数据
*JdbcUtil.java:实现一个工具类,功能:1.连接数据库 2.关闭资源
*/
package moudule1.preparedstatement;
import java.sql.*;
import moudule1.com.*;
public class PreparedInsert
{
public static void main(String[] args)
{
String sql="insert into yuchen_user (id,name) values (?,?)";
System.out.println(sql);
Connection con=null;
PreparedStatement ps=null;
try{
con=JdbcUtil.getConnection();
ps=con.prepareStatement(sql);
ps.setInt(1,2);
ps.setString(2,"zhangsan");
ps.executeUpdate();
ps.setInt(1,3);
ps.setString(2,"lisi");
ps.executeUpdate();
}catch(Exception e){
e.printStackTrace();
}finally{
JdbcUtil.close(con,ps);
}
}
}
package moudule1.com;
import java.sql.*;
public class JdbcUtil{
public static Connection getConnection() throws Exception{
Class.forName("oracle.jdbc.driver.OracleDriver");
return DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:name", "scott","tiger");
}
public static void close(Connection con,Statement st){
close(con);
close(st);
}
public static void close(Connection con,Statement st,ResultSet rs){
close(con,st);
close(rs);
}
public static void close(Connection con){
try{
con.close();
}catch(Exception e){
}
}
public static void close(Statement st){
try{
st.close();
}catch(Exception e){
}
}
public static void close(ResultSet rs){
try{
rs.close();
}catch(Exception e){
}
}
}
数据库的增加和删除改查的例证:
/**
*知识点:
*JDBC+SQL+ORACLE
*程序目标:
*UserDao.java:实现了数据库的增删改查
*JdbcUtil.java:工具类,有连库和关闭资源的方法
*/
package moudule1.idus;
import java.sql.*;
import moudule1.com.*;
public class UserDao{
private String sql;
private Connection con;
private Statement st;
private ResultSet rs;
public UserDao(){
sql=null;
con=null;
st=null;
rs=null;
}
public void insert(){
sql="insert into yuchen_user (id,name) values(";
sql+="4,'zhouwu')";
System.out.println(sql);
try{
con=JdbcUtil.getConnection();
st=con.createStatement();
st.executeUpdate(sql);
}catch(Exception e){
e.printStackTrace();
}finally{
JdbcUtil.close(con,st);
}
}
public void delete(){
sql="delete from yuchen_user where id=2";
System.out.println(sql);
try{
con=JdbcUtil.getConnection();
st=con.createStatement();
st.executeUpdate(sql);
}catch(Exception e){
e.printStackTrace();
}finally{
JdbcUtil.close(con,st);
}
}
public void update(){
sql="update yuchen_user set name='liumang' where id=1";
System.out.println(sql);
try{
con=JdbcUtil.getConnection();
st=con.createStatement();
st.executeUpdate(sql);
}catch(Exception e){
e.printStackTrace();
}finally{
JdbcUtil.close(con,st);
}
}
public void select(){
sql="select * from yuchen_user";
System.out.println(sql);
try{
con=JdbcUtil.getConnection();
st=con.createStatement();
rs=st.executeQuery(sql);
while(rs.next()){
System.out.println(rs.getInt(1));
System.out.println(rs.getString(2));
}
}catch(Exception e){
e.printStackTrace();
}finally{
JdbcUtil.close(con,st,rs);
}
}
public static void main(String[] args){
UserDao ud=new UserDao();
ud.select();
ud.insert();
ud.select();
ud.update();
ud.select();
ud.delete();
ud.select();
}
}
有的常用的情势:
/**
*知识点:
*execute方法,getResultSet(),getUpdateCount()
*程序目标:
*JdbcUtil.java:工具类,连接数据库,关闭资源
*sqlExecutor.java:命令行参数输入sql语句,并执行该语句
*/
package moudule1.fangfa;
import java.sql.*;
import moudule1.com.*;
public class sqlExecutor{
public static void main(String[] args){
Connection con=null;
Statement st=null;
try{
con=JdbcUtil.getConnection();
st=con.createStatement();
boolean str=st.execute(args[0]);
if(str){
ResultSet rs=st.getResultSet();
while(rs.next()){
System.out.println(rs.getInt("id")+":"+rs.getString("name"));
}
rs.close();
}else{
int row=st.getUpdateCount();
System.out.println(row);
}
}catch(Exception e){
e.printStackTrace();
}finally{
JdbcUtil.close(con,st);
}
}
}
- 补充
JDBC连接MySQL
加载及注册JDBC驱动程序
Class.forName("com.mysql.jdbc.Driver");
Class.forName("com.mysql.jdbc.Driver").newInstance();
JDBC UPAJEROL 定义驱动程序与数据源之间的接连
业内语法:
<protocol(首要通信契约卡塔 尔(阿拉伯语:قطر>:<subprotocol(次要通信合同,即驱动程序名称卡塔尔>:<data source identifier(数据源卡塔 尔(英语:State of Qatar)>
MySQL的JDBC URL格式:
jdbc:mysql//[hostname][:port]/[dbname][?param1=value1][¶m2=value2]….
示例:jdbc:mysql://localhost:3306/sample_db?user=root&password=your_password
科学普及参数:
user 用户名
password 密码
autoReconnect 联机失利,是还是不是再一次联合(true/false卡塔尔
maxReconnect 尝试再次联合次数
initialTimeout 尝试再一次联合间隔
maxRows 传回最大行数
useUnicode 是还是不是选拔Unicode字体编码(true/false卡塔 尔(英语:State of Qatar)
characterEncoding 何种编码(GB2312/UTF-8/…卡塔 尔(英语:State of Qatar)
relaxAutocommit 是不是自动提交(true/false卡塔尔国
capitalizeTypeNames 数据定义的称谓以大写表示
树立连接对象
String url="jdbc:mysql://localhost:3306/sample_db?user=root&password=your_password";
Connection con = DriverManager.getConnection(url);
确立SQL陈诉式对象(Statement Object)
Statement stmt = con.createStatement();
执行SQL语句
executeQuery()
String query = "select *澳门新葡亰app, from test";
ResultSet rs=stmt.executeQuery(query);
结果集ResultSet
while(rs.next())
{rs.getString(1);rs.getInt(2);}
executeUpdate()
String upd="insert into test (id,name) values(1001,xuzhaori)";
int con=stmt.executeUpdate(upd);
execute()
示例:
try{
}
catch(SQLException sqle)
}
finally
{
}
Java类型和SQL类型 手艺手册P421
PreparedStatement(预编语句卡塔 尔(英语:State of Qatar)
PreparedStatement stmt = conn.prepareStatement("insert into test(id,name)values(?,?)");
stmt.setInt(1,id);
stmt.setString(2,name);
注:生龙活虎旦设定语句的参数值后,就足以每每进行改语句,直到调用clearParameters(卡塔尔方法将他解除停止
CallableStatement(预储程序卡塔 尔(阿拉伯语:قطر技巧手册P430
JDBC2.0使用
ResultSet对象中的光标上下自由运动
Statement stmt = con.createStatement (ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet rs=stmt.executeQuery("select * from test");
public Statement createStatement(int resultSetType,int resultSetConcuttency) throws SQLException
resultSetType
TYPE_FORWARD_ONLY 只可以采纳next(卡塔尔方法。
TYPE_SCROLL_SENSITIVE 能够上下运动,能够获取校订后的值。
TYPE_SCROLL_INSENSITIVE 能够上下移动。
resultSetConcuttency
CONCUR_READ_ONLY 只读
CONCUR_UPDATABLE ResultSet对象足以执行数据库的大幅度增加、改正、和移除
向来行使ResultSet对象推行更新数据
新添多少
Statement stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_PUDATABLE);
ResultSet uprs=stmt.executeQuery("select * from test");
uprs.moveToInsertRow();
uprs.updateInt(1,1001);
uprs.updateString(2,"许召日");
uprs.insertRow;
履新数据
Statement stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_PUDATABLE);
ResultSet uprs=stmt.executeQuery("select * from test");
uprs.last();
uprs.updateString("name","xuzhaori");
uprs.updateRow;
删除数据
Statement stmt=con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_PUDATABLE);
ResultSet uprs=stmt.executeQuery("select * from test");
uprs.absolute(4);
uprs.deleteRow();
批处理
con.setAutoCommit(false); 关闭自动确认格局
Statement stmt=con.createStatement();
int[] rows;
stmt.addBatch("insert into test values(1001,xuzhaori)");
stmt.addBatch("insert into test values(1002,xuyalin)");
rows=stmt.executeBatch();
con.commit(); 未有别的不当,施行批管理stmt.executeBatch();
JNDI-数据源(Data Source卡塔尔与连接池(Connection Pool卡塔 尔(英语:State of Qatar)
汤姆cat的JDBC数据源设置 技术手册P439
连接池工具-Proxool Var 0.8.3 技巧手册P446
设置web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>
<!--<?xml version="1.0" encoding="GB2312"?>-->
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
….
<servlet>
<servlet-name>ServletConfigurator</servlet-name>
<servlet-class>org.logicalcobwebs.proxool.configuration.ServletConfigurator</servlet-class>
<init-param>
<param-name>propertyFile</param-name>
<param-value>WEB-INF/classes/Proxool.properties</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
后端总计端口加多下列
<servlet>
<servlet-name>Admin</servlet-name>
<servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Admin</servlet-name>
<url-pattern>/Admin</url-pattern>
</servlet-mapping>
….
</web-app>
配置Proxool.properties
jdbc-0.proxool.alias=JSPBook
jdbc-0.proxool.driver-class=com.mysql.jdbc.Driver
jdbc-0.proxool.driver-url=jdbc:mysql://localhost:3306/sample_db?user=root&password=browser&useUnicode=true&characterEncoding=UTF-8
jdbc-0.proxool.maximum-connection-count=10
jdbc-0.proxool.prototype-count=4
jdbc-0.proxool.house-keeping-test-sql=select CURRENT_DATE
jdbc-0.proxool.verbose=true
jdbc-0.proxool.statistics=10s,1m,1d 后端统计接口添加此行
jdbc-0.proxool.statistics-log-level=DEBUG
使用Proxool连接池
Connection con = DriverManager.getConnection("proxool.JSPBook");
Statement stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
String query = "SELECT * FROM employee";
ResultSet rs = stmt.executeQuery(query);
动用JDBC时,大家都会很自然得利用下列语句:
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8";
String user = "";
String psw = "";
Connection con = DriverManager.getConnection(url,user,psw);
为何说很自然吧,因为不论是英特网或然书本教程上得例子都以这么的,何况程序也实在符合规律运作了,于是大家也就问心无愧的找葫芦画瓢下去了。
必须求有这一句吗?不是的,大家一同能够用如此一句替代它:
com.mysql.jdbc.Driver driver = new com.mysql.jdbc.Driver();
//or:
//new com.mysql.jdbc.Driver();
String url = "jdbc:mysql://127.0.0.1/test?useUnicode=true&characterEncoding=utf-8";
String user = "";
String psw = "";
Connection con = DriverManager.getConnection(url,user,psw);
大家兴许都看见个概况来了,大家只供给在调用DriverManager的getConnection方法以前,保险相应的Driver类已经被加载到jvm中,何况完结了类的最早化工作就能够了,而具体是何等得以达成这一个职能却是未有珍视的。
谈起类的开端化,这里必须要提,在如何的景况下类才具够初阶化?
- 创办类的实例
- 拜见某些类或接口的静态变量,大概对该静态变量赋值
- 调用类的静态方法
- 反射(如Class.forName("com.lang.String")
- 早先化三个类的子类
- Java虚拟机运行时被标为运维类的类
上边二种方式都得以兑现那几个效果,由在此以前后相继能够不荒谬运作。注意了,假若大家开展如下操作,程序是一定要荒谬运转的,因为如此只是使Driver类棉被服装载到jvm中,却从不展开相应的开头化工作。具体有关类的加载和初步化详细,能够翻阅笔者的那篇博文《JVM虚构机和类加载器》。
com.mysql.jdbc.Driver driver = null;
//or:
ClassLoader cl = new ClassLoader();
cl.loadClass("com.mysql.jdbc.Driver");
大家都晓得JDBC是运用Bridge情势实行统筹的,DriverManager便是内部的Abstraction,java.sql.Driver是Implementor,com.mysql.jdbc.Driver是Implementor的二个实际实现(请参见GOF的Bridge格局的叙说卡塔尔国。大家小心了,前四个Driver是七个接口,前面一个却是二个类,它达成了面前的Driver接口。
Bridge情势中,Abstraction(DriverManager卡塔 尔(英语:State of Qatar)是要具有四个Implementor(Driver卡塔 尔(英语:State of Qatar)的引用的,可是我们在动用进度中,并从未将Driver对象注册到DriverManager中去啊,那是怎么回事呢?jdk文书档案对Driver的呈报中有那般一句:
When a Driver class is loaded, it should create an instance of itself and register it with the DriverManager
哦,原来是com.mysql.jdbc.Driver在装载完后自动帮我们落成了这一手续。源代码是那般的:
能够看来DriveManager里面定义了静态方法,而mysql等驱动类都是在那之中用静态数据块的艺术来伊始化,达成Driver对象注册到DriverManager中,所以若是jvm装载了那么些使得类就能够将Driver对象注册到DriverManager中去(Class.forName(xxx.xx.xx) 重临的是贰个类;Class.forName(xxx.xx.xx);的效应是必要JVM查找并加载钦定的类,也正是说JVM会推行该类的静态代码段 。静态代码是和class绑定的,class装载成功就代表推行了你的静态代码了。何况其后不会再走这段静态代码了。),前边就能够直接使用了。
本文由澳门新葡亰app发布于新葡亰数据库,转载请注明出处: Java语言访问数据库的一种规范
关键词: