使用JDBC连接Oracle数据库和使用连接池连接Oracle数据库的代码解析

这里连接的是oracle数据库。

JDBC是什么:JDBC是java数据库连接技术的简称,提供连接各种常用数据库的能力。

客户端发送请求给应用服务器,应用服务器通过JDBC连接到数据库服务器,查询数据库中的数据,返回一个结果集,再把结果集转换成实体类传递给客户端。

JDBC连接数据库的步骤:加载驱动、建立连接、执行SQL语句、返回结果集

下图主要详细描述了客户端是如何连接到数据库的:


访问数据库的代码一般都放在DAO(Data Assess Object 数据库存取对象)层,DAO层位于业务逻辑和持久化数据之间,实现对持久化数据的访问。DAO层起着转换器的作用,把实体类转换为数据库中的记录,或者把数据库中的记录转换成实体类。

利用JDBC实现登录功能(代码):

登录页面:login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    
    <title>登录</title>
    
	<meta http-equiv="pragma" content="no-cache">
	<meta http-equiv="cache-control" content="no-cache">
	<meta http-equiv="expires" content="0">    
	<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
	<meta http-equiv="description" content="This is my page">
	<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->

  </head>
  
  <body>
  	<form action="login.action">
  		用户名:<input type="text" name="uname" value="${param.uname }"><br/>
  		密码:<input type="password" name="pwd" value="${param.pwd }"><br/>
  		<input type="submit" value="登录"><br/>
  		<span style="color: red;">${requestScope.error }</span>
  	</form>
  	<a href="register.jsp">没有账号,立即注册</a>
  </body>
</html>

建立一个实体类:User.java

package com.jredu.entity;
/**
 * 实体类
 * @author Administrator
 *
 */
public class User {
	
	private int id;
	private String uname;
	private String pwd;
	
	public User() {
		super();
	}
	
	public User(String uname, String pwd) {
		super();
		this.uname = uname;
		this.pwd = pwd;
	}

	public User(int id, String uname, String pwd) {
		super();
		this.id = id;
		this.uname = uname;
		this.pwd = pwd;
	}


	public int getId() {
		return id;
	}


	public void setId(int id) {
		this.id = id;
	}


	public String getUname() {
		return uname;
	}


	public void setUname(String uname) {
		this.uname = uname;
	}


	public String getPwd() {
		return pwd;
	}


	public void setPwd(String pwd) {
		this.pwd = pwd;
	}
}


LoginServlet.java

package com.jredu.controller;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.jredu.entity.User;
import com.jredu.service.LoginService;
import com.jredu.service.impl.LoginServiceImpl;
@WebServlet(value="/login.action")
public class LoginServlet extends HttpServlet {
	
	private LoginService service;

	/**
	 * The doGet method of the servlet. <br>
	 *
	 * This method is called when a form has its tag value method equals to get.
	 * 
	 * @param request the request send by the client to the server
	 * @param response the response send by the server to the client
	 * @throws ServletException if an error occurred
	 * @throws IOException if an error occurred
	 */
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		doPost(request, response);
	}

	/**
	 * The doPost method of the servlet. <br>
	 *
	 * This method is called when a form has its tag value method equals to post.
	 * 
	 * @param request the request send by the client to the server
	 * @param response the response send by the server to the client
	 * @throws ServletException if an error occurred
	 * @throws IOException if an error occurred
	 */
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		String uname=request.getParameter("uname");
		String pwd=request.getParameter("pwd");
		//调用javabean
		service=new LoginServiceImpl();
		User user=service.login(uname, pwd);
		//跳转jsp
		if(user!=null) {
			request.getSession().setAttribute("user", user);
			response.sendRedirect("index.jsp");
		} else {
			request.setAttribute("error", "登录失败请重新输入");
			request.getRequestDispatcher("login.jsp").forward(request, response);
		}
		
	}

}

LoginService.java

package com.jredu.service;

import com.jredu.entity.User;

public interface LoginService {
	/**
	 * 登录功能
	 * @param uname
	 * @param pwd
	 * @return
	 */

	User login(String uname, String pwd);

}


LoginServiceImpl.java

package com.jredu.service.impl;

import com.jredu.dao.UserDao;
import com.jredu.dao.impl.UserDaoImpl;
import com.jredu.entity.User;
import com.jredu.service.LoginService;

public class LoginServiceImpl implements LoginService {

	private UserDao ud=new UserDaoImpl();
	@Override
	public User login(String uname, String pwd) {
		// TODO Auto-generated method stub
		//下面是业务处理,访问数据库在UserDaoImpl类中
		User user = new User(uname,pwd);
		return ud.findUser(user);
		
	}

}


UserDao.java

package com.jredu.dao;

import java.util.List;

