三层架构

分层
层次 特点
界面层(View) 呈现给用户。
业务逻辑层(Service BLL) 实现具体的业务逻辑,加工数据。
持久层(Dao) 与数据库的增删改查相关的代码实现。
好处

1.为了实现高内聚、低耦合
2.使得程序可重用性和可移植性增强

缺点

1.降低了系统的性能
2.导致级联的修改

简单框架

面向接口编程

1.辨析

接口 特点
接口 具体的一种代码结构
面向接口编程 一种思想,用于实现多态性,提升软件的灵活性和可维护性

2.优点
1)提升了代码的灵活性和复用性
2)良好的可扩展性
3)低耦合性

数据源与连接池

连接池概念

1)在系统启动的时候创建一批连接对象都保存在一个集合里面
2)如果需要数据库的连接,就可以从那这些对象中获得一个使用
3)数据库操作结束,在将这些对象放回集合中去,这样就可以节省资源
4)数据库连接池负责管理连接(分配连接和释放连接)
5)并没有真正的关闭资源

常见数据库连接池

1.C3P0
2.DBCP

C3P0的使用步骤

1.导入相应的jar包
2.设置连接池的参数
3.创建数据源,初始化数据库连接池
4.获取连接

此处C3P0的配置案例
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config><named-config name="mysql-config"><property name="driverClass">com.mysql.jdbc.Driver</property><property name="jdbcUrl">jdbc:mysql://localhost:3306/assetmanager?characterEncoding=utf-8</property><property name="user">root</property><property name="password">1234</property><!-- 初始化连接池中的连接数 --><property name="initialPoolSize">10</property><!--最大空闲时间 --><property name="maxIdleTime">30</property><!--连接池中保留的最大连接数 --><property name="maxPoolSize">100</property><!-- 连接池中保留的最小连接数--><property name="minPoolSize">10</property><!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->    <property name="acquireIncrement">3</property>    </named-config>
</c3p0-config>
C3P0使用案例
package com.hp.util;import java.sql.Connection;
import java.sql.SQLException;import javax.sql.DataSource;import com.mchange.v2.c3p0.ComboPooledDataSource;/*** 类描述:数据库操作工具类* 版本号: 1.0.0*/
public class JdbcUtils {// 设置数据源(使用C3P0数据库连接池)private static ComboPooledDataSource dataSource=new ComboPooledDataSource("mysql-config");// 创建一个与事务相关的局部线程变量private static ThreadLocal<Connection> tl=new ThreadLocal<Connection>();/*** 方法描述:获取数据源* @return*/public static DataSource getDataSource(){return dataSource;}/*** 方法描述:获取连接* @return* @throws SQLException */public static Connection getConnection() throws SQLException{// 获取线程局部变量的值 connectionConnection conn=tl.get();if(conn==null){// 如果连接为空,则从数据库连接词池中获取连接conn=dataSource.getConnection();}return conn;}/*** 方法描述:开启事务* @throws SQLException*/public static void beginTranscation()throws SQLException{Connection conn=tl.get();if(conn!=null){throw new SQLException("不能重复开启事务");}// 获取连接conn=getConnection();// 关闭自动提交事务conn.setAutoCommit(false);// 将线程变量的值设置为connectiontl.set(conn);}/*** 方法描述:提交事务* @throws SQLException */public static void commitTranscation() throws SQLException{Connection conn=tl.get();if(conn==null){throw new SQLException("没有开启事务 不能提交");}// 提交事务conn.commit();// 关闭连接conn.close();// 移除此线程局部变量的值tl.remove();}/*** 方法描述:回滚事务* @throws SQLException */public static void rollbackTranscation() throws SQLException{Connection conn=tl.get();if(conn==null){throw new SQLException("没有开启事务,不能回滚");}// 回滚事务conn.rollback();// 关闭连接conn.close();// 移除此线程局部变量的值tl.remove();}
}

DBUtil

介绍

1.是对JDBC做的简单封装,使用数据库连接池

主要类

1.QueryRunner
1)构造器QueryRunner():在事务中使用
2)构造器QueryRunner(DataSource):从数据库连接池中获取连接
3)update():执行增删改操作的调用

查询

1.query(sql,rsh,params):自动获取连接
2.query(conn,sql,rsh,params):手动获取连接
3.BeanHandler:获取单行数据,构造器需要一个Class类型的参数,用来把一行结果转换为指定类型的JavaBean对象。
4.BeanListHandler:获取多行数据,构造器需要一个Class类型的参数,用来把一行结果转换为指定类型的JavaBean对象,最终将多笔实例组成一个List集合,一堆JavaBean。

