连接池,元数据与jdbc框架
来源:互联网 发布:淘宝文胸打造爆款经验 编辑:程序博客网 时间:2024/05/19 18:42
连接池,元数据与jdbc框架
一、JNDI技术
1、JNDI(Java Naming and DirectoryInterface),Java命名和目录接口,它对应于J2SE中的javax.naming包,
2、这套API的主要作用在于:它可以把Java对象放在一个容器中(JNDI容器),并为容器中的java对象取一个名称,以后程序想获得Java对象,只需通过名称检索即可。
3、其核心API为Context,它代表JNDI容器,其lookup方法为检索容器中对应名称的对象。
4、代码:
context.xml:
<Context>
<Resourcename="jdbc/testDB"(可以是任意的名字)
auth="Container"
type="javax.sql.DataSource"
username="root"
password="root"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/test"
maxActive="8"
maxIdle="4"/>
</Context>
Servlet:
try {
//初始化jndi容器
InitialContext initCxt =newInitialContext();
//检索出web服务器中的jndi容器
Context envCxt=(Context)initCxt.lookup("java:comp/env");
DataSource ds=(DataSource)envCxt.lookup("jdbc/testDB");//从jndi容器查找资源
Connection conn=ds.getConnection();
System.out.println(conn);
} catch(Exception e) {
e.printStackTrace();
}
}
二、元数据(数据库、表、列的定义信息)
1、 数据库元数据:DataBaseMetaData
(1)通过Connection.getDatabaseMetaData()得到DataBaseMetaData对象,然后在调用其方法。
(2)对象的方法:
①getURL():返回一个String类对象,代表数据库的URL。
②getUserName():返回连接当前数据库管理系统的用户名。
③getDatabaseProductName():返回数据库的产品名称。
④getDatabaseProductVersion():返回数据库的版本号。
⑤getDriverName():返回驱动驱动程序的名称。
⑥getDriverVersion():返回驱动程序的版本号。
⑦isReadOnly():返回一个boolean值,指示数据库是否只允许读操作。
2、参数元数据:ParameterMetaData
(1)通过PreparedStatement .getParameterMetaData()获得代表PreparedStatement元数据的ParameterMetaData对象。编写sql语句,调用相应方法。
(2)ParameterMetaData对象方法:
①getParameterCount():获得指定参数的个数
②getParameterType(int param):获得指定参数的sql类型
3、结果集元数据:ResultSetMetaData
(1)通过ResultSet. getMetaData()获得代表ResultSet对象元数据的ResultSetMetaData对象,调用相应的方法。
(2)ResultSetMetaData对象的方法:
①getColumnCount():返回resultset对象的列数
②getColumnName(int column):获得指定列的名称
③getColumnTypeName(int column):获得指定列的类型
三、使用元数据简化JDBC代码
1、所有实体的CUD操作代码基本相同,仅仅发送给数据库的SQL语句不同而已,因此可以把CUD操作的所有相同代码抽取到工具类的一个update方法中,并定义参数接收变化的SQL语句。
代码说明:
//优化CUD模板
publicstaticvoidupdate(String sql,Object[] params){
Connection conn=null;
PreparedStatement st=null;
try {
conn=DBManager_c3p0.getConnection();
st=conn.prepareStatement(sql);
for(inti=0;i<+params.length;i++){
st.setObject(i+1,params[i]);
}
st.executeUpdate();
} catch(SQLException e) {
// TODOAuto-generated catch block
e.printStackTrace();
}finally{
DBManager_c3p0.closeDB(conn,st, null);
}
插入代码:
publicvoidinsert(){
String sql="insert intoadmin(id,name,pass)value(?,?,?)";
Object[]params={17,"abc","abcd"};
DBManager_c3p0.update(sql,params);}
更新语句:
Public void update(){
String sql="update adminset name=?,pass=? where id=?";
Object[]params={"aaa","aaa",17};
DBManager_c3p0.update(sql,params);}
删除语句:
publicvoiddelete(){
String sql="delete fromadmin where id=?";
Object[]params={17};
DBManager_c3p0.update(sql,params);}
2、实体的R操作,除SQL语句不同之外,根据操作的实体不同,对ResultSet的映射也各不相同,因此可义一个query方法,除以参数形式接收变化的SQL语句外,可以使用策略模式由qurey方法的调用者决定如何把ResultSet中的数据映射到实体对象中。
代码说明:
//优化R模板
publicstaticObject query(String sql,Object[] params,ResultSetHandler h){
Connectionconn=null;
PreparedStatementst=null;
ResultSetrs=null;
try {
conn=DBManager_c3p0.getConnection();
st=conn.prepareStatement(sql);
for(inti=0;i<+params.length;i++){
st.setObject(i+1,params[i]);
}
rs=st.executeQuery();
//调用接口,将结果集传给handler方法自己处理
returnh.handler(rs);
}catch (SQLException e) {
thrownewRuntimeException(e);
}finally{
DBManager_c3p0.closeDB(conn,st, rs);
}
}
处理器中的代码:
publicclassBeanHandlerimplements ResultSetHandler {
private Classclazz;
public BeanHandler(Classclazz){
this.clazz=clazz;
}
public Objecthandler(ResultSet rs) {
//要把结果集封装到bean中
try{
if(!rs.next()){
returnnull;
}
//实例化一个对象
Object bean=clazz.newInstance();
//将结果集rs赋到bean对象中
ResultSetMetaDatameta=rs.getMetaData();//获取结果集里的信息(元数据)
//获取列数
intcount=meta.getColumnCount();
for(inti=0;i<count;i++){
//用循环将字段名取出
StringcolumnName=meta.getColumnName(i+1);
//从结果集里取值
Objectvalue=rs.getObject(columnName);
//将值赋给bean中对应的属性
Fieldf=bean.getClass().getDeclaredField(columnName);//反射bean上与列名相对应得属性
f.setAccessible(true);
f.set(bean,value);
}
returnbean;
}catch(Exceptione){
thrownewRuntimeException(e);
}
}
接口代码:
publicinterfaceResultSetHandler {
public Objecthandler(ResultSet rs);}
查询语句代码:
publicvoidfind(){
String sql="selectid,name,pass from admin where id=?";
Object []params={1};
Admin admin=(Admin) DBManager_c3p0.query(sql,params,new BeanHandler(Admin.class));
System.out.println(admin.getId()+".."+admin.getName()+".."+admin.getPass());}
注意:此外还要编写bean文件。
- 连接池,元数据与jdbc框架
- 元数据与jdbc框架
- JDBC元数据和DbUtils框架
- JavaWeb-JDBC连接池、JDBC框架
- jdbc学习:操作元数据,以及ORM框架基础
- JDBC与连接池
- JDBC与连接池
- JDBC与连接池
- 连接池及数据元
- JDBC ---- 元数据
- 【JDBC】day02_PreparedStatement_元数据
- JDBC之元数据
- JDBC基础-元数据
- JDBC MetaData (元数据)
- Jdbc连接之数据池
- JavaWeb-JDBC-数据连接池
- java是与Oracle数据连接(jdbc)
- JDBC(一) 简介与获取数据连接
- 智能手机屏幕解锁图案研究
- iOS Programming – 触摸事件处理(2)
- boost多线程简单用法
- linux中vmstat命令
- ajax异步刷新简单的demo
- 连接池,元数据与jdbc框架
- Oracle 中用 update 语句更新date, timestamp字段的格式
- 搜索引擎反作弊
- OSB之在OEPE的IDE中实现封装服务并完成特定操作
- java c标签和三元表达式等价
- 一道有趣的GOOGLE面试题
- Struts2的Convention插件导致”No result defined for action”
- C#调用WebService
- SQLSERVER 之整体介绍