当前位置:编程学习 > JAVA >>

重温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 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,