使用案例
返回单个记录:
public Admin login(Admin admin) {// 1.编写sql语句StringBuffer sql = new StringBuffer();sql.append("SELECT * ");sql.append("FROM admin ");sql.append("WHERE adminName = ? AND adminPassword = ?");// 2.创建一个QueryRunner对象,通过构造器提供数据源(从数据库中获取连接)QueryRunner queryRunner = new QueryRunner(JdbcUtils.getDataSource());Admin result = null;// 存放查询条件Object[] params = {admin.getAdminName(),admin.getAdminPassword()};try {// 3.执行query查询操作,BeanHandler:将结果集中第一行数据封装到一个对应的JavaBean实例中result = queryRunner.query(sql.toString(), new BeanHandler<>(Admin.class),params);} catch (SQLException e) {e.printStackTrace();}return result;}
返回多个记录:
public List<User> getAllUser() {String sql = "SELECT * FROM user";// 存放查询结果集合List<User> users = null;try {QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());users = qr.query(sql, new BeanListHandler<>(User.class));} catch (SQLException e) {e.printStackTrace();}return users;}
增删改时的使用:
public int addBank(Bank bank) {String sql = "INSERT INTO bank(bankName,bankTel) VALUES(?,?)";// 准备填充占位符的数组Object[] params = {bank.getBankName(),bank.getBankTel()};// 接收返回结果int result = 0;try {QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());// 执行增删改操作同一调用update方法result = qr.update(sql, params);} catch (Exception e) {e.printStackTrace();}return result;}
获取单个值的使用(一般用于注册后获取自动增长的主键id):
public Long addUser(User user) {StringBuffer sql = new StringBuffer();sql.append("INSERT INTO `user` ");sql.append("(userName,userPassword,realName,sex,tel,idCard,address) ");sql.append("VALUES(?,?,?,?,?,?,?)");Object[] params = {user.getUserName(),user.getUserPassword(),user.getRealName(),user.getSex(),user.getTel(),user.getIdCard(),user.getAddress()};// Long 包装类型Long result = null;try {QueryRunner qr = new QueryRunner(JdbcUtils.getDataSource());// 第一种方式:获取新增的主键值,ScalarHandler获得单个值//qr.update(sql.toString(), params);//result = qr.query("SELECT LAST_INSERT_ID()", new ScalarHandler<>());// 第二种方式:线程安全的、返回插入数据的主键result = qr.insert(sql.toString(), new ScalarHandler<Long>(), params);} catch (SQLException e) {e.printStackTrace();}return result;}
删除某一银行及其用户(此处采用事物):
public boolean deleteBank(int bankId) {try {// 开启事务JdbcUtils.beginTranscation();// 删除银行对应的资产信息assetDao.deleteAssetByBankId(bankId);//int i = 10 / 0;// 删除银行信息bankDao.deleteBank(bankId);// 提交事务JdbcUtils.commitTranscation();return true;} catch (Exception e) {// 回滚事务try {JdbcUtils.rollbackTranscation();} catch (SQLException e1) {e1.printStackTrace();}e.printStackTrace();} return false;}

工具类

public class JdbcUtils {// 设置数据源(使用C3P0数据库连接池)private static ComboPooledDataSource dataSource=new ComboPooledDataSource("mysql-config");// 创建一个与事务相关的局部线程变量private static ThreadLocal<Connection> tl=new ThreadLocal<Connection>();/*** 方法描述:获取数据源* @return*/public static DataSource getDataSource(){return dataSource;}/*** 方法描述:获取连接* @return* @throws SQLException */public static Connection getConnection() throws SQLException{// 获取线程局部变量的值 connectionConnection conn=tl.get();if(conn==null){// 如果连接为空,则从数据库连接词池中获取连接conn=dataSource.getConnection();}return conn;}/*** 方法描述:开启事务* @throws SQLException*/public static void beginTranscation()throws SQLException{Connection conn=tl.get();if(conn!=null){throw new SQLException("不能重复开启事务");}// 获取连接conn=getConnection();// 关闭自动提交事务conn.setAutoCommit(false);// 将线程变量的值设置为connectiontl.set(conn);}/*** 方法描述:提交事务* @throws SQLException */public static void commitTranscation() throws SQLException{Connection conn=tl.get();if(conn==null){throw new SQLException("没有开启事务 不能提交");}// 提交事务conn.commit();// 关闭连接conn.close();// 移除此线程局部变量的值tl.remove();}/*** 方法描述:回滚事务* @throws SQLException */public static void rollbackTranscation() throws SQLException{Connection conn=tl.get();if(conn==null){throw new SQLException("没有开启事务,不能回滚");}// 回滚事务conn.rollback();// 关闭连接conn.close();// 移除此线程局部变量的值tl.remove();}
}

java三层架构实例相关推荐

  1. SSH框架整合实现Java三层架构实例(一)

    HTML前台发送请求代码: <tr><td>选择收派时间</td><td><input type="text" name=&q ...

  2. java数据访问层实例_java实际项目先写哪一层?java三层架构是什么?

    在写java实际项目的时候,我们都是要有思维逻辑的,哪一层先写哪一层后写,这些都要考虑清楚,那么接下来,我们就来给大家讲解一下这方面的内容. 这没有标准,一般是controller-service-d ...

  3. C#学习之三层架构实例

    如有雷同,不胜荣欣,如转载,请注明 一.三层架构实例 首先学习三层架构模式­--三层架构实现的留言和查看留言 下面是本人学习三层架构的一点感想和理解,肯定有许多不足的地方,欢迎大家斧正,谢谢,废话到此 ...

  4. JAVA三层架构详解

    JAVA三层架构详解 三层架构分别是什么 为什么要有三层架构 三层架构思想下的项目目录结构 三层架构分别是什么 通俗说三层架构指的就是: 前端所能看见的界面为第一层,专业术语表示层(UI层) 后端对相 ...

  5. 【Java架构师提升】java三层架构原理与作用小结

    这篇文章主要对Java三层架构的概念.作用等进行了介绍,需要的朋友可以参考下 三层架构 三层架构(3-tier application) 通常意义上的三层架构就是将整个业务应用划分为:表现层(UI). ...

  6. java 三层架构 mvc_java三层架构与mvc

    Java三层架构 - java独有 界面层(Web).业务逻辑(Service).数据访问层(Dao) WEB层: 包含JSP和Servlet等与WEB相关的内容 表示层属于最接近用户的一层,用于展示 ...

  7. java三层架构项目事例_三层架构实例

    一.概要 在我的上一篇博客中,我们谈了谈分层,到底为什么分层(http://blog.csdn.net/shan9liang/article/details/6836300) 这篇博客,准备用一个小D ...

  8. java三层架构,表示层MVC,和前端视图层mvvm

    1.三层架构 Java的三层架构分别为表示层.业务逻辑层和数据持久层. 表示层(UI):通俗讲就是展现给用户的界面,即用户在使用一个系统的时候他的所见所得. 业务逻辑层(BLL):针对具体问题的操作, ...

  9. java三层架构是不是策略模式,把「策略模式」应用到实际项目中

    无论你知不知道这个设计模式,但必定在项目中都似曾相识.倘若仅仅聊理论必然枯燥乏味,只有理论和实战相结合方可达到人剑合一的境界. 首先,我来说个需求,倘若是你遇到该如何做?你可停留几分钟,想出你的解决方 ...

最新文章

  1. 10.29T1 倍增+同余
  2. 恭喜我自己装上了Windows Server 2008 R2 和使用Windows Live Writer 写日志
  3. POJ 2823 Sliding Window
  4. Oracle中的UPDATE FROM解决方法
  5. 使用C语言读取properties文件V1.0
  6. java 不显示imageicon_Java ImageIcon 不能显示问题
  7. ApacheCN 捐赠名单 2019
  8. linux操作系统基础教程第二版附录答案,Linux操作系统(第2版) 课后习题答案
  9. 应用程序无法找到入口
  10. VINS-Mono学习(四)——回环检测与重定位
  11. huawei路由器NAT配置
  12. 交易猫鲨鱼系统源码搭建
  13. UEditor 编辑器使用 最新版本1.4.3
  14. Lua不同类型变量做比较时的问题
  15. 利用TrinityCore 框架的搭建魔兽世界私服
  16. java全栈系列之JavaSE-面向对象(方法重写)037
  17. 江苏机器人竞赛南航_我校举办第十一届机器人大赛暨第十届江苏省大学生机器人大赛校内选拔赛...
  18. 企业做好私域电商的六大关键点
  19. 发明专利和实用新型专利区别
  20. Channel 通道

热门文章

  1. 工具小软件——change case
  2. [解决办法]ubuntu14.04 adb devices无法识别手机
  3. 通达oa服务器文件夹管理,通达OA目录层次结构
  4. SSCOM串口调试助手自定义波特率
  5. Revit二开-设备(消防箱)翻模
  6. 如何学习Windows编程
  7. 考研英语词汇文章6-The young police chief
  8. 计算机应用知识试题,《计算机应用基础》试题及答案
  9. 春季出游,学会这些功能,让你旅途更舒心
  10. SX1278 LoRa通讯的频率设定