jdbc读取properties文件:
自己写的一个读取properties文件的类 大同小异,都是J2SE API提供的Properties类来实现:
/******************
* 读取properties文件
* @return
*/
public static Properties getProperties(){
Properties p = new Properties();
try {
String baseClassDir = DbHandler.class.getProtectionDomain().getCodeSource()
.getLocation().getPath();
if (baseClassDir.indexOf("WEB-INF") > 0) {
baseClassDir = baseClassDir.substring(0, baseClassDir.indexOf("WEB-INF") + 8);
}
baseClassDir = URLDecoder.decode(baseClassDir, "UTF-8");
System.out.println(baseClassDir);
p.load(new FileInputStream(baseClassDir+"mysql.properties"));
return p;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
/*******************
* 连接数据库
* @return
* @throws IllegalAccessException
* @throws Exception
*/
public static Connection getConn() throws Exception{
Connection conn = null;// JDBC connection
Properties props;
try {
props = getProperties();
String driver = props.getProperty("driver");
String url = props.getProperty("url");
String user = props.getProperty("user");
String password = props.getProperty("password");
Class.forName(driver).newInstance();
DriverManager.setLoginTimeout(5);
conn = DriverManager.getConnection(url, user, password);
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
/**
* 关闭数据库连接
*
* @param conn
* @param pst
* @param rs
*/
public static void clear(Connection conn, Statement st,
ResultSet rs) {
try {
if (rs != null) {
rs.close();
rs = null;
}
if (st != null) {
st.close();
st = null;
}
if (conn != null) {
conn.close();
conn = null;
}
} catch (SQLException e) {
throw new RuntimeException("数据库连接关闭失败!", e);
}
}
基本都是使用这类方法来连接数据库,我用的是MySql数据库,大家在getConn()之后别忘了close。
JDBC的方法很多 也可以扩展来实现加入参数等。
String sql = "insert into t_user(user_id, user_name, password, contact_tel, email, create_date) "
+ "values(?, ?, ?, ?, ?, ?)";
PreparedStatement pstmt = null;
try {
pstmt = conn.prepareStatement(sql);
pstmt.setString(1, user.getUserId());
pstmt.setString(2, user.getUserName());
pstmt.setString(3, user.getPassword());
pstmt.setString(4, user.getContactTel());
pstmt.setString(5, user.getEmail());
pstmt.setTimestamp(6, new Timestamp(user.getCreateDate().getTime()));
pstmt.executeUpdate();
} catch (SQLException e) {
e.printStackTrace();
} finally {
DB.closeStmt(pstmt);
}
这是JDBC带参数的常规做法: 也可以进行扩展: 例如:
public Object[][] getDataBySql(String sql, Object[] params) {
Connection conn = null;
PreparedStatement pst = null;
ResultSet rs = null;
try {
conn = getConnection();
pst = conn.prepareStatement(CommonUtil.setEnCodingISO(sql));
if (params != null) {
pst = initParams(pst, params);
}
rs = pst.executeQuery();
return paraseResultSet(rs);
} catch (SQLException e) {
e.printStackTrace();
throw new IngtaUserException(-180005, "数据库检索失败:" + e.getMessage(),e);
} catch (Exception e) {
e.printStackTrace();
throw new IngtaUserException(-180002, e.getMessage(), e);
} finally {
clear(conn, pst, rs);
}
这样就很好做了。 比如你要带的参数,可以申明一个Object数组,把参数依次加进去,然后代入这个方法。
如何得到值呢,比如我查询了2个字段。定义一个Object[][] result 来接收方法的return值, 然后第一个就是result[0][0] , 第二个result[0][1],就这样, 很简单
工厂类动态加载接口实现类
Factory了解不多,自从有了Spring配置,基本不常用了,如果是struts的MVC,又要分开业务层,则我们要在Action里面去调用业务逻辑层,而DAO层为了方便开发,一般通过实现接口来进行操作,便于开发。
我们在Action里面,首先调用接口方法,然后才会去执行实现接口的方法。而如果直接private Dao接口 ,首先要实例化dao接口,我们又不能直接Dao dao = new DaoImpl()
这样就违反了我们的业务隔开的原则,影响开发效率。
我们就可以用工厂类来加载接口实现类了
单例:
private static UserDaoFactory instance;
private UserDao userDao;
private UserDaoFactory() {
//
userDao = new UserDaoImpl();
}
public static synchronized UserDaoFactory getInstance() {
if (instance == null) {
instance = new UserDaoFactory();
}
return instance;
}
/**
* 创建UserDao对象
* @return UserDao UserDao接口
*/
public UserDao createUserDao() {
return userDao;
}
这样我们就直接可以得到了,然后再Action业务逻辑时,daofactory.getInstance().createDao()就可以了。