import com.jredu.entity.User;
/**
 * 数据库访问的接口。
 * @author jiaxutianhuo
 *
 */
public interface UserDao {
	//登录
	User findUser(User user);
	
	//查询
	public List<User> query(String sql,String sex) throws Exception;
}


UserDaoImpl.java

package com.jredu.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.jredu.dao.UserDao;
import com.jredu.entity.User;
import com.jredu.util.BaseDao;


public class UserDaoImpl extends BaseDao implements UserDao {
	
	@Override
	public User findUser(User user) {
		// TODO Auto-generated method stub
		//3.执行sql语句
		//4.获取结果集
		ResultSet rs=executeQuery("select * from users where username=? and userpwd=?", user.getUname(),user.getPwd());
		//访问数据库查询是否存在该用户
		try {
			//登录成功
			if(rs.next()) {
				//把结果集转换成实体类
				user.setUname(rs.getString("username"));
				user.setPwd(rs.getString("userpwd"));
				user.setId(rs.getInt("userid"));
				return user;
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			closeAll();
		}
		//不存在该用户
		return null;
	}

	
	//查询
	@Override
	public List<User> query(String sql, String sex) throws Exception {
		// TODO Auto-generated method stub
		List<User> list = new ArrayList<User>();
		ResultSet rs = new BaseDao().executeQuery(sql, sex);
		while (rs.next()) {
			User us = new User();
			us.setUname(rs.getString("name"));
			list.add(us);
		}
		return list;
	}

}


BaseDao.java

package com.jredu.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.jredu.dao.UserDao;
import com.jredu.entity.User;
import com.jredu.util.BaseDao;


public class UserDaoImpl extends BaseDao implements UserDao {
	
	@Override
	public User findUser(User user) {
		// TODO Auto-generated method stub
		//3.执行sql语句
		//4.获取结果集
		ResultSet rs=executeQuery("select * from users where username=? and userpwd=?", user.getUname(),user.getPwd());
		//访问数据库查询是否存在该用户
		try {
			//登录成功
			if(rs.next()) {
				//把结果集转换成实体类
				user.setUname(rs.getString("username"));
				user.setPwd(rs.getString("userpwd"));
				user.setId(rs.getInt("userid"));
				return user;
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			closeAll();
		}
		//不存在该用户
		return null;
	}

	
	//查询
	@Override
	public List<User> query(String sql, String sex) throws Exception {
		// TODO Auto-generated method stub
		List<User> list = new ArrayList<User>();
		ResultSet rs = new BaseDao().executeQuery(sql, sex);
		while (rs.next()) {
			User us = new User();
			us.setUname(rs.getString("name"));
			list.add(us);
		}
		return list;
	}

}


CharacterFilter.java

package com.jredu.filter;

import java.io.IOException;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
/**
 * 编码过滤器
 * @author Administrator
 *
 */
@WebFilter(value="/*",initParams={@WebInitParam(name="encoding",value="utf-8")})
public class CharacterFilter implements Filter {

	private String encoding;
	
	/**
	 * 初始化
	 */
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		System.out.println("字符编码过滤器启动...");
		encoding=filterConfig.getInitParameter("encoding");
	}

	/**
	 * 过滤功能
	 */
	@Override
	public void doFilter(ServletRequest request, ServletResponse response,
			FilterChain chain) throws IOException, ServletException {
		// TODO Auto-generated method stub
		//设置请求编码格式
		request.setCharacterEncoding(encoding);
		//设置响应编码格式
		response.setContentType("text/html;charset="+encoding);
		response.setCharacterEncoding(encoding);
		chain.doFilter(request, response);
	}
	
	/**
	 * 销毁
	 */
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		System.out.println("字符编码过滤器结束...");
	}

}


index.jsp

<%@ page language="java"
	import="java.util.*,com.jredu.util.BaseDao,java.sql.Connection,java.sql.ResultSet"
	pageEncoding="UTF-8"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
</head>

<body>
	<%
		ResultSet rs = new BaseDao()
				.executeQuery("select * from users");
		while (rs.next()) {
	%>
	<%=rs.getString("USERNAME")%><br />
	<%
		}
	%>
</body>
</html>


上述代码运行的结果是:

用到的数据库是:

什么是JNDI:JNDI(Java Naming and Directory Interface,java命名和目录接口),是一组在Java应用中访问命名和目录服务的API,通过名称将资源与服务进行关联。

使用连接池的好处:

1、可以弥补传统数据库连接方式的不足。传统数据库每一次请求时均需要连接数据库,资源占用较多;当并发访问

数据量较大时,网站速度受到极大的影响;在访问结束后必须要关闭连接释放资源;系统的安全性和稳定性相对较差。

