先说明这章与上章的区别,1.创建了JDBCUtil4,使用了ThreadLocal<泛型>(),【作用:操作当前线程内部一块存储区间(属性),借助当前线程Thread共享(传递)数据】。2.加入了事务控制问题,使用JDBC控制事务。

接下来代码根据上图顺序:

1.User实体类

package com.henu.demo;
/***create table T_USER(id varchar2(20) primary key,username varchar2(20),--用户名password varchar2(20) --密码);create sequence sep_user start with 100;insert into T_USER values(sep_user.nextval,'董康','123456'); */
public class User {private String id;private String username;private String password;public User() {super();}public User(String id, String username, String password) {super();this.id = id;this.username = username;this.password = password;}public String getId() {return id;}public void setId(String id) {this.id = id;}public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}@Overridepublic String toString() {return "User [id=" + id + ", username=" + username + ", password=" + password + "]";}}

2.UserDAO

package com.henu.demo;import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;import Utils.JDBCUtil4;public class UserDAO {public User selectByUsername(String username){Connection conn = null;PreparedStatement ps = null;ResultSet rs = null;conn = JDBCUtil4.getConnection();try {String selectSQL = "select id,username,password from T_USER where username=?";ps = conn.prepareStatement(selectSQL);ps.setString(1, username);rs = ps.executeQuery();while(rs.next()) {String id = rs.getString(1);String name = rs.getString(2);String pwd = rs.getString(3);User user = new User(id,name,pwd);return user;}} catch (SQLException e) {throw new RuntimeException("查询出错!",e);}finally {JDBCUtil4.close(rs, ps, null);}return null;}
}

3.UserService

