Java EE结构理解 与Dao模式 no7.

什么是 JavaEE

JavaEE 概念
Java EE,Java 平台企业版(Java Platform Enterprise Edition),之前称为Java 2 Platform, Enterprise Edition (J2EE),2018年3月更名为 Jakarta EE(这个名称应该还没有得到群众认可)。是 Sun 公司为企业级应用推出的标准平台,用来开发B/S架构软件。Java EE 可以说是一个框架,也可以说是一种规范。

JavaEE 是 Java 应用最广泛的部分。

JavaEE 与 JavaSE 的区别与联系
JavaEE 是在 JavaSE 的基础上构建的,是对 JavaSE 的扩展,增加了一些更加便捷的应用框架。

除了 EE 和 SE,还有为移动端而生的 JavaME,但目前应用不算广泛。三者的关系可以用下图概括:

JavaEE主要技术
JavaEE 号称有十三种核心技术。它们分别是:JDBC、JNDI、EJB、RMI、Servlet、JSP、XML、JMS、Java IDL、JTS、JTA、JavaMail和JAF。

简单介绍下需要重点关注的技术。

JDBC
Java 数据库连接,(Java Database Connectivity,JDBC)是 Java 语言中用来规范客户端程序如何来访问数据库的应用程序接口,提供了诸如查询和更新数据库中数据的方法。

JNDI
Java 命名和目录接口(Java Naming and Directory Interface,JNDI),是 Java 的一个目录服务应用程序界面(API),它提供一个目录系统,并将服务名称与对象关联起来,从而使得开发人员在开发过程中可以使用名称来访问对象。

EJB
企业级 JavaBean(Enterprise JavaBean, EJB)是一个用来构筑企业级应用的服务器端可被管理组件。

Servlet
Servlet(Server Applet),是用 Java 编写的服务器端程序。其主要功能在于交互式地浏览和修改数据,生成动态 Web 内容。

狭义的 Servlet 是指 Java 语言实现的一个接口,广义的 Servlet 是指任何实现了这个 Servlet 接口的类,一般情况下,人们将 Servlet 理解为后者。

JSP
JSP(全称JavaServer Pages)是由 Sun 公司主导创建的一种动态网页技术标准。JSP 部署于网络服务器上,可以响应客户端发送的请求,并根据请求内容动态地生成 HTML、XML 或其他格式文档的 Web 网页,然后返回给请求者。

JavaEE框架
JavaEE 拥有广泛市场的原因之一就是可以使用多种框架来使开发变得简单。对于框架的选择多种多样,目前比较常见的框架组合有 SSH和SSM。在后面的章节中会作详细介绍。另外Spring本身也提供了多种层次的框架供选择,可以到Spring官网了解详情。

Spring: https://spring.io/

SSH
Structs + Spring + Hibernate

SSM
Spring +SpringMVC + MyBatis

JavaEE学习路径
一般来讲,初学者应该遵循以下路径

Servlet -> JSP -> Spring -> 组合框架

**

Java EE结构图片

**
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

JavaEE Dao模式

Data Access Object 数据访问对象

现在又重新新建项目 把no6以前数据库写的连接工具 等copy到新项目,新建com.dao ,新建com.dao.impl 两个page,dao里面建立 某个表的dao接口类类 这里建立userdao,dao.impl里面建立一个接入类userdao.:
结构如下:
在这里插入图片描述
代码如下:

dao接口:

package com.dao;

public interface UserDao {
	//查询全部
	void findAll();

}

userimpl类
package com.dao.impl;

import com.dao.UserDao;

public class UserDaoimpl implements UserDao {

