【J2EE】【2.JDBC】JDBC连接数据库(MariaDB,Mysql)(继续之前jee的登陆例子)

零,名词解释

JDBC

JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。

DAO

DAO(Data Access Object)是一个数据访问接口,数据访问:顾名思义就是与数据库打交道。夹在业务逻辑与数据库资源中间。

JavaBean

JavaBean 是一种JAVA语言写成的可重用组件。用户可以使用JavaBean将功能、处理、值、数据库访问和其他任何可以用java代码创造的对象进行打包,并且其他的开发者可以通过内部的JSP页面、Servlet、其他JavaBean、applet程序或者应用来使用这些对象。这个概念太抽象,简单一点:

主要负责处理事务(如数据运算,操纵数据库)的JavaBean。JSP通常访问的是后一种JavaBean。这个还是太高级,在简单一点->只是数据打包,提供get set方法:

POJO(Plain Ordinary Java Object)简单的Java对象,实际就是普通JavaBeans。有时候也叫做:VO(value -object)或dto(Data Transform Object)


原文再续,书接上回

登陆例子的代码:http://pan.baidu.com/s/1c0ldR5e


一,JDBC操作数据库的一般步骤

注册驱动 (只做一次)
建立连接(Connection)
创建执行SQL的语句(Statement)
执行语句
处理执行结果(ResultSet)
释放资源


二,简单实现数据库连接类

        1,建立eva.dao包,新建MariaDBConn用于链接MariaDB的管理类
        2,老规矩,贴代码再解释
public class MariaDBConn {
	final String DBDRIVER = "org.mariadb.jdbc.Driver";
	final String DBURL = "jdbc:mariadb://localhost:3306/test";
	//final String DBDRIVER = "com.mysql.jdbc.Driver"; //if you use mysql
	//final String DBURL = "jdbc:mysql://localhost:3306/test";//if you use mysql
	final String DBUSER = "root";
	final String DBPWD = "123";
	Connection conn = null;//数据库连接

	public MariaDBConn() {
		try {
			Class.forName(DBDRIVER);// load the Connecting class
			conn = DriverManager.getConnection(DBURL, DBUSER, DBPWD);			
		}catch (ClassNotFoundException | SQLException e){
			e.printStackTrace();
		}
	}
	//another version to initialize with new parameters but not defautl parameters
	public MariaDBConn(String dbUrl, String dbUser, String dbPwd) {
		try {
			Class.forName(DBDRIVER);
			conn = DriverManager.getConnection(dbUrl, dbUrl, dbPwd);
		}catch (ClassNotFoundException | SQLException e) {
			e.printStackTrace();
		}
	}
	
	public Connection getConn() {
		return conn;
	}
	public void setConn(Connection conn) {
		this.conn = conn;
	}
	public void closeConn(){
		try {
			conn.close();
		} catch (SQLException e) {
			e.printStackTrace();
		}
	}
}

          前面的final是说在代码中不可以在更改变量的值。因为是常量字符串,所以全大写。先定义连接数据库需要的数据,在具体实现还可以从配置文件中读取。
          连接过程:注册驱动就是这里的加载类,建立连接就是getConnection那句
          有两个版本构造函数,方便使用默认版或者手动输入函数。注意如果使用的是Mariadb,要注意类名。
          这个类只是封装了获取连接和关闭连接部分,具体语句执行应该在Servlet中写。
        3,但是还没有连接器啊,去mariaDB(mysql)官网下载jdbc连接器
【J2EE】【2.JDBC】JDBC连接数据库(MariaDB,Mysql)(继续之前jee的登陆例子)_第1张图片

                     http://dev.mysql.com/downloads/connector/j/      or   https://downloads.mariadb.org/
        4,可以放在项目中 WebContent/WEB-INF/lib中,这个目录eclipse会自动扫描。如果放在别处目录需要在build path中加入


三,修改CheckAccount,在那里调用查找数据库

	public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException{
		String pwd = request.getParameter("password");
		String username = request.getParameter("username");
		MariaDBConn db = new MariaDBConn();//实例化数据库连接类
		Connection conn = db.getConn();//获取链接
		String sql = "select password from user where username=?";//预设查询语句
		PreparedStatement pstmt = null;//预查询语句
		String rightPwd = "";
		try {
			pstmt = conn.prepareStatement(sql);//告诉连接,准备使用这个语句
			pstmt.setString(1, username);//往这个语句的第一个问好填入参数
			ResultSet rs = pstmt.executeQuery();//执行查询。如果是执行更新应该用executeUpdate
			while(rs.next()) {//典型ResultSet处理方法
				rightPwd = rs.getString("password");//此时rs指向的是结果集中的一行,取列名为password的值
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		if(!pwd.isEmpty() && rightPwd.equals(pwd)){//仅有equals成立无法应对此种情况:如果没输入密码,然后用户名不存在
			try {
				request.getRequestDispatcher("jsp/logSuccess.jsp").forward(request, response);
			} catch (ServletException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}else{
			System.out.println("password is wrong!");
			response.sendRedirect("");
		}
		db.closeConn();
	}
          3.1在try块中,将PreparedStatement绑定到对应的conn,然后设置参数,执行查询,循环取结果集,可以通过列名或列的序号取得该行的具体值。
          3.2具体的业务逻辑没变,只是在上一个版本的基础上添加了查找数据库,确认密码的功能。
          3.3这时候有人就要问了:Statement和preparedStatement有什么区别,execute,executeQuery,executeUpdate有什么区别。
            简单地说,pstmt是经过预编译的,会比stmt快,安全性好一点,要填参数;stmt是原始的语句,sql字符串要自己拼接好。
                                executeQuery是查询的;executeUpdate是增加/更改/删除的。
          3.4最后要关闭连接。数据库连接的开关是很昂贵的(消耗资源和时间的),可以考虑使用数据源技术提升性能。(一两个使用者的demo程序不需要)

四,ajax引例

       这个时候应该有人发现了,我不小心输错密码,页面跳回让我重新登陆可以理解,为什么要刷掉我的用户名呢?打错密码要连带重新输入名字,这简直就是反人类设计!!
       但,submit之后就是跳转了,回来的时候是一个新的登陆页面。
       现有的知识好像没有办法,那么就引入我们 下一节,ajax技术
       简要的说,就是在页面hold住不动,就将信息发送到服务器检验用户名密码,如果成功,直接跳转到欢迎页面;如果失败,留在原页面,不做人和动作,不跳转。


EvaDemo_2_jdbc.zip
最终代码: http://pan.baidu.com/s/1c0rP2jY

最后项目结构图:

【J2EE】【2.JDBC】JDBC连接数据库(MariaDB,Mysql)(继续之前jee的登陆例子)_第2张图片
参考资料:
【J2EE】JDBC
http://blog.csdn.net/robinjwong/article/details/23605775
J2EE--JDBC
http://blog.csdn.net/han_yankun2009/article/details/21552853



你可能感兴趣的:(Java)