类sqljdbc高级模板技术
每日一贴,今天的内容关键字为类sql
1:使用之前学习的jdbc模板技术
A:引入3个包:数据源用到的2个包:commons-dbcp.jar,commons-pool.jar
数据库驱动包:ojdbc14.jar,mysql-connector-xx.jar
B:创立数据库工具类:JDBCUtil.java,该类为数据库工具类,供给数据库的打开,关闭等最基本的功能
采用设计模式:ThreadLocal
C:创立数据库信息文件:db.properties
D:创立数据访问异常类:DataAccessException.java,继承运行时异常,重载其构造函数
E:创立一个映射类:DiscMapper.java,抽象出接口:RowMapper.java
F:创立jdbc模板类:JDBCTemplate.java,该类为抽象类,里面封装了罕见的基于数据库的CRUD操作
供给了一个抽象方法:getRowMapper(),该方法重要实现了RowMapper接口,让查询出来的字段和实体
bean中的属性一一对应。
JDBCUtil.java
/**
* <数据库工具类>
* @author kandy
* @version [V1.00, 2013-5-3]
* @see [相关类/方法]
* @since V1.00
*/
public class JDBCUtil
{
//定义数据源
private static DataSource ds;
//定义当前链接的一个当地线程
private static ThreadLocal<Connection> local =new ThreadLocal<Connection>();
//初始化数据库信息
static
{
try
{
//创立Properties类文件
Properties p=new Properties();
//从用来加载类的搜索路径打开具有指定名称的资源,以读取该资源。
p.load(JDBCUtil.class.getClassLoader().getResourceAsStream("db.properties"));
ds=BasicDataSourceFactory.createDataSource(p);
}
catch (Exception e)
{
e.printStackTrace();
}
}
//获得一个链接(Lazy模式,从线程中获得该链接,如果没有该链接,通过数据源获得连接)
public static Connection getConnection()
{
Connection con = local.get();
if(con==null)
{
try
{
con=ds.getConnection();
}
catch (SQLException e)
{
e.printStackTrace();
}
//将该连接存入当前线程
local.set(con);
}
return con;
}
//关闭数据库链接
public static void colse(Connection con ,Statement st, ResultSet rs)
{
try
{
if(rs!=null)
{
rs.close();
}
if(st!=null)
{
st.close();
}
if(con!=null)
{
con.close();
//从线程中移除该链接
local.remove();
}
}
catch (SQLException e)
{
e.printStackTrace();
}
}
//关闭数据库链接
public static void close()
{
try
{
//将存放在当地线程下的链接关闭
local.get().close();
//从线程中移除该链接
local.remove();
}
catch (SQLException e)
{
e.printStackTrace();
}
}
public static void main(String[] args)
{
Connection conn = JDBCUtil.getConnection();
System.out.println(conn);
JDBCUtil.colse(conn, null, null);
}
}
db.properties
oracle
driverClassName=oracle.jdbc.driver.OracleDriver
url=jdbc\:oracle\:thin\:@10.0.5.98\:1521\:ora9
username=wk
password=wk
mysql
driverClassName=com.mysql.jdbc.Driver
url=jdbc\:mysql\://10.0.5.98\:3306/disc_shop?Unicode\=true&&characterEncoding\=utf8
username=root
password=root
DataAccessException.java
package com.itany.jdbc;
//创立数据访问异常类:DataAccessException.java,继承运行时异常,重载其构造函数
public class DataAccessException extends RuntimeException
{
public DataAccessException()
{
super();
}
public DataAccessException(String message)
{
super(message);
}
public DataAccessException(String message,Throwable cause)
{
super(message,cause);
}
public DataAccessException(Throwable cause)
{
super(cause);
}
}
RowMapper.java
/**
* <让表中的字段和java中的属性一一对应>
* @author kandy
* @version [V1.00, 2013-5-3]
* @see [相关类/方法]
* @since V1.00
*/
public interface RowMapper
{
public Object mapRow(ResultSet rs )throws Exception;
}
创立jdbc模板类:JDBCTemplate.java
/**
*
* <JDBC模板类,实现罕见的CRUD操作>
*
* @author kandy
* @version [V1.00, 2013-5-3]
* @see [相关类/方法]
* @since V1.00
*/
public abstract class JDBCTemplate
{
//查询
public List query(String sql,Object ...params)
{
Connection con =null;
PreparedStatement ps =null;
ResultSet rs =null;
//饿汉式
List list =new ArrayList();
try
{
con =JDBCUtil.getConnection();
ps=con.prepareStatement(sql);
for(int i=0;i<params.length;i++)
{
ps.setObject(i+1,params[i]);
}
rs=ps.executeQuery();
while(rs.next())
{
Object o=getRowMapper().mapRow(rs);
list.add(o);
}
}
catch (Exception e)
{
e.printStackTrace();
throw new DataAccessException("数据查询异常");
}
finally
{
JDBCUtil.colse(con, ps, rs);
}
return list;
}
//查询,将映射类传入
public List query(String sql,RowMapper rm,Object ...params)
{
Connection con =null;
PreparedStatement ps =null;
ResultSet rs =null;
//饿汉式
List list =new ArrayList();
try
{
con =JDBCUtil.getConnection();
ps=con.prepareStatement(sql);
for(int i=0;i<params.length;i++)
{
ps.setObject(i+1,params[i]);
}
rs=ps.executeQuery();
while(rs.next())
{
Object o=rm.mapRow(rs);
list.add(o);
}
}
catch (Exception e)
{
e.printStackTrace();
throw new DataAccessException("数据查询异常");
}
finally
{
JDBCUtil.colse(con, ps, rs);
}
return list;
}
//插入记录
public Object save(String sql,Object ...params)
{
Connection con =null;
PreparedStatement ps =null;
ResultSet rs =null;
Object pk =null;
try
{
con =JDBCUtil.getConnection();
ps=con.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
for(int i=0;i<params.length;i++)
{
ps.setObject(i+1,params[i]);
}
//执行新增
ps.executeUpdate();
//获得该记录的主键值
rs=ps.getGeneratedKeys();
if(rs.next())
{
pk=rs.getObject(1);
}
}
catch (Exception e)
{
e.printStackTrace();
throw new DataAccessException("数据插入异常");
}
finally
{
JDBCUtil.colse(con, ps, rs);
}
//返回该记录的主键值
return pk;
}
//更新记录
public void update(String sql,Object... params){
Connection con=null;
PreparedStatement ps=null;
try {
con = JDBCUtil.getConnection();
ps=con.prepareStatement(sql);
for(int i=0;i<params.length;i++)
{
ps.setObject(i+1,params[i]);
}
//执行数据更新
ps.executeUpdate();
}
catch (SQLException e)
{
e.printStackTrace();
throw new DataAccessException("数据更新异常");
}
finally
{
JDBCUtil.colse(con, ps, null);
}
}
//更新删除
public void delete(String sql,Object... params){
Connection con=null;
PreparedStatement ps=null;
try {
con = JDBCUtil.getConnection();
ps=con.prepareStatement(sql);
for(int i=0;i<params.length;i++)
{
ps.setObject(i+1,params[i]);
}
//执行数据删除
ps.executeUpdate();
}
catch (SQLException e)
{
e.printStackTrace();
throw new DataAccessException("数据删除异常");
}
finally
{
JDBCUtil.colse(con, ps, null);
}
}
public int selectmaxId(String sql,Object... params){
Connection con=null;
PreparedStatement ps=null;
ResultSet rs=null;
int result=0;
try {
con=JDBCUtil.getConnection();
ps=con.prepareStatement(sql);
for (int i = 0; i < params.length; i++) {
ps.setObject(i+1, params[i]);
}
rs=ps.executeQuery();
while(rs.next()){
result = rs.getInt(1);
}
} catch (Exception e) {
e.printStackTrace();
throw new DataAccessException("数据访问异常");
} finally {
JDBCUtil.colse(null, ps, rs);
}
return result;
}
protected abstract RowMapper getRowMapper();
}
文章结束给大家分享下程序员的一些笑话语录: IBM和波音777
波音777是有史以来第一架完全在电脑虚拟现实中设计制造的飞机,所用的设备完全由IBM公司所提供。试飞前,波音公司的总裁非常热情的邀请IBM的技术主管去参加试飞,可那位主管却说道:“啊,非常荣幸,可惜那天是我妻子的生日,So..”..
波音公司的总载一听就生气了:“胆小鬼,我还没告诉你试飞的日期呢!”
---------------------------------
原创文章 By
类和sql
---------------------------------

浙公网安备 33010602011771号