javaweb----三层架构+
先说明这章与上章的区别,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----三层架构+相关推荐
- JavaWeb三层架构详解
什么是三层架构? 三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interface layer).业务逻辑层(Business L ...
- JavaWeb三层架构的理解/三层架构的优缺点/三层架构与MVC的区别
1.三层架构 我们的开发架构一般都是基于两种形式,一种是C/S架构,也就是客户端/服务器,另一种是B/S架构,也就是浏览器服务器.在JavaEE开发中,几乎全都是基于B/S架构的开发.那么在B/S架构 ...
- JavaWeb三层架构
什么是三层架构? 三层架构(3-tier architecture) 通常意义上的三层架构就是将整个业务应用划分为:界面层(User Interface layer).业务逻辑层(Business L ...
- 基于JavaWeb三层架构的OA管理系统
本系统是一个类似于培训学校的一个管理系统,系统角色有员工,学生. 首页 它的左侧是后台管理系统的功能界面,右侧是前面的通过数据库查询的一个月或者是一年的统计信息,下面柱状图个折线图采用的是echart ...
- Maven项目+MVC三层架构+Mysql+Tomcat+私教预约系统前后端(私教、用户、管理员)+可以用于学习SSM框架、javaweb、maven项目入门
Maven项目+MVC三层架构+Mysql+Tomcat+私教预约系统前后端(私教.用户.管理员)+可以用于学习SSM框架.javaweb.maven项目入门 可以用于课程设计.毕业设计的知识点入门学 ...
- JavaWeb项目+MVC三层架构+Mysql+Tomcat+汽车配件销售系统前后端+可以用于学习javaweb项目入门
JavaWeb项目+MVC三层架构+Mysql+Tomcat+汽车配件销售系统前后端+可以用于学习javaweb项目入门 可以用于课程设计.毕业设计的知识点入门学习 提示:此资源仅用于javaweb网 ...
- 简述mvc和java三层框架,springMVC设计模式和javaWeb三层框架
一.springMVC 设计模式 MVC模式是软件工程中的一种能够软件架构模式,把软件分为三个基本部分,模型(model).视图(view)和控制器(controller).使程序简化,更加直观. ...
- 物流快递系统前、后端+Java语言+SpringBoot项目+MVC三层架构+maven+Mysql+Tomcat+可以用于学习SpringBoot项目入门
物流快递系统前.后端+Java语言+SpringBoot项目+MVC三层架构+Mysql+Tomcat+可以用于学习SpringBoot项目入门 可以用于课程设计.毕业设计的知识点入门学习 提示:此资 ...
- 关于MVC与三层架构、个人总结网上杂七杂八得出的最终成果、asp.net (core) MVC、JavaWeb的MVC
阅读本文必须明白的事情 首先需要明白的是不同语言实现的MVC与三层架构对应的层是不一样的!!! 拿.net来说,.net实现MVC与其他语言的MVC具体实现是不同的,asp.net MVC与 MVC ...
- 关于写javaweb项目,遇到的问题:三层架构
关于写javaweb项目,遇到的问题 三层架构: 表示层(UI)业务逻辑层(BLL) 数据访问层(DAL) 高内聚,低耦合. 高内聚:一个模块内各元素彼此结合紧密程度高(只负责单一功能) 低耦合:简单 ...
最新文章
- anaconda配置环境变量
- mysql流行的四种高可用架构之:Keepalived+Mysql Replication
- 【学亮IT手记】oracle远程连接工具PL/SQL Developer的安装使用教程
- 真快!10秒内将k8s集群运行起来
- GitHub 发布 2018 年开源项目趋势预测
- Android插件化开发基础之Java动态代理(proxy)机制的简单例子
- 排序下---(冒泡排序,快速排序,快速排序优化,快速排序非递归,归并排序,计数排序)
- 活动报名小程序源码/thinkphp后台管理报名小程序源码
- C语言与汇编语言的区别
- 初步学习nodejs,业余用node写个一个自动创建目录和文件的小脚本,希望对需要的人有所帮助...
- 缓存装饰器的应用习题练习
- 密码学系列之:PEM和PKCS7,PKCS8,PKCS12
- 今日头条张一鸣:做CEO要避免理性的自负
- 解决IDEA中leetcode插件出现中文乱码问题
- 韦根w34是多少位_韦根(Wiegand)数据传输格式
- 输入平方尺转换为平方米 计算机,如何用电脑打出平方?平方米符号输入步骤教程...
- 程序员必知的编程5祖师爷,不要说你不知道!
- Html中文本域中加图片,如何在文本框中加图片
- 黑苹果睡眠唤醒usb失灵_黑苹果解决USB3.0驱动问题
- 【刷题】洛谷 P2675 《瞿葩的数字游戏》T3-三角圣地
热门文章
- CodeForces - 1300D Aerodynamic(几何+思维)
- CodeForces - 1109A Sasha and a Bit of Relax(思维+异或和,好题)
- HDU - 4370 0 or 1(思维+最短路)
- 剑指Offer-LeetCode刷题
- php tp框架调用方法,thinkPHP框架使用方法
- 2.IDA-数据显示窗口(反汇编窗口、函数窗口、十六进制窗口)
- 内核层 inlinehook 隐藏进程
- 使用 Minidumps 和 Visual Studio .NET 进行崩溃后调试
- C++中空指针调用类成员函数的原理
- ARP攻击实战之WinArpAttacker