	@Override
	public void findAll() {
		// TODO Auto-generated method stub

	}

在这里我们建立test类加入测试单元(我在数据库新建了一个表t_user,字段如下图:)
在这里插入图片描述
然后现实重写方法:

`package com.dao.impl;

    import java.sql.ResultSet;
    import java.sql.SQLException;
    
    import com.dao.UserDao;
    import com.jdbc.util.JDBCutil;
    import com.mysql.jdbc.Connection;
    import com.mysql.jdbc.Statement;
    
    public class UserDaoimpl implements UserDao {
    
    	@Override
    	public void  findAll() {
    		
    		Connection conn=null;
    		Statement st=null;
    		ResultSet rs=null;
    		
    		try {
    			//建立连接
    			conn=(Connection) JDBCutil.getConn();
    			//建立对象
    			st=(Statement) conn.createStatement();
    			String sql="select * from t_user";
    			//执行查询
    			rs=st.executeQuery(sql);
    			while (rs.next()) {
    			String name=rs.getString("username");
    			String password=rs.getString("userpassword");
    			System.out.println("姓名"+name+"  "+"密码"+password);
    				
    			}
    		} catch (SQLException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}finally {
    			JDBCutil.release(rs, st, conn);
    		}
    		
    		
    	}
    
    }

test测试方法中new 对象 new 接口类型的 继承对象:
代码如下:

 `package com.userdaoimpl.test;

import org.junit.Test;

import com.dao.UserDao;
import com.dao.impl.UserDaoimpl;


public class TestDaoimpl {
	@Test
	public void TestFidnAll() {
		UserDao dao=new UserDaoimpl();
		dao.findAll();
		
	
	}

}

`

单元测试运行:

在这里插入图片描述

##总结:

1,新建dao接口
2,新建现实dao接口imp类,具体实现早前定义的规则
3,直接使用实现

现在来定义有规则的查询 我们可以做一个登陆使用的demo。(引子)

接口类里面写:

//登陆方法
	void login(String username ,String userpassword);

实现登陆方法:

	//实现登陆方法

	@Override
	public void login(String username, String userpassword) {
	
		Connection conn=null;
		ResultSet rs=null;
		Statement st=null;
		
		
		try {
			//建立连接
			conn=(Connection) JDBCutil.getConn();
			 st=(Statement) conn.createStatement();
			String sql="select * from t_user where username='"+ username +"' and userpassword='"+userpassword+"'";
			rs=st.executeQuery(sql);
			if (rs.next()) {
				System.out.println("登陆成功!");
				
			}else {
				System.out.println("登陆失败!");
			};
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			JDBCutil.release(rs, st, conn);
		}
		
		
	}

单元测试new 对象 调用方法:

@Test
	public void Testlogin() {
		UserDao dao=new UserDaoimpl();
		dao.login("zhangsan", "admini");
	}

结果:
在这里插入图片描述

现在可以引出statement类的安全问题
在数据库中执行查询代码:

SELECT * FROM t_user WHERE username='username' AND userpassword='+userpassword'

在这里插入图片描述
可以出正确结果。
但是我们这样:

SELECT * FROM t_user WHERE username='username' AND userpassword='+userpassword' OR 1=1

仍然可以出结果:
在这里插入图片描述
在这里插入图片描述
在代码里面假设我们这样写:

//假设这样写  dao.login("zhangsan","admin ' or ' 1=1");

结果:
在这里插入图片描述

总结:

安全问题Statement其实是SQL语句的拼接, 是先拼接,在一起执行。
(先拼接SQL语句 如果变量里面带有数据库关键字 那么一并认为是关键字,而不是普通的字符串)

怎么解决这个问题?
应该使用preparstatment
该对象是替换前面的statment对象

在代码中实现:

@Override
	public void login(String username, String userpassword) {
	
		Connection conn=null;
		ResultSet rs=null;
		Statement st=null;
		PreparedStatement ps=null;
		
		
		try {
			//建立连接
			conn=(Connection) JDBCutil.getConn();
			
			String sql="select * from t_user where username=? and userpassword=?";
			//创建对象
			
			//预先对SQL语句执行语法的校验 ,?对应的内容,后面不管传递什么进来,都把他看成是字符串。
			//?对应的索引是从1开始
			 ps=(PreparedStatement)conn.prepareStatement(sql);
			 ps.setString(1, username);
			 ps.setString(2, userpassword);
			 rs=ps.executeQuery();
			if (rs.next()) {
				System.out.println("登陆成功!");
				
			}else {
				System.out.println("登陆失败!");
			};
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			JDBCutil.release(rs, st, conn);
		}
	}

**

重点:

**
//预先对SQL语句执行语法的校验 ,?对应的内容,后面不管传递什么进来,都把他看成是字符串。
//?对应的索引是从1开始

String sql="select * from t_user where username=? and userpassword=?";
			//创建对象
			
			//预先对SQL语句执行语法的校验 ,?对应的内容,后面不管传递什么进来,都把他看成是字符串。
			//?对应的索引是从1开始
			 ps=(PreparedStatement)conn.prepareStatement(sql);
			 ps.setString(1, username);
			 ps.setString(2, userpassword);

结果:
在这里插入图片描述
在这里插入图片描述
按照此思路继续写插入 删除
插入代码:


	//插入方法
	@Override
	public void insert(String username, String userpassword) {
		Connection conn=null;
		Statement st=null;
		ResultSet rs=null;
		//建立连接
		
		try {
			 conn=(Connection) JDBCutil.getConn();
			String sql="INSERT INTO t_user VALUES(null,?,?)";
			PreparedStatement ps=(PreparedStatement)conn.prepareStatement(sql);
			ps.setString(1, username);
			ps.setString(2, userpassword);
			int result=ps.executeUpdate();
			if (result>0) {
				System.out.println("添加成功");
				
			}else {
				System.out.println("添加失败");
			}
			
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			JDBCutil.release(st, conn);
		}	
		
	}

删除代码:

@Override
	public void delete(int id) {
		
		Connection conn=null;
		Statement st=null;
		PreparedStatement ps=null;
		try {
			//建立连接
			conn=(Connection) JDBCutil.getConn();
			
			String sql="delete from t_user where id=?";
			ps=(PreparedStatement) conn.prepareStatement(sql);
			ps.setInt(1, id);
			int result =ps.executeUpdate();
			if (result>0) {
				System.out.println("删除成功");
				
			}else {
				System.out.println("删除失败");
			}
			
		}catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			JDBCutil.release(ps, conn);
		}
	
		
		
	}

总结:jdbc还是蛮简单 就不总结了

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值