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)
blank

相关推荐

  • 详解神经网络的前向传播和反向传播(从头推导)

    详解神经网络的前向传播和反向传播(从头推导)详解神经网络的前向传播和反向传播本篇博客是对MichaelNielsen所著的《NeuralNetworkandDeepLearning》第2章内容的解读,有兴趣的朋友可以直接阅读原文NeuralNetworkandDeepLearning。  对神经网络有些了解的人可能都知道,神经网络其实就是一个输入XXX到输出YYY的映射函数:f(X)=Yf(X)=Yf(X)=Y,函…

  • Mybatis中的resultMap和resultType区别

    Mybatis中的resultMap和resultType区别基本映射:(resultType)使用resultType进行输出映射,只有查询出来的列名和实体类中的属性名一致,该列才可以映射成功。(数据库,实体,查询字段,这些全部都得一一对应)高级映射:(resultMap)如果查询出来的列名和实体类的属性名不一致,通过定义一个resultMap对列名和实体类属性名之间作一个映射关系。(高级映射,字段名称可以不一致,通过映射来实现…

    2022年10月27日
  • oracle的union和union all_oracle count函数

    oracle的union和union all_oracle count函数定义了unionvar{uchartempa[4];ulongtemp3;};unionvarlongdat小编们利用C语言定义一个简单的Union共用体结构。你曾经喜欢小编,现在不喜欢了,小编不怪你,那是小编没本事。在这个结构中包含若干个属性,其中有Int、Char和Double型。谁是谁生命中的过客,谁是谁生命的转轮,前世的尘,今世的风,无穷无尽的哀伤的精魂。此时小编们…

    2022年10月26日
  • 使用vue.js安装node环境npm出错npm ERR! network request to https://registry.npmjs.org/nrm failed, reason: conn[通俗易懂]

    使用vue.js安装node环境npm出错npm ERR! network request to https://registry.npmjs.org/nrm failed, reason: conn[通俗易懂]报错信息:npmERR!codeETIMEDOUTnpmERR!errnoETIMEDOUTnpmERR!networkrequesttohttps://registry.npmjs.org/nrmfailed,reason:connectETIMEDOUT104.16.20.35:443npmERR!networkThisisaproblem…

    2022年10月29日
  • 虚拟机安装gcc「建议收藏」

    虚拟机安装gcc「建议收藏」(确保虚拟机网络通畅)1在虚拟机桌面上右击【打开终端】2输入sudoapt-getupdate回车输入开机密码(输入时密码并不显示,输完后回车)等待出现下一步指示3输入sudoapt-getinstallgcc回车输入密码等待(我等了约30min)出现下一步指示4输入gcc–version回车完…

  • java messagedigest_Java 自带的加密类MessageDigest类(加密MD5和SHA)[通俗易懂]

    java messagedigest_Java 自带的加密类MessageDigest类(加密MD5和SHA)[通俗易懂]转载转载自:http://www.tuicool.com/articles/nMNVVjJava自带的数据加密类MessageDigest(MD5或SHA加密)说明:在网站中,为了保护网站会员的用户名和密码等隐私信息,所以我们在用户注册时就直接进行MD5方式或其他方式进行加密,即使是数据库管理员也不能查看该会员的密码等信息,在数据库中查看密码效果如:8e830882f03b2cb84d1a6…

发表回复

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

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