学习改造d层代码1
来源:互联网 发布:大宗商品交易系统源码 编辑:程序博客网 时间:2024/05/18 01:27
drp的学习结束了,对于drp的总结开始了。
直接进入正题,drp对d层代码的改造很不错。总结一下。
第一版 普通版
第一版是最简答得由三个类组成。实体user用于存储数据,UserManager用于对数据进行处理。Dbutil用于处理connection串。代码如下
UserManager
public class UserManager {private static UserManager instance = new UserManager();private UserManager() {}public static UserManager getInstance() {return instance;}/** * 添加用户 * @param user */public void addUser(User user) {String sql = "insert into t_user (user_id, user_name, password, contact_tel, email, create_date) " +" values (?, ?, ?, ?, ?, ?)";Connection conn = null;PreparedStatement pstmt = null;try {conn = DbUtil.getConnection();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(System.currentTimeMillis()));pstmt.setTimestamp(6, new Timestamp(new Date().getTime()));pstmt.executeUpdate();}catch(SQLException e) {e.printStackTrace();}finally {DbUtil.close(pstmt);DbUtil.close(conn);}}}
Dbutil
<pre class="java" name="code">public static Connection getConnection() {Connection conn = null;try {JdbcConfig jdbcConfig = XmlConfigReader.getInstance().getJdbcConfig();Class.forName(jdbcConfig.getDriverName());conn = DriverManager.getConnection(jdbcConfig.getUrl(), jdbcConfig.getUserName(), jdbcConfig.getPassword());} catch (ClassNotFoundException e) {e.printStackTrace();throw new ApplicationException("系统错误,请联系系统管理员");} catch (SQLException e) {e.printStackTrace();throw new ApplicationException("系统错误,请联系系统管理员");}return conn;}
特点分析:
Dbutil的存在本身就是对代码进行初步改造的证明。因为要连接数据库所以每个方法都需要connection。出于合并同类项的思想,这里将connection进行统一封装。
此外,drp项目中的manager管理类都使用了单例模式,避免了损耗。亮点在于在此处使用了静态方法。
静态方法在类创建时产生,被存放入一块特殊的内存区域。优点:不需要实例化就可以使用,所以比较简便的同时读取速度非常快。缺点:使用静态方法会很占内存,而且会破坏类的封装性。所以无论是静态方法还是静态成员变量都要慎用。应用场景:当某个变量被频繁调用或者被很多个类都使用时可以考虑使用静态方法。
版本二 dom4j版本
主要展示Dbutil代码和XmlConfigReader代码
Dbutil
Connection conn = null;try {JdbcConfig jdbcConfig = XmlConfigReader.getInstance().getJdbcConfig();Class.forName(jdbcConfig.getDriverName());conn = DriverManager.getConnection(jdbcConfig.getUrl(), jdbcConfig.getUserName(), jdbcConfig.getPassword());} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}return conn;XmlConfigReader
//懒汉式(延迟加载lazy)private static XmlConfigReader instance = null;//保存jdbc相关配置信息private JdbcConfig jdbcConfig = new JdbcConfig();private XmlConfigReader() {SAXReader reader = new SAXReader();InputStream in = Thread.currentThread().getContextClassLoader().getResourceAsStream("sys-config.xml");try {Document doc = reader.read(in);//取得jdbc相关配置信息Element driverNameElt = (Element)doc.selectObject("/config/db-info/driver-name");Element urlElt = (Element)doc.selectObject("/config/db-info/url");Element userNameElt = (Element)doc.selectObject("/config/db-info/user-name");Element passwordElt = (Element)doc.selectObject("/config/db-info/password");//设置jdbc相关的配置jdbcConfig.setDriverName(driverNameElt.getStringValue());jdbcConfig.setUrl(urlElt.getStringValue());jdbcConfig.setUserName(userNameElt.getStringValue());jdbcConfig.setPassword(passwordElt.getStringValue());} catch (DocumentException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static synchronized XmlConfigReader getInstance() {if (instance == null) {instance = new XmlConfigReader();}
特点分析
与版本进行对比发现因为多了XmlConfigReader类,不需要在类里将数据库的主要参数直接写出来,这样就增加了编程的灵活性。我们可以在xml文件中随意更改我们需要的数据库了。而且在类里使用了非常实用的单例模式。单例模式又分饿汉式和懒汉式。饿汉式一次将所有的对象都装载。懒汉式则体现了延时加载的思想,用到加载不用不加载的思想来处理XmlConfigReader类。同时还需要注意的是单例模式使用了大量的static变量和大量的静态方法,值得好好研究。同时但凡单例出现必然要考虑线程问题。但在这里王勇老师并没有讲到双重锁定这一点,不知何故。
- 学习改造d层代码1
- 学习改造代码2
- YOLO 卷积层代码学习
- 三层中对D层代码的理解
- liunx网络编程(1) 使用select 改造现有代码
- 改造我们的学习
- 改造我们的学习
- 基于pinpoint改造的一种方式的思考(1)--agent 添加代理层
- Python代码的多线程改造
- ASP.NET学习--N层代码示例
- ASP.NET学习--N层代码示例
- Multivac 的学习与改造
- Java2HTML改造手记(1)
- Java2HTML改造手记(1)
- Java2HTML改造手记(1)
- MyGeneration学习笔记(1) : 使用MyGeneration生成存储过程和数据访问层代码
- MyGeneration学习笔记(1) : 使用MyGeneration生成存储过程和数据访问层代码
- MyGeneration学习笔记(1) : 使用MyGeneration生成存储过程和数据访问层代码
- [书籍推荐]iOS开发
- AtomicLong源码分析
- 循环(迭代)与递归的区别
- android 获取系统默认路径
- socket类型及应用
- 学习改造d层代码1
- wxpython嵌套panel布局的一个问题
- 2022 海选女主角
- 设计模式之策略模式
- 方向和目标
- opencv-1.0静态库
- 如何实现C++单例模式?
- 面包树
- java.util.ConcurrentModificationException的解决方法