JDBC的操作流程整理

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/shujuelin/article/details/85145587

通过Java,jdbc操数据库.一般都是有固定的步骤构成:

  1.做好数据库  .jar的导入.

   2.创建对象.

3.定义driver,url,user,passwrod;

4.然后就是操作这些对象操作数据库中的数据

5.然后就是对这些对象进行异常捕获.

  通过try{ }catch{   }处理异常

6.最后一点! 别忘了关闭  Connection,PreparedStatement,ResultSet对象.

创建的时候是:Connection连接→PreparedStatement预处理→ResultSet结果集;

关闭的时候是倒着关闭的:ResultSet结果集→PreparedStatement预处理→Connection连接;

这也复合一定的逻辑.

                                                                               总结:
 

jdbc操作步骤总结如下:
1、 加载数据库驱动

2、 创建并获取数据库链接

3、 创建jdbc statement对象

4、 设置sql语句

5、 设置sql语句中的参数(使用preparedStatement)

6、 通过statement执行sql并获取结果

7、 对sql执行结果进行解析处理

8、 释放资源(resultSet、preparedstatement、connection)

jdbc问题总结如下:

1、 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。

2、 Sql语句写在代码中造成代码不易维护,实际应用sql变化的可能较大,sql变动需要改变java代码。

3、 向sql语句传参数麻烦,因为sql语句的where条件不一定,可能多也可能少,占位符需要和参数一一对应。

4、 对结果集解析麻烦,sql变化导致解析代码变化,且解析前需要遍历,如果能将数据库记录封装成pojo对象解析比较方便。
--------------------- 
jdbc工具类

package com.atshulin.login.utils;
/**
 * 连接的工具类
 */

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;

public class ConnectionUtils {
	
	private static String driver = null; 
	private static String url = null ;
	private static String username = null ;
	private static String password = null ;
	private static Properties props = new Properties();
	
	//ThreadLocal :保证一个线程中只能有一个连接. 
	
	private static ThreadLocal<Connection > tl = new ThreadLocal<>();
	
	/**
	 * 静态的代码块读取db.properties
	 */
	static {
		try {
			//类加载器读取文件
			InputStream in =
					ConnectionUtils.class.getClassLoader().getResourceAsStream("db.properties");
			props.load(in);
			
			driver =props.getProperty("jdbc.driver");
			url = props.getProperty("jdbc.url");
			username= props.getProperty("jdbc.username");
			password = props.getProperty("jdbc.password");
			
			Class.forName(driver);
		} catch (Exception e) {
			e.printStackTrace();
		}
		
	}
	
	
	/**
	 * 获取连接的方法
	 */
	
	public static  Connection  getConn()  throws Exception{
		//先尝试从tl中获取
		Connection conn = tl.get();
		if(conn == null ) {
			conn = DriverManager.getConnection(url, username, password);
			tl.set(conn);
		}
		return conn ;
	}
	
	
	/**
	 * 关闭连接的方法
	 */
	public static void closeConn()  throws Exception{
		//先尝试从tl中获取
		
		Connection conn = tl.get();
		
		if(conn != null ) {
			conn.close();
		}
		
		tl.set(null);
	}
	
	public static void main(String[] args) throws Exception {
		Connection conn = getConn();
		
		closeConn();
		
		Connection conn2 = getConn();
		
		System.out.println(conn == conn2);
	}
	
	
}

自己的登陆用例:

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">


    <!--配置LoginServlet:配置LoginServlet与处理请求的映射-->

    <servlet>

         <servlet-name>loginServlet</servlet-name>

         <servlet-class>com.atshulin.login.servlet.LoginServlet</servlet-class>

    </servlet>

    <servlet-mapping>
        <servlet-name>loginServlet</servlet-name>

        <!--客户端登陆请求:http://localhost:8080/-->
        <url-pattern>/login</url-pattern>
    </servlet-mapping>

</web-app>

登陆jsp:

