通过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;
}
}