2、企业级开发需要稳健和高效的数据访问层。使用连接池可以完成对数据库的CRUD操作,能够处理数据库发生的各种错误,可以灵活的修改配置,提供方便使用的工具,具有的性能较高。

什么是连接池技术:


连接池工作的原理:

利用连接池实现登录:

在上述代码的基础上稍加修改,下面是修改了的代码:

UserDaoImpl.java

package com.jredu.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.jredu.dao.UserDao;
import com.jredu.entity.User;
import com.jredu.util.BaseDao;
import com.jredu.util.JNDIBaseDao;


public class UserDaoImpl extends JNDIBaseDao implements UserDao {
	
	@Override
	public User findUser(User user) {
		// TODO Auto-generated method stub
		//3.执行sql语句
		//4.获取结果集
		ResultSet rs=executeQuery("select * from users where username=? and userpwd=?", user.getUname(),user.getPwd());
		//访问数据库查询是否存在该用户
		try {
			//登录成功
			if(rs.next()) {
				//把结果集转换成实体类
				user.setUname(rs.getString("username"));
				user.setPwd(rs.getString("userpwd"));
				user.setId(rs.getInt("userid"));
				return user;
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} finally {
			closeAll();
		}
		//不存在该用户
		return null;
	}

	
	//查询
	@Override
	public List<User> query(String sql, String sex) throws Exception {
		// TODO Auto-generated method stub
		List<User> list = new ArrayList<User>();
		ResultSet rs = new BaseDao().executeQuery(sql, sex);
		while (rs.next()) {
			User us = new User();
			us.setUname(rs.getString("name"));
			list.add(us);
		}
		return list;
	}

}

JNDIBaseDao.java

package com.jredu.util;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class JNDIBaseDao {

	private DataSource source; //数据源
	private Connection connection;
	private PreparedStatement ps;
	private ResultSet rs;
	
	{
		try {
			Context ic = new InitialContext();//初始化
			source = (DataSource)ic.lookup("java:comp/env/jdbc/orcl");//在tomcat中配置
		} catch (NamingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public void getConnection() {
		try {
			connection=source.getConnection();//数据源创建connection
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	/**
	 * 增删改操作
	 * @param sql
	 * @param objs
	 * @return 影响行数
	 */
	public int executeUpdate(String sql,Object... objs) {
		if(connection==null) {
			getConnection();
		}
		int res=-1;
		try {
			//设置手动提交事务
			connection.setAutoCommit(false);
			connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
			ps=connection.prepareStatement(sql);
			if(objs!=null) {
				for(int i=0;i<objs.length;i++) {
					ps.setObject(i+1, objs[i]);
				}
			}
			res=ps.executeUpdate();
			//手动提交事务
			connection.commit();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			try {
				connection.rollback();
			} catch (SQLException e1) {
				// TODO Auto-generated catch block
				e1.printStackTrace();
			}
		} finally {
			if(ps!=null) {
				try {
					ps.close();
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		return res;
	}
	
	/**
	 * 查询操作
	 * @param sql
	 * @param objs
	 * @return
	 */
	public ResultSet executeQuery(String sql,Object... objs) {
		if(connection==null) {
			getConnection();
		}
		try {
			ps=connection.prepareStatement(sql);
			if(objs!=null) {
				for(int i=0;i<objs.length;i++) {
					ps.setObject(i+1, objs[i]);
				}
			}
			rs=ps.executeQuery();
			return rs;
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
	
	public void closeAll() {
		try {
			if(rs!=null) {
				rs.close();
			}
			if(ps!=null) {
				ps.close();
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
}

index.jsp

<%@ page language="java"
	import="java.util.*,com.jredu.util.JNDIBaseDao,java.sql.Connection,java.sql.ResultSet"
	pageEncoding="UTF-8"%>
<%
	String path = request.getContextPath();
	String basePath = request.getScheme() + "://"
			+ request.getServerName() + ":" + request.getServerPort()
			+ path + "/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">

<title>My JSP 'index.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
	<link rel="stylesheet" type="text/css" href="styles.css">
	-->
</head>

<body>
	<%
		ResultSet rs = new JNDIBaseDao()
				.executeQuery("select * from users");
		while (rs.next()) {
	%>
	<%=rs.getString("USERNAME")%><br />
	<%
		}
	%>
</body>
</html>

还需要在tomcat下的conf文件夹下的context.xml下加上:
<Resource name="jdbc/orcl" 
auth="Container" type="javax.sql.DataSource" maxTotal="100"  
maxIdle="30" maxWaitMillis="10000" username="zhao" password="Jredu12345" 
driverClassName="oracle.jdbc.driver.OracleDriver"  
url="jdbc:oracle:thin:@localhost:1521:orcl" />




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值