package com.henu.demo;import java.sql.Connection;
import java.sql.SQLException;import Utils.JDBCUtil4;public class UserService {public boolean login(String name,String pwd){Connection conn = null;try {//0.开启事务conn = JDBCUtil4.getConnection();//将事务控制设置为手动conn.setAutoCommit(false);UserDAO dao = new UserDAO();User user = dao.selectByUsername(name);//判断username是否存在if (user == null) {return false;}//判断密码是否正确if (!user.getPassword().equals(pwd)) {return false;}          //提交事务 commitconn.commit();return true;} catch (Exception e) {//回滚事务try {conn.rollback();} catch (SQLException e1) {e1.printStackTrace();}throw new RuntimeException("登录异常",e);           }finally {JDBCUtil4.close(null, null, conn);}}
}

4.UserView视图层

package com.henu.demo;import java.util.Scanner;/*** @author lmd13* 1.接收数据*   调用service* 2.展示结果*/
public class UserView {public static void main(String[] args) {Scanner sc = new Scanner(System.in);System.out.println("请输入用户名:");        String name = sc.next();System.out.println("请输入密码:");String pwd = sc.next();UserService us = new UserService();boolean flag = us.login(name, pwd);if (flag) {System.out.println("OK");}else {System.out.println("NO");}}}

【补充】JDBCUtil4的源码

package Utils;import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;public class JDBCUtil4 {private static final Properties props = new Properties();private static final ThreadLocal<Connection> td1 = new ThreadLocal<Connection>();static{//1.输入流InputStream is = null;try {is = JDBCUtil4.class.getResourceAsStream("/Utils/jdbc.properties");//2.load方法加载配置文件props.load(is);} catch (IOException e) {throw new RuntimeException("配置文件加载异常",e);}finally {if (is != null) {try {is.close();} catch (IOException e) {e.printStackTrace();}}}}/*** 获取连接*/public static Connection getConnection(){Connection conn = null;try {   //如果是service获得连接,创建新的,将conn存入当前的Thread//如果是dao获得连接,从当前线程中获取conn//从当前线程获得connconn = td1.get();if(conn == null){Class.forName(props.getProperty("driverClassName"));//2.获取connconn = DriverManager.getConnection(props.getProperty("url"),props.getProperty("user"),props.getProperty("password"));//将连接存入当前线程td1.set(conn);}} catch (Exception e) {throw new RuntimeException("获取数据库连接异常!",e);}return conn;}/*** 释放资源:关闭 rs ps conn*/public static void close(ResultSet rs,PreparedStatement ps,Connection conn){if (rs != null) {try {rs.close();} catch (SQLException e) {throw new RuntimeException("rs资源释放异常!");}}if (ps != null) {try {ps.close();} catch (SQLException e) {throw new RuntimeException("ps资源释放异常!");}}if (conn != null) {try {conn.close();//将conn从当前线程移除td1.remove();} catch (SQLException e) {throw new RuntimeException("conn资源释放异常!");}}}
}

jdbc.properties内容:

driverClassName=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@localhost:1521:xe
user=hr
password=123456

javaweb----三层架构+相关推荐

  1. JavaWeb三层架构详解

    什么是三层架构? 三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interface layer).业务逻辑层(Business L ...

  2. JavaWeb三层架构的理解/三层架构的优缺点/三层架构与MVC的区别

    1.三层架构 我们的开发架构一般都是基于两种形式,一种是C/S架构,也就是客户端/服务器,另一种是B/S架构,也就是浏览器服务器.在JavaEE开发中,几乎全都是基于B/S架构的开发.那么在B/S架构 ...

  3. JavaWeb三层架构

    什么是三层架构? 三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interface layer).业务逻辑层(Business L ...

  4. 基于JavaWeb三层架构的OA管理系统

    本系统是一个类似于培训学校的一个管理系统,系统角色有员工,学生. 首页 它的左侧是后台管理系统的功能界面,右侧是前面的通过数据库查询的一个月或者是一年的统计信息,下面柱状图个折线图采用的是echart ...

  5. Maven项目+MVC三层架构+Mysql+Tomcat+私教预约系统前后端(私教、用户、管理员)+可以用于学习SSM框架、javaweb、maven项目入门

    Maven项目+MVC三层架构+Mysql+Tomcat+私教预约系统前后端(私教.用户.管理员)+可以用于学习SSM框架.javaweb.maven项目入门 可以用于课程设计.毕业设计的知识点入门学 ...

  6. JavaWeb项目+MVC三层架构+Mysql+Tomcat+汽车配件销售系统前后端+可以用于学习javaweb项目入门

    JavaWeb项目+MVC三层架构+Mysql+Tomcat+汽车配件销售系统前后端+可以用于学习javaweb项目入门 可以用于课程设计.毕业设计的知识点入门学习 提示:此资源仅用于javaweb网 ...

  7. 简述mvc和java三层框架,springMVC设计模式和javaWeb三层框架

    一.springMVC  设计模式 MVC模式是软件工程中的一种能够软件架构模式,把软件分为三个基本部分,模型(model).视图(view)和控制器(controller).使程序简化,更加直观. ...

  8. 物流快递系统前、后端+Java语言+SpringBoot项目+MVC三层架构+maven+Mysql+Tomcat+可以用于学习SpringBoot项目入门

    物流快递系统前.后端+Java语言+SpringBoot项目+MVC三层架构+Mysql+Tomcat+可以用于学习SpringBoot项目入门 可以用于课程设计.毕业设计的知识点入门学习 提示:此资 ...

  9. 关于MVC与三层架构、个人总结网上杂七杂八得出的最终成果、asp.net (core) MVC、JavaWeb的MVC

    阅读本文必须明白的事情 首先需要明白的是不同语言实现的MVC与三层架构对应的层是不一样的!!! 拿.net来说,.net实现MVC与其他语言的MVC具体实现是不同的,asp.net MVC与 MVC ...

  10. 关于写javaweb项目,遇到的问题:三层架构

    关于写javaweb项目,遇到的问题 三层架构: 表示层(UI)业务逻辑层(BLL) 数据访问层(DAL) 高内聚,低耦合. 高内聚:一个模块内各元素彼此结合紧密程度高(只负责单一功能) 低耦合:简单 ...

最新文章

  1. anaconda配置环境变量
  2. mysql流行的四种高可用架构之:Keepalived+Mysql Replication
  3. 【学亮IT手记】oracle远程连接工具PL/SQL Developer的安装使用教程
  4. 真快!10秒内将k8s集群运行起来
  5. GitHub 发布 2018 年开源项目趋势预测
  6. Android插件化开发基础之Java动态代理(proxy)机制的简单例子
  7. 排序下---(冒泡排序,快速排序,快速排序优化,快速排序非递归,归并排序,计数排序)
  8. 活动报名小程序源码/thinkphp后台管理报名小程序源码
  9. C语言与汇编语言的区别
  10. 初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助...
  11. 缓存装饰器的应用习题练习
  12. 密码学系列之:PEM和PKCS7,PKCS8,PKCS12
  13. 今日头条张一鸣:做CEO要避免理性的自负
  14. 解决IDEA中leetcode插件出现中文乱码问题
  15. 韦根w34是多少位_韦根(Wiegand)数据传输格式
  16. 输入平方尺转换为平方米 计算机,如何用电脑打出平方?平方米符号输入步骤教程...
  17. 程序员必知的编程5祖师爷,不要说你不知道!
  18. Html中文本域中加图片,如何在文本框中加图片
  19. 黑苹果睡眠唤醒usb失灵_黑苹果解决USB3.0驱动问题
  20. 【刷题】洛谷 P2675 《瞿葩的数字游戏》T3-三角圣地

热门文章

  1. CodeForces - 1300D Aerodynamic(几何+思维)
  2. CodeForces - 1109A Sasha and a Bit of Relax(思维+异或和,好题)
  3. HDU - 4370 0 or 1(思维+最短路)
  4. 剑指Offer-LeetCode刷题
  5. php tp框架调用方法,thinkPHP框架使用方法
  6. 2.IDA-数据显示窗口(反汇编窗口、函数窗口、十六进制窗口)
  7. 内核层 inlinehook 隐藏进程
  8. 使用 Minidumps 和 Visual Studio .NET 进行崩溃后调试
  9. C++中空指针调用类成员函数的原理
  10. ARP攻击实战之WinArpAttacker