传统JDBC的使用步骤存在以下四个步骤:
1加载数据库驱动程序:
2 通过DriverManager类取得数据库的连接对象。
3.通过Connection实例化PreparedStatement对象,编写SQL命令操作数据库。
4.数据库属于资源操作,操作完成后要关闭数据库以释放资源。
对于不同的用户只有操作不同,但是对于1,2,4三个步骤很明显是一个重复的操作。
如果开发中直接使用JDBC操作的话,那么就会产生这种性能问题,那么怎么做才是最合适的呢?如果假设数据库不关闭,以后如果有新的用户使用的时候直接取一个已经有的连接的话。
在Tomcat中使用数据库连接池:
在web容器中,数据库的连接池都是通过数据源(javax.sql.DataSorce)访问的,即可以通过javax.sql.DataSorce类取得一个Connection对象,但是要想得到一个DataSorce对象需要使用JNDI进行查找。
原理图:
对Tomcat中的Servlet.xml文件进行配置:配置mysql的数据库连接池:
JNDI属于命名及目录查找接口,主要功能是用于进行查找的,查找对象。但是,现在的数据库连接池是需要在tomcat上完成配置的:
要修改servlet.xml文件才可以起作用:
配置mysql连接池:
<Contextpath="/text"docBase = "**" reloadable ="true">
<Resource name ="jdbc/text" auth= "Container" type = "javax.sql.DataSorce" maxActive ="100" maxIdle = "30" maxWait = "10000" username = "root" password = "****" driverClassName = "org.git.mm.Driver" url = "jdbc:mysql://localhost:3306/text"/>
配置Oracle连接池:
<Contextpath="/text"docBase = "**" reloadable = "true">
<Resourcename ="jdbc/text" auth= "Container" type = "javax.sql.DataSorce" maxActive ="100" maxIdle = "30" maxWait = "10000" username = "root" password = "****" driverClassName = "Oracle.jdbc.driver.OracleDriver" url = "jdbc:Oracle:thin:@localhost:1521:text"/>
配置完server.xml之后需要在一个web项目中配置web.xml:指明数据源的名称:
<resource-ref>
<description>DBConnection</description>
<res-ref-name>jdbc/text</res-ref-name>
<res-type>javax.sql.DataSorce<res-type>
<res-auth>Container</res-auth>
</resouce-ref>
查找数据源:
数据源的操作使用的是JNDL方式进行查找的,所以使用数据源取数据库的连接
必须按照如下步骤进行:
(1) 初始化名称查找上下文:Context ctx = newInitialContext();
(2) 通过名称查找DataSource对象:Datasource ds = (DataSource)ctx.lookup(JNDL名称);
(3) 通过DataSource取得一个数据库的连接:Connectionconn = ds.getConnection();
JNDI服务(java Naming and Directory Interface,java命名及目录接口)是javaEE提供的一个服务,其服务的主要功能是通过一个名称的“key”查找到一个对象的value。
通过数据源取得数据库连接的代码:注意:在使用tomcat进行数据源查找时,java:comp/env(环境命名上下文Enviromnet
NamingContext (ENC))属性必须设置,对于一些高级的服务器可以不用设置(例如weblogic)。即下面的代码改为:String DSNAME
="java:comp/env/jdbc/mldn";//名称
如果取得连接,则会输出一个对象的信息:
在以后的开发中就可以直接将数据源应用到项目中了,只要数据源的名称不变,则数据库可以任意更换,提升了操作的性能。充分的体现了java的设计思想——可移植性。
数据源连接代码:
总结:
(1)通过数据库连接池可以提高数据库的操作性能,避免掉一些无用的操作。
(2)数据源使用时要使用JNDI进行查找,而且查找时需要指定“java:comp/env”的环境属性。
附:
使JDBC连接数据库:
package com.jd.jdbc1;
import java.sql.Connection;
impor tjava.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class SelectDB
//驱动名(各个数据库不同)
static final String DRIVER = "com.mysql.jdbc.Driver";
//连接数据库的地址(各个版本的数据库不同)
static final String URL = "jdbc:mysql://localhost:3306/test";
//用户名
static final String USER = "root";
//密码
static final String PWD = "fendou";
/**
* 查询数据库
*/
public static void getAll()
{
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
//1、加载驱动
try
{
Class.forName(DRIVER);
//2、使用DrvierManager得到数据库的连接
conn = DriverManager.getConnection(URL, USER,PWD);
//3、创建发送SQL语句的对象
stmt = conn.createStatement();
//4、执行SQL语句
String sql = "select id,name,age fromstudent";
//5、用ResultSet接收查询后的结果集
rs = stmt.executeQuery(sql);
//6、循环一条一条的取出结果集的记录
while(rs.next())//判断结果集是否有数据
{
//7、一列一列的取出数据(注意对应数据类型)
/*intid = rs.getInt(1);
String name = rs.getString(2);
int age = rs.getInt(3);*/
//一般情况都是写列名来获得该列的内容
int id = rs.getInt("id");
String name = rs.getString("name");
int age = rs.getInt("age");
System.out.println(id+","+name+","+age);
}
}
catch (ClassNotFoundException e)
{
e.printStackTrace();
}
catch (SQLException e)
{
e.printStackTrace();
}
finally
{
try
{
if(rs != null)
{
//5、关闭rs
rs.close();
}
if(stmt != null)
{
//5、关闭stmt
stmt.close();
}
if(conn != null)
{
//6、关闭连接
conn.close();
}
}
catch (SQLException e)
{
//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args)
{
getAll();
}
}
package com.jd.jdbc1;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class TestConn
{
//驱动名(各个数据库不同)
static final String DRIVER = "com.mysql.jdbc.Driver";
//连接数据库的地址(各个版本的数据库不同)
static final String URL = "jdbc:mysql://localhost:3306/test";
//用户名
static final String USER = "root";
//密码
static final String PWD = "fendou";
//得到连接数据库的方法
public static void getConn()
{
Connection conn = null;
//1、加载驱动
try
{
Class.forName(DRIVER);
//2、使用DrvierManager得到数据库的连接
conn =DriverManager.getConnection(URL, USER, PWD);
//3、打印conn看其是否为null
System.out.println(conn);
}
catch(ClassNotFoundException e)
{
//TODO Auto-generated catch block
e.printStackTrace();
}
catch(SQLException e)
{
//TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
try
{
if(conn!= null)
{
//4、关闭连接
conn.close();
}
}
catch(SQLException e)
{
//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
publicstatic void main(String[] args)
{
getConn();
}
}
package com.jd.jdbc1;
import java.sql.Connection;
impor tjava.sql.DriverManager;
import java.sql.SQLException;
public class TestConn
{
//驱动名(各个数据库不同)
static final String DRIVER = "com.mysql.jdbc.Driver";
//连接数据库的地址(各个版本的数据库不同)
static final String URL = "jdbc:mysql://localhost:3306/test";
//用户名
static final String USER = "root";
//密码
static final String PWD = "fendou";
//得到连接数据库的方法
public static void getConn()
{
Connection conn = null;
//1、加载驱动
try
{
Class.forName(DRIVER);
//2、使用DrvierManager得到数据库的连接
conn =DriverManager.getConnection(URL, USER, PWD);
//3、打印conn看其是否为null
System.out.println(conn);
}
catch(ClassNotFoundException e)
{
//TODO Auto-generated catch block
e.printStackTrace();
}
catch(SQLException e)
{
//TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
try
{
if(conn!= null)
{
//4、关闭连接
conn.close();
}
}
catch(SQLException e)
{
//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args)
{
getConn();
}
}
package com.jd.jdbc1;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
/**
*
*@author Administrator
*对数据库进行添加、删除、修改
*/
public class UpdateDB
{
//驱动名(各个数据库不同)
static final String DRIVER = "com.mysql.jdbc.Driver";
//连接数据库的地址(各个版本的数据库不同)
static final String URL = "jdbc:mysql://localhost:3306/test";
//用户名
static final String USER = "root";
//密码
static final String PWD = "fendou";
//添加记录
public static void add()
{
Connection conn = null;
Statement stmt = null;
//1、加载驱动
try
{
Class.forName(DRIVER);
//2、使用DrvierManager得到数据库的连接
conn =DriverManager.getConnection(URL, USER, PWD);
//3、创建发送SQL语句的对象
stmt =conn.createStatement();
//4、执行SQL语句
introws = stmt.executeUpdate("insert into student values(null,'lisi',23)");
if(rows> 0)
{
System.out.println("操作成功");
}
else
{
System.out.println("操作失败");
}
}
catch(ClassNotFoundException e)
{
//TODO Auto-generated catch block
e.printStackTrace();
}
catch(SQLException e)
{
//TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
try
{
if(stmt!= null)
{
//5、关闭stmt
stmt.close();
}
if(conn!= null)
{
//6、关闭连接
conn.close();
}
}
catch(SQLException e)
{
//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//添加记录
public static void delete()
{
Connection conn = null;
Statement stmt = null;
//1、加载驱动
try
{
Class.forName(DRIVER);
//2、使用DrvierManager得到数据库的连接
conn =DriverManager.getConnection(URL, USER, PWD);
//3、创建发送SQL语句的对象
stmt =conn.createStatement();
//4、执行SQL语句
String sql = "delete from student where id=1";
int rows = stmt.executeUpdate(sql);
if(rows> 0)
{
System.out.println("操作成功");
}
else
{
System.out.println("操作失败");
}
}
catch(ClassNotFoundException e)
{
//TODO Auto-generated catch block
e.printStackTrace();
}
catch(SQLException e)
{
//TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
try
{
if(stmt!= null)
{
//5、关闭stmt
stmt.close();
}
if(conn!= null)
{
//6、关闭连接
conn.close();
}
}
catch(SQLException e)
{
//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
//添加记录
publicstatic void update()
{
Connectionconn = null;
Statementstmt = null;
//1、加载驱动
try
{
Class.forName(DRIVER);
//2、使用DrvierManager得到数据库的连接
conn =DriverManager.getConnection(URL, USER, PWD);
//3、创建发送SQL语句的对象
stmt =conn.createStatement();
//4、执行SQL语句
String sql = "update student set age=44 where id=3";
int rows = stmt.executeUpdate(sql);
if(rows> 0)
{
System.out.println("操作成功");
}
else
{
System.out.println("操作失败");
}
}
catch(ClassNotFoundException e)
{
//TODO Auto-generated catch block
e.printStackTrace();
}
catch(SQLException e)
{
//TODO Auto-generated catch block
e.printStackTrace();
}
finally
{
try
{
if(stmt!= null)
{
//5、关闭stmt
stmt.close();
}
if(conn!= null)
{
//6、关闭连接
conn.close();
}
}
catch(SQLException e)
{
//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public static void main(String[] args)
{
add();
//delete();
//update();
}
}