Chinaunix首页 | 论坛 | 博客
  • 博客访问: 704701
  • 博文数量: 147
  • 博客积分: 6010
  • 博客等级: 准将
  • 技术积分: 1725
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-22 10:36
文章分类

全部博文(147)

文章存档

2011年(1)

2010年(1)

2009年(35)

2008年(110)

我的朋友

分类: Java

2009-05-09 14:57:38

一。数据源
使用开源的数据源---DataSource标准接口取代DriverManager
下面介绍开源的DBCP数据源:
首先配置文件放在classpath下面:
dbcpconfig.properties
#连接设置
driverClassName=....
url=....
username=.....
password=...
#初始化连接数
initialSize=10
#最大连接数
maxActive=50
#最大空闲连接数
maxIdle=20
#最小空闲连接
minIdle=5
#超时等待时间以毫秒为单位 6000毫秒/1000等于60秒
maxWait=60000
#JDBC驱动简历连接时附带的连接属性的格式必须为这样:[属性名=property;]
#注意:“user”与”password“两个属性会被明确的传递,因此这里不需要包含他们
connectionProperties=userUnicode=true;characterEncoding=gbk
#指定有连接池所创建的连接的自动提交状态
defaultAutoCommit=true
#driver default指定由连接池多创建的连接的只读状态
#如果没有设置该值,则setReadOnly方法将不被调用
defaultReadOnly=
#driver default指定由连接池多创建的连接的事务级别
#可用值为下列之一:(NONE,READ_UNCOMMITED,READ_COMMITED,READ_)
defaultTransactionIsolation=READ_UNCOMMITTED
.............
然后加入jar包(commons-collections-3.1.jar,commons-dbcp-1.2.1.jar,commons-pool.jar)
public final class JdbcUtils{
        private DataSource myDataSource=null;
        //私有函数
     private JdbcUtils(){
     }
       //确保驱动只被注册一次
   static{
    try{             
                         Properties prop=new Properties();
                         InputStream is=JdbcUtils.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");
                         prop.load(is);                       
                         myDataSource=BasicDataSourceFactory.createDataSource(prop);
      }catch(ClassNotFoundException e){
         throw new ExceptionInInitializerError(e);
      }
   }
       //获得连接
       public static Connection getConnection(){
   //建立连接(Connection)
                return myDataSource.getConnection();
 }
 //释放资源
       public static void free(ResultSet rs,Statement st,Connection conn){
  try{
   if(rs!=null)
    rs.close();
  }catch(SQLException e){
   e.printStackTrace();
  }finally{
   try{
    if(st!=null)
       st.close();
   }catch(SQLException e){
    e.printStackTrace(); 
   }finally{
    if(conn!=null)
    try{
     conn.close();                                      
    }catch(SQLException e){
     e.printStackTrance();
    }
   }
  }
 }
  }
抽象类
public class MyDaoTemplate{
public Object find(String sql,Object[] args,Rowmapper rowMapper){
Connection conn=null;
PrepareStatement ps=null;
ResultSet rs=null;
try{
conn=JdbcUtils.getConnection();
ps=conn.prepareStatement(sql);
for(int i=0;i  ps.setObject(i+1,args[i]);
ps.executeUpdate();
Object obj=null;
if(rs.next()){
   obj=rowMapper.mapRow(rs);
}
return obj;
}catch(Exception e){
throw new DaoException(e.getMessage(),e);
}finally{
JdbcUtils.free(rs,ps,conn);
}
}
}
映射接口
public interface RowMapper{
pblic Object mapRow(ResultSet rs);
}
//业务逻辑层接口
public interface UserDao{
public void addUser(User user);
public User getUser(int userId);
public void update(User user);
public void delete(User user);
public User findUser(String loginName,String password);
}
public class DaoException extends RuntimeException{
private static final long serialVersionUID=1L;
public DaoException(){}
public DaoException(String message){
super(message);
}
public DaoException(Throwable cause){
super(cause);
}
public DaoException(String message,Throwable cause){
super(message,cause);
}
}
DAO类
public class UserDaoImpl implements UserDao{
MyDaoTemplate template=new MyDaoTemplate();
public User findUser(String loginName,String password){
String sql="select id,name,birthday from user where name=?";
Object[] args=new Object[]{loginName};
Object user=this.template.find(sql,args,new RowMapper(){
public Object mapRow(ResultSet rs)throws SQLException{
User user=new User();
user.setId(rs.getInt("id"));
.....
return user;
}
});
return (User)user;
}
public String findUserName(int id){
String sql="select name from user where name=?";
Object[] args=new Object[]{id};
Object user=this.template.find(sql,args,new RowMapper(){
public Object mapRow(ResultSet rs) throws SQLException{
 return rs.getString("name");
}
});
return ((User)user).getName();
}
}
那么使用如下:UserDao userDao=new UserDaoJdbcImpl();
那么我们还是依赖了实现类UserDaoJdbcImpl,怎么不依赖呢??如下:
daoconfig.properties文件:
userDaoClass=cn.itcast.jdbc.dao.impl.UserDaoJdbcImpl;
public class DaoFactory{
//DaoFactory.getInstance()方法执行时候,首先会对静态的代码块和属性进行初始化,所以userDao要在instance前面定义,否则userDao为null
private static UserDao userDao=null;
private static DaoFactory instance=new DaoFactory();
private DaoFactory(){
try{
Properties prop=new Properties();
InputStream inStream=DaoFactory.class.getClassLoader().getResourceAsStream("daoconfig.properties");//文件放在classpath下面
prop.load(inStream);
String userDaoClass=prop.getProperty("userDaoClass");
userDao=Class.forName(userDaoClass).newInstance();
}catch(IOException e){
 throw new ExceptionInInitializeError(e);
}
}
pubic static DaoFactory getInstance(){
return instance;
}
public UserDao getUserDao(){
return userDao;
}
}
那么使用如下:UserDao userDao=DaoFactory.getInstance().getUserDao();
阅读(1651) | 评论(0) | 转发(0) |
0

上一篇:jpa和ejb

下一篇:SimpleJdbcTemplate模板

给主人留下些什么吧!~~