重温Java持久化
写了个仿SSH的框架例子,将其三块代码集成(仿structs、仿spring、仿hibernate),并做了个小网站(JSTL+JSP+(仿)SSH),采取这个框架,感觉挺好用的。主要目的是为了提高对框架的认识,故没有真正的SSH复杂,意在道明其因由,个人认为,对于企业项目开发能够理解框架原理即可。
因仿hibernate的这块代码非本人所写的,不免的有点点遗憾,前些日子无聊,又看到另个朋友采用注解写了个小框架(针对android系统的),也想采用注解写个试试。
经过几天的折腾,也总算是出炉了。时间仓租,应该会有不少瑕疵,以后有时间,慢慢优化咯。
优点:
1. 以对象方式操作数据库,使用简单方便.
2. 所依赖的jar包少,仅需要数据库驱动的jar.
3. 以上两个优点,对于业务不复杂的小型系统来说,蛮方便的.
DMIS-JHibernate关键代码
DMIS-JHibernate.jar DMIS-JHibernate_src.zip见附件
=====================================
/**
* ElemenetType.TYPE 类,接口(包括注解类型)或enum声明 RetentionPolicy.RUNTIME
* VM将在运行期也保留注释,因此可以通过反射机制读取注解的信息。
*
* @author ypf
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @inte易做图ce Table {
/**
* 表名
*
* @return
*/
public abstract String name();
}
=====================================
/**
* 注解表 标识是否为主键
* @author ypf
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public abstract @inte易做图ce Id {
}
=====================================
/**
* 注解表 标识所映射的数据库字段
*
* @author ypf
*/
@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public abstract @inte易做图ce Column {
/**
* 列名
* @return String
*/
public abstract String name();
/**
* 类型
* @return String
*/
public abstract String type() default "";
/**
* 类型
* @return int
*/
public abstract int length() default 0;
}
=====================================
/**
* 数据库辅助类
* @author ypf
*/
public class DBHelper {
Logger logger = Logger.getLogger(DBHelper.class.getName());
private String driver;
private String url;
private String dbname;
private String dbpass;
public DBHelper(String driver, String url, String dbname, String dbpass) {
super();
this.driver = driver;
this.url = url;
this.dbname = dbname;
this.dbpass = dbpass;
}
public Connection getConn() throws ClassNotFoundException, SQLException {
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, dbname, dbpass);
return conn;
}
/**
* 释放资源
*
* @param conn-连接对象
* @param pstmt-预编译
* @param rs-结果集
*/
public void closeAll(Connection conn, PreparedStatement ps, ResultSet rs) {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
/**
* 执行增、删、改
* @param sql-语句
* @param params-数组型参数
* @return int 受影响的行数
* @throws SQLException
* @throws ClassNotFoundException
*/
public int executeUpdate(String sql, Object... params) throws SQLException, ClassNotFoundException {
Connection connection = null;
PreparedStatement ps = null;
int num = 0;
// 处理SQL,执行SQL
try {
connection = getConn(); // 得到数据库连接
ps = connection.prepareStatement(sql); // 预处理SQL语句
buildPreparedStatement(ps, params);
logger.info("Oper: " + sql);
num = ps.executeUpdate(); // 执行SQL语句
}catch (SQLException e) {
throw e;
}catch (ClassNotFoundException e) {
throw e;
}finally {
closeAll(connection, ps, null);
}
return num;
}
/**
* 为PreparedStatement对象填充参数
* @param ps
* @param param
* @throws SQLException
*/
public void buildPreparedStatement(PreparedStatement ps, Object... params) throws SQLException {
// 设置参数
for (int i = 0; i < params.length; i++) {
// 将Date转换成java.sql.Date
if (params[i] instanceof Date) {
Date d = (Date) params[i];
ps.setObject(i + 1, new Timestamp(d.getTime()));
} else {
ps.setObject(i + 1, params[i]);
}
}
}
/**
* 执行查询操作
* @param sql
* @param param
* @return RowSet
* @throws SQLException
* @throws ClassNotFoundException
*/
public RowSet executeQuery(String sql, Object... params) throws SQLException, ClassNotFoundException {
Connection connection = null;
PreparedStatement ps = null;
ResultSet rs = null;
RowSet rowset = null;
try {
connection = this.getConn();
ps = connection.prepareStatement(sql);
buildPreparedStatement(ps, params);
logger.info("Oper: " + sql);
rs = ps.executeQuery();
rowset = populate(rs);
} catch (SQLException e) {
throw e;
 
补充:软件开发 , Java ,