JDBC-三层架构

JDBC-三层架构

恶心啊,至始至终对编程都不感冒,没办法,专业也是自己选的,不学能咋地,像别人那样,混日子,我也做不到。

因为我缺钱啊,我需要搞钱,需要吃饭。

学吧,就这样死啃吧。

时间也不多了。

一切为了生存!!!

自己还是鱼的记忆,今天学的明天忘,以后博客是不能断了……..

 

一、三层架构为哪三层?

在软件设计当中,为了实现软件的高内聚低耦合,会将整个代码的结构划分为,表现层,业务层,数据访问层的三层架构。

关于三层架构的理解:可以和生活练习起来:

可以借鉴服务员,厨师,采购员之间的关系:

顾客直接和服务员打交道,顾客和服务员(UI层)说:我要一个炒茄子,而服务员不负责炒茄子,她就把请求往上递交,传递给厨师(BLL层),厨师需要茄子,就把请求往上递交,传递给采购员(DAL层),采购员从仓库里取来茄子传回给厨师,厨师响应cookEggplant()方法,做好炒茄子后,又传回给服务员,服务员把茄子呈现给顾客。

JDBC-三层架构

 

UI(表现层): 主要是指与用户交互的界面。用于接收用户输入的数据和显示处理后用户需要的数据。

BLL:(业务逻辑层): UI层和DAL层之间的桥梁。实现业务逻辑。业务逻辑具体包含:验证、计算、业务规则等等。

DAL:(数据访问层): 与数据库打交道。主要实现对数据的增、删、改、查。将存储在数据库中的数据提交给业务层,同时将业务层处理的数据保存到数据库。(当然这些操作都是基于UI层的。用户的需求反映给界面(UI),UI反映给BLL,BLL反映给DAL,DAL进行数据的操作,操作后再一一返回,直到将用户所需数据反馈给用户)

简言之:

  • 表现层(View):收集用户名密码,然后展示。
  • 业务层(Service):将拿来的数据进行加工和校验。
  • 数据访问层(DAO):负责数据库访问。

1、For example 银行转账

JDBC-三层架构

 2、常见的项目包结构

 

conf            用来配置文件

dao            数据访问对象接口                                   数据访问层

                  数据访问对象接口实现类

entity         实体对象

service      业务层接口                                             业务层

                 业务层接口实现类

sql            项目相关的sql命令文件

util            工具类

view         表现层代码                                                视图层

JDBC-三层架构

二、ORM思想(对象关系映射 object relationship mapping)

JDBC-三层架构

orm的简单测试

JDBC-三层架构

 1引入sql

CREATE TABLE ACCOUNT(
	cardid INT(7) PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(15) NOT NULL,
	PASSWORD VARCHAR(6) NOT NULL,
	balance double
);
INSERT INTO ACCOUNT(NAME,PASSWORD,balance) VALUES('蒋静','123456',500);
INSERT INTO ACCOUNT(NAME,PASSWORD,balance) VALUES('徐成','123456',800);

SELECT * FROM ACCOUNT;

2.创建字段的实体。shift+alt+s快捷键

package entity;

public class Account {
	private Integer cardid;
	private String name;
	private  String password;
	private  double balance;
	
	public Account() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	@Override
	public String toString() {
		return "Accout [cardid=" + cardid + ", name=" + name + ", password=" + password + ", balance=" + balance + "]";
	}

	public Account(Integer cardid, String name, String password, double balance) {
		super();
		this.cardid = cardid;
		this.name = name;
		this.password = password;
		this.balance = balance;
	}

	public Integer getCardid() {
		return cardid;
	}
	public void setCardid(Integer cardid) {
		this.cardid = cardid;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
	public double getBalance() {
		return balance;
	}
	public void setBalance(double balance) {
		this.balance = balance;
	}

	
}

3.测试

package Test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import org.junit.Test;

import entity.Account;
import util.jdbcUtil3;

public class TestOrm {
	@Test
	public void testQuery() throws Exception{
		Connection conn = jdbcUtil3.getConnection();
		String sql = "select * from account where name='lb'";
		PreparedStatement pstm = conn.prepareStatement(sql);
		ResultSet rs = pstm.executeQuery();
		//创建Account对象,对应查询的一条记录
		Account account = new Account();
		//处理结果集
		if(rs.next()){
			int cardid = rs.getInt(1);
			String name= rs.getString(2);
			String password = rs.getString(3);
			double balance =rs.getDouble(4);
			//查询的记录。给Account对象赋值
			account.setCardid(cardid);
			account.setName(name);
			account.setPassword(password);
			account.setBalance(balance);
		}
		System.out.println(account);
	}
	@Test
	public void testQueryAll() throws Exception{
		Connection conn = jdbcUtil3.getConnection();
		String sql ="select * from account";
		PreparedStatement pstm = conn.prepareStatement(sql);
		ResultSet rs = pstm.executeQuery();
		//创建Account集合,对应多条记录
		List<Account> list = new ArrayList<Account>();
	
		while(rs.next()){
			
			int cardid = rs.getInt(1);
			String name= rs.getString(2);
			String password = rs.getString(3);
			double balance =rs.getDouble(4);
			//将查询的一条记录封装到一个Accout对象中
			Account account = new Account();
			account.setCardid(cardid);
			account.setName(name);
			account.setPassword(password);
			account.setBalance(balance);
			list.add(account);
		}
		//遍历list
		for(Account account : list)
		{
			System.out.println(account);
		}
	}
	
	
}

测试结果成功了,但是可以发现,查询部分有很多重复的代码,代码利用率不高,所以有必要进行封装了‘’

新建个接口,在整个继承接口的类,把查询数据那步集成一下

package rowmapper;

import java.sql.ResultSet;

public interface RowMapper<T> {
	//将ResultSet结果集封装成对象
		public T mappreRow(ResultSet rs);
}
package rowmapper;
import java.sql.ResultSet;
import java.sql.SQLException;

import entity.Account;
import rowmapper.RowMapper;

public class AccountRowMapper implements RowMapper{

	@Override
	public Object mappreRow(ResultSet rs)  {
		// TODO Auto-generated method stub
		Account account = new Account();
		try {
			account.setCardid(rs.getInt(1));
			account.setName(rs.getString("name"));
			account.setPassword(rs.getString(3));
			account.setBalance(rs.getDouble(4));
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		return account;
	}

}

JDBC-三层架构

 

 

package Test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import org.junit.Test;

import entity.Account;
import rowmapper.AccountRowMapper;
import rowmapper.RowMapper;
import util.jdbcUtil3;

public class TestOrm {
	RowMapper rm = new AccountRowMapper();
	@Test
	public void testQuery() throws Exception{
		
		Connection conn = jdbcUtil3.getConnection();
		String sql = "select * from account where name='wxd'";
		PreparedStatement pstm = conn.prepareStatement(sql);
		ResultSet rs = pstm.executeQuery();
		//创建Account对象,对应查询的一条记录
		Account account = new Account();
		//处理结果集
		if(rs.next()){
			account = (Account) rm.mappreRow(rs);
		}
		System.out.println(account);
	}
	@Test
	public void testQueryAll() throws Exception{
		Connection conn = jdbcUtil3.getConnection();
		String sql ="select * from account";
		PreparedStatement pstm = conn.prepareStatement(sql);
		ResultSet rs = pstm.executeQuery();
		//创建Account集合,对应多条记录
		List<Account> list = new ArrayList<Account>();
		while(rs.next()){
		 Account account = (Account) rm.mappreRow(rs);
			list.add(account);
		}
		//遍历list
		for(Account account : list)
		{
			System.out.println(account);
		}
	}
	
	
}

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/114777.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • webstorm插件开发

    webstorm插件开发前言最近有开发webstrom插件的需求,可是百度一下发现网上关于webstorm插件开发的文章实在是寥寥无几,本文记录一下本次插件开发走的路和踩的坑。希望对后来的同学能有些许的帮助。正文准备工作intelliJ平台的所有插件开发都是基于java语言,所以在进入开发工作之前必须对java语言有一定的了解,本人作为java门外汉,花…

  • java中数组遍历的三种方式

    java中数组遍历的三种方式1.for循环遍历通常遍历数组都是使用for循环来实现。遍历一维数组很简单,遍历二维数组需要使用双层for循环,通过数组的length属性可获得数组的长度。2.Arrays工具类中toString静态方法遍历利用Arrays工具类中的toString静态方法可以将一维数组转化为字符串形式并输出。3.foreach语句遍历java5之后,Java提供了一种更简洁的循环:foreach循环,这种循环遍历数组和集合更加简洁。使用foreach循环遍历数组时,无须获得数组和集合长度,无须根据索引来访问数组

  • 数据挖掘项目_数据分析师怎么自学

    数据挖掘项目_数据分析师怎么自学数据挖掘项目1.数据导入一共有4754个样本,90列的数据表格中“status”是结果标签:0表示未逾期,1表示逾期。未逾期:3561逾期:11932.数据类型分析90列中70列为float,13列为int,7列objectobject类型的列名,以及其分布3.删除无关变量4.缺失值处理5.划分数据集测试集30%,训练集70%,随机种子设置为2018待…

  • 风控模型的基础知识

    风控模型的基础知识风控模型根据设定的y变量与可获得的x变量不同,大致可以分为三类:即A卡,B卡,C卡。今天就让我们聊聊三者的区别。1、A卡(Applicationscorecard)A卡即申请评分模型,此类风控模型的目的在于预测申请时点(申请信用卡、申请贷款)未来一定时间内逾期的概率。Y变量的设定观察点为申请时点,定义为表现期内是否逾期。X变量一般只有客户填写的申请书信息,加上外部查询的数据与征信报告。2、B卡(Behaviorscorecard)B卡即行为评分模型,此类风控模型的目的在于预测使用时点(获得贷

  • 树莓派操作系统

    树莓派操作系统树莓派操作系统,适用于树莓派的各种操作系统,树莓派4的操作系统列表,这些系统应该也能用于树莓派3、3B+和其他变种,但是请参照项目的官方网站了解详细信息。

  • Redis在Laravel项目中的应用实例详解

    Redis在Laravel项目中的应用实例详解

    2021年10月24日

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号