JDBC基础

本文介绍了如何在Java中使用JDBC连接MySQL数据库,包括Eclipse导入驱动、建立连接、执行SQL语句(增删改查)以及相关API的使用,如Connection、DriverManager、Statement和PreparedStatement。同时,文章提到了防止SQL注入和资源释放的重要性。
摘要由CSDN通过智能技术生成

1. 概述

JDBC(Java Data Base Connectivity的缩写)是Java程序操作数据库的API,使用JDBC操作数据库,需要数据库厂商提供数据库的驱动程序。

1.1 Eclipse导入mysql驱动包

  1. 下载mysql-connector-java-8.0.22.jar,复制一份到WEB-INF下的lib文件夹中

  2. 项目名上右键选择Build PathConfigure Build Path...,在Module中添加刚才的jar包

  3. 使用时在文件中引入:import java.sql.*<%@page import = "java.sql.*"%>

1.2 JAVA连接数据库

大致分为三步

  1. 注册数据库驱动
    将数据库厂商提供的数据库驱动类注册到JDBC的驱动管理器中
Class.forName("com.mysql.cj.jdbc.Driver");//新版本
//旧版本使用的是Class.forName("com.mysql.jdbc.Driver");
  1. 构建数据库连接URL
    基本格式为JDBC协议+IP地址或域名+端口+数据库名称

注意这里的useSSL=false&serverTimezone=GMT%2B8"是必须的,GMT%2B8代表选择北京东八区,也可以设置为UTC美国时间,useSSL代表是否使用SSL连接

String url = "jdbc:mysql://localhost:3306/database_name?useSSL=false&serverTimezone=GMT%2B8";
String user = "root";
String password = "密码串";
  1. 与数据库建立连接得到Connection
Connection conn = DriverManager.getConnection(url,user,password);
if(Conn != null){
	//连接成功
    Conn.close();
}

这些步骤均需要放在try catch块中,实例如下

<%
try{
    Class.forName("com.mysql.cj.jdbc.Driver");
    String url="jdbc:mysql://localhost:3306/sql_jdbc?useSSL=false&serverTimezone=GMT%2B8";
    Connection conn = DriverManager.getConnection(url,"root","密码串");
    if(conn != null){
        System.out.println("连接成功");
        conn.close();
    }
    else{
        System.out.println("连接失败");
    }
}catch(Exception e){
    System.out.println("出错");
    e.printStackTrace();
}
%>

2. API

2.1 Connection接口

Connection接口位于java.sql包中,是与数据库的连接会话。只有获得该对象,才能访问和操作数据库。

2.2 DriverManager类

DriverManager类作用于用户及驱动程序之间,它是JDBC中的管理层,通过DriverManager类可以管理数据库厂商提供的驱动程序,并建立应用程序与数据库之间的连接。

2.3 Statement接口

Statement接口提供了执行sql语句和获取查询结果的基本方法。

2.4 PreparedStatement接口

继承于Statement接口。

  • 可以使用占位符“?”来代替SQL语句中的参数,然后再对其进行赋值。
  • SQL执行效率更高,且可以避免SQL语句的注入式攻击。

使用占位符的时候注意下标从1开始

占位符的使用和批处理方法如下

 try {
      String sql = "insert into tb_student_batch(id,name,sex,age) values(?,?,?,?)";
      PreparedStatement ps = conn.prepareStatement(sql);
      Random random = new Random();
      for(int i=0;i<10;i++){
          ps.setInt(1, i+1);
          ps.setString(2, "学生"+i);
          ps.setBoolean(3, i%2==0?true:false);
          ps.setInt(4, random.nextInt(5)+10);
          ps.addBatch(); //添加批处理命令
      }
      int[] rows = ps.executeBatch(); //执行批处理操作并返回计数组成的数组
      ps.close();
      conn.close();
} catch (SQLException e) {
    e.printStackTrace();
}

ResultSet接口

使用ResultSet对象接收查询结果集。 ResultSet对象包含了符合SQL语句的所有行,针对Java中的数据类型提供了GetXXX方法,通过这些方法可以获得每一行的数据。除此之外, ResultSet还提供了光标功能。

next方法中,如果当前位置下一行没有行,则此方法返回false,否则返回true ,可以这样获得rs结果集的行数

int tmp = 0;
while (rs.next()) {
    ++tmp;
}

注意光标位置

👆啊我现在对它存疑了,在有效结果的最后一行处调用next返回false,也许没有在最后一行后面加空行,待考证。

3. 操作数据库

3.1 增

插入语句

INSERT INTO table_name ( field1, field2,...fieldN )
                       VALUES
                       ( value1, value2,...valueN );

(1) 注意操作都要放在trycatch块中

(2) 注意insert语句中字符串要加引号QAQ

index.jsp

<form action="MyServlet" method="post">
    <table>
        <tr>
            <td>名</td>
            <td><input type="text" name="u_id"></input></td>
        </tr>
        <tr>
            <td>密码</td>
            <td><input type="text" name="u_pass"></input></td>
        </tr>

        <tr>
            <td>数目</td>
            <td><input type="text" name="u_num"></input></td>
        </tr>

        <tr>
            <td><input type="submit" /></td>
        </tr>

    </table>
</form>

MyServlet.servlet

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 设置编码
    request.setCharacterEncoding("UTF-8");
    response.setCharacterEncoding("UTF-8");
    response.setContentType("text/html");
    PrintWriter out = response.getWriter();//向浏览器发送数据,可以显示在MyServlet的http页面上
    // 设置JavaBean的值
    Bean MyBean = new Bean();
    MyBean.setU_id(request.getParameter("u_id"));
    MyBean.setU_pass(request.getParameter("u_pass"));
    MyBean.setU_num(Integer.parseInt(request.getParameter("u_num")));
    // 建立SQL语句
    String sql = "insert into my_table (u_id,u_pass,u_num) values('" + MyBean.getU_id() + "','" + MyBean.getU_pass()
            + "'," + Integer.toString(MyBean.getU_num()) + ")";
    out.print(sql+"<br>");
    // 更新数据库
    int row = DB.update(sql);
    out.print(row+"<br>");
    out.flush();//这个要有
    out.close();//这个要有
    DB.close();//这个要有
}

DB.java

package com.caut.db;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Statement;

public class DB {

	// 连接数据库
	private static final String DRIVERNAME = "com.mysql.cj.jdbc.Driver";
	private static final String URL = "jdbc:mysql://localhost:3306/sql_jdbc?useSSL=false&serverTimezone=GMT%2B8";
	private static final String USER = "root";
	private static final String PASSWORD = "20011017lh";

	// 操作数据库
	private static Connection conn;
	private static Statement sta;
	private static PreparedStatement psta;
	private static ResultSet rs;
	private static int row = 0;

	// 与数据库建立连接
	public static Connection getConnection() {
		try {
			Class.forName(DRIVERNAME);
			conn = DriverManager.getConnection(URL, USER, PASSWORD);
			if (conn != null) {
				System.out.println("连接成功");
			} else {
				System.out.println("连接失败");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return conn;
	}

	// 释放资源
	public static void close() {
		try {
			if (rs != null)
				rs.close();
			if (sta != null)
				sta.close();
			if (psta != null)
				psta.close();
			if (conn != null)
				conn.close();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// 更新数据库
	public static int update(String sql) {
		try {
			getConnection();
			psta = conn.prepareStatement(sql);
			row = psta.executeUpdate();
			return row;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return 0;
	}

	// 查询数据库
	public static ResultSet query(String sql) {
		try {
			getConnection();
			psta = conn.prepareStatement(sql);
			rs = psta.executeQuery();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return rs;
	}
}

3.2 删

删除语句

DELETE FROM table_name [WHERE Clause]

MyServlet.servlet中的SQL语句改成

String sql = "delete from my_table where u_id='" + MyBean.getU_id() + "' and u_pass='" + MyBean.getU_pass()
				+ "' and u_num=" + MyBean.getU_num();

3.3 改

修改语句

UPDATE table_name SET field1=new_value1, field2=new_value2
[WHERE Clause]

MyServlet.servlet中的SQL语句改成

String sql = "update my_table set u_pass='" + MyBean.getU_pass() + "', u_num=" + MyBean.getU_num()
        + " where u_id='" + MyBean.getU_id() + "'";

3.4 查

查询语句

SELECT column_name,column_name
FROM table_name
[WHERE Clause]
[LIMIT N][ OFFSET M]

DB.java中添加查询方法,注意这里不能提前close了,因为ResultSet关闭之后无法进行操作,也就不能查看查询的数据了

// 查询数据库
public static ResultSet query(String sql) {
    try {
        getConnection();
        psta = conn.prepareStatement(sql);
        rs = psta.executeQuery();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return rs;
}

MyServlet.java中,引入相关包

import java.sql.ResultSet;
import java.sql.SQLException;

查询改为

// 建立SQL语句
String sql = "select * from my_table where u_id='" + MyBean.getU_id() + "'";
System.out.println(sql);
// 查询数据库
ResultSet rs = DB.query(sql);
try {
    while (rs.next()) {
        String now = "u_id = " + rs.getString("u_id") + ", u_pass = " + rs.getString("u_pass") + ", u_num = "
                + rs.getInt("u_num");
        System.out.println(now);
    }
    DB.close();
} catch (SQLException e) {
    e.printStackTrace();
}

在操作进行完之后close,否则会报线程访问的错误

sql语句不区分大小写,如表名MyTable和mytable是一样的

查询结果为空的时候,返回一个空行,即rs.next()返回零

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值