<%--
  Created by IntelliJ IDEA.
  User: ASUS
  Date: 2018/12/19
  Time: 19:56
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>

    <meta charset="UTF-8">

    <title>登陆</title>
    <!--引入外部的样式文件-->
    <link rel="stylesheet" type="text/css" href="mystyle.css">
    <style>

        body{


            background-color: pink;
        }


    </style>
</head>

<!--<body bgcolor = "pink">-->
<body>
       <h1>欢迎登陆</h1>
       <!--action请求地址-->
       <form action="login"  method="post">
           用户名称:<input type="text" name="username"/>
           <br/>
           用户密码:<input type="password" name="password"/>
           <br/>
           <input type="submit" value="login">
       </form>
</body>

</html>
LoginServlet:
package com.atshulin.login.servlet;

import com.atshulin.login.bean.User;
import com.atshulin.login.dao.UserDao;
import com.atshulin.login.dao.UserDaoImp;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

/**
 * 在service方法中调用的具体的doGet或者是doPost
 */
public class LoginServlet extends HttpServlet {


    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doPost(req,resp);
    }


    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //登陆功能
        System.out.println("登陆请求过来.....");

        //获取到用户的登录名和密码进行登陆业务的处理
        /**
         * HttpServletRequest :请求对象,servlet容器会在请求到达后,创建出一个request的对象
         * 将http请求相关的信息全部封装到该对象中
         */

         req.setCharacterEncoding("utf-8");

        //获取用户名
        String username = req.getParameter("username");
        //获取密码
        String password = req.getParameter("password");

        System.out.println(username + ","+ password);

        resp.setContentType("text/html;charset=utf-8");  //返回数据的格式

        //通过响应对象HttpServletResponse给客户端响应数据
        PrintWriter out = resp.getWriter();


        UserDao userDao= new UserDaoImp();

        User user  = userDao.getUserByUsernameAndPassword(username, password);

        if (user == null){
            //登陆失败
            out.println("<h1><font color = 'red'>登陆失败</font></h1>");
        }else {

            //登陆成功
            out.println("<h1><font color = 'red'>登陆成功</font></h1>");
        }

    }
}

实体User

package com.atshulin.login.bean;

public class User {

     private Integer id;
     private String username;
     private String password;


    public Integer getId() {
        return id;
    }

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

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }

}

 Dao:

package com.atshulin.login.dao;

import com.atshulin.login.bean.User;

public interface UserDao {

    public User getUserByUsernameAndPassword(String username,String password);

}
package com.atshulin.login.dao;

import com.atshulin.login.bean.User;
import com.atshulin.login.utils.ConnectionUtils;

import java.sql.*;

public class UserDaoImp implements UserDao {
    @Override
    public User getUserByUsernameAndPassword(String username, String password){

        User u = null;
        Connection connection = null;
        PreparedStatement ps = null;
        //jdbc:获取连接 编写sql 预编译sql 设置参数  执行sql  封装结果   关闭连接

        try {
            //获取连接
           /* Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/bigdata";
            String user = "root";
            String pawd = "shujuelin321";*/
            connection = ConnectionUtils.getConn();

            //编写sql
            String sql = "select id,username,password from tb1_user where username = ? and password = ? ";
            //预编译sql
            ps = connection.prepareStatement(sql);
            //设置参数
            ps.setString(1, username);
            ps.setString(2, password);
            //执行sql
            ResultSet rs = ps.executeQuery();
            //封装结果
            if (rs.next()) {

                u = new User();
                u.setId(rs.getInt("id"));
                u.setUsername(rs.getString("username"));
                u.setPassword(rs.getString("password"));
            }


        } catch (Exception e) {

            e.printStackTrace();
        } finally {

            try {
                ConnectionUtils.closeConn();
            } catch (Exception e) {
                e.printStackTrace();
            }

        }
        return u;
    }

}

猜你喜欢

转载自blog.csdn.net/shujuelin/article/details/85145587