JDBC的基本用法

JDBC(Java Database Connection)是Java提供的数据库连接标准,具体的标准实现由各个数据库厂商提供。

下面以MySQL为例来简单演示JDBC接口的基本用法。

JDBC连接数据库的基本步骤如下:

1.加载要连接的数据库驱动,运用了反射机制。

加载MySQL驱动的代码为:Class.forName("com.mysql.jdbc.Driver");

2.通过DriverManager来获取与要连接的数据库的一个连接。

代码格式为:DriverManager.getConnection(c, "root", "1234");

其中字符串c为"jdbc:mysql://localhost:3306/databaseName?useUnicode=true&characterEncoding=utf8";

后面的字符串指定有可能对解决中文乱码问题有帮助,如果数据库默认编码支持中文也可以不设置。

以上两个步骤完成后就完成了数据库的连接,如果想要进一步对数据库操作,要根据不同的应用情景来实现。

1)通过Statement来获取并执行SQL语句。

缺点:容易造成SQL注入,对数据库造成安全隐患。但是在执行SQL批处理时可以很方便的使用。

下面代码可以体现其用法。

package com.wxisme.jdbc01;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
 * 连接MySQL基本流程
 * @author wxisme
 *
 */
public class Demo02 {

	public static void main(String[] args) {
		Connection con = null;
		Statement stmt = null;
		ResultSet rs = null;
		try {
			//先加载数据库驱动
			Class.forName("com.mysql.jdbc.Driver");
			//通过驱动管理来建立连接
			String c = "jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf8";
			con = DriverManager.getConnection(c, "root", "1234");
			//创建statement
			String sql = "select * from student where b=‘张三‘";
			stmt = con.createStatement();
			//创建结果集  不能预编译SQL  只能在执行时传入SQL
			rs = stmt.executeQuery(sql);
			//next()指针指向下一条记录,如果有返回true,否则返回false
			while(rs.next()) {
				for(int i=1; i<10; i++) {
					//getString()可以传入字段名,也可以传入字段的Index
					System.out.print(rs.getString(i)+"    ");
				}
				System.out.println();
			}

		} catch (ClassNotFoundException | SQLException e) {
			e.printStackTrace();
		}finally {

			try {
				con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}

			try {
				stmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
            try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

	}

}

2)通过prepareStatement预编译SQL,防止SQL注入。

优点:可以防止SQL注入并预编译SQL可以提高效率,可以使用?占位符,写SQL语句时不用拼字符串,不容易出错。但是在批量处理时不方便使用。

public class Demo01 {

	public static void main(String[] args) {
		Connection con = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;
		try {
			//先加载数据库驱动
			Class.forName("com.mysql.jdbc.Driver");
			//通过驱动管理来建立连接
			String c = "jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf8";
			con = DriverManager.getConnection(c, "root", "1234");
			//创建statement
			String sql = "select * from student where b=?";
			stmt = con.prepareStatement(sql);

			stmt.setString(1, "张三");

			//创建结果集
			rs = stmt.executeQuery();

			while(rs.next()) {
				for(int i=1; i<10; i++) {
					System.out.print(rs.getString(i)+"    ");
				}
				System.out.println();
			}

		} catch (ClassNotFoundException | SQLException e) {
			e.printStackTrace();
		}finally {

			try {
				con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}

			try {
				stmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
            try {
				rs.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

	}

}

3)使用批处理一次提交执行批量SQL语句。

public class Demo03 {

	public static void main(String[] args) {
		Connection con = null;
		Statement stmt = null;
		try {
			//先加载数据库驱动
			Class.forName("com.mysql.jdbc.Driver");
			//通过驱动管理来建立连接
			String c = "jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf8";
			con = DriverManager.getConnection(c, "root", "1234");
			con.setAutoCommit(false);//将连接的事务设为手动提交
			//创建statement
			stmt = con.createStatement();
			for(int i=0; i<900000; i++) {
				String sql = "insert into student (a,b,c) values(‘中文‘,‘刘琦‘,‘2013010‘)";
				stmt.addBatch(sql);
			}
			stmt.executeBatch();
			con.commit();//提交事务
		} catch (ClassNotFoundException | SQLException e) {
			e.printStackTrace();
		}finally {

			try {
				con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}

			try {
				stmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}

	}

}

4)数据库事务的提交和回滚,在默认情况下,数据库事务是自动提交的,但是如果手动提交,在最后调用数据库连接的回滚方法,在一个SQL语句有了错误抛出异常后,其他的SQL语句都不再执行,已经执行的SQL语句回滚到以前的状态,就是如果有异常抛出则数据库中的数据不会发生变化。

package com.wxisme.jdbc01;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.PreparedStatement;
/**
 * 事务的手动提交和回滚
 * @author wxisme
 *
 */
public class Demo04 {

	public static void main(String[] args) {
		Connection con = null;
		PreparedStatement stmt = null;

		try {
			//先加载数据库驱动
			Class.forName("com.mysql.jdbc.Driver");
			//通过驱动管理来建立连接
			String c = "jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf8";
			con = DriverManager.getConnection(c, "root", "1234");
			//创建statement
			con.setAutoCommit(false);//设置为手动提交事务
			String sql = "insert into student (?) values(?)";
			stmt = con.prepareStatement(sql);

			stmt.setString(1, "a");
			stmt.setString(2, "刘琦");
			con.commit();//手动提交事务

		} catch (ClassNotFoundException | SQLException e) {
			e.printStackTrace();
			try {
				con.rollback();//如果出现异常则回滚事务
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
		}finally {

			try {
				con.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}

			try {
				stmt.close();
			} catch (SQLException e) {
				e.printStackTrace();
			}

		}

	}

}

5)对日期的支持,在java.sql包中有Date,Time,Timestamp类来支持时间和日期的处理。

package com.wxisme.jdbc01;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.Random;

/**
 * 时间处理java.sql.Date,Time,Timestamp
 * 插入带有日期和时间戳类型字段的记录
 * @author wxisme
 *
 */
public class Demo05 {
	public static void main(String[] args) {
		Connection conn = null;
		PreparedStatement ps = null;
		try {
			//加载驱动类
			Class.forName("com.mysql.jdbc.Driver");
			String c = "jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf8";
			conn = DriverManager.getConnection(c, "root", "1234");

			for(int i=0;i<1000;i++){

				ps = conn.prepareStatement("insert into student (name,pswd,time,stime) values (?,?,?,?)");
				ps.setObject(1, "流苏款"+i);
				ps.setObject(2, "123456");

				int rand =  100000000+new Random().nextInt(1000000000);

				java.sql.Date date = new java.sql.Date(System.currentTimeMillis()-rand);
				Timestamp stamp = new Timestamp(System.currentTimeMillis()-rand);  //如果需要插入指定日期,可以使用Calendar、DateFormat

				ps.setDate(3, date);
				ps.setTimestamp(4, stamp);
				ps.execute();

			}

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			try {
				if(ps!=null){
					ps.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
			try {
				if(conn!=null){
					conn.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}
package com.wxisme.jdbc01;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;

/**
 * 时间处理java.sql.Date,Time,Timestamp
 * 查找某个时间段的记录
 * @author wxisme
 *
 */

public class Demo06 {

	/**
	 * 将字符串代表的日期转为long数字(格式:yyyy-MM-dd hh:mm:ss)
	 * @param dateStr
	 * @return
	 */
	public static long str2Date(String date) {
		DateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
		try {
			return format.parse(date).getTime();
		} catch (ParseException e) {
			e.printStackTrace();
			return 0;
		}
	}

	public static void main(String[] args) {
		Connection conn = null;
		PreparedStatement ps = null;
		ResultSet rs = null;
		try {
			//加载驱动类
			Class.forName("com.mysql.jdbc.Driver");
			String c = "jdbc:mysql://localhost:3306/student?useUnicode=true&characterEncoding=utf8";
			conn = DriverManager.getConnection(c, "root", "1234");

			ps = conn.prepareStatement("select * from student where stime>? and stime<?  order by stime ");
			Timestamp start = new Timestamp(str2Date("2015-5-1 8:10:20"));
			Timestamp end = new Timestamp(str2Date("2015-5-1  9:9:10"));
			ps.setObject(1, start);
			ps.setObject(2, end);
			rs = ps.executeQuery();
			while(rs.next()){
				System.out.println(rs.getString("name")+"--"+rs.getTime("time")+"--"+rs.getTimestamp("stime"));
			}

		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			try {
				if(ps!=null){
					ps.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
			try {
				if(conn!=null){
					conn.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

总结:JDBC把数据库连接封装的很好,总的步骤是固定的,写几个Demo之后就熟悉了,但是在数据库连接时要注意很多细节问题,代码写的严谨才不会出BUG。

时间: 2024-12-17 22:01:09

JDBC的基本用法的相关文章

JDBC Request的用法

目的:使用JMeter工具中的JDBC Request控件,获取并使用数据库中的数据进行登录 配置:Jmeter + MySQL 步骤: 1. 这里首先需要配置好Jmeter和MySQL 1)将mysql-connector-java.jar包拷贝到<jmeter的安装目录>\lib 文件夹下.这个相当于Jmeter使用MySQL的一个驱动 2)在MySQL中创建好目标数据库.表和数据 2. 打开Jmeter,添加线程组以及JDBC Connection Configuration.其中,配置

SQL学习笔记之数据库专题(四):浅谈JDBC用法

数据库厂商提供的用来操作数据库用的jar包就是数据库驱动.各个厂商如果提供各自的数据库驱动的话会导致开发人员学习成本太高,所以sun公司提供了一套数据库驱动应该遵循的接口规范,这套规范就叫做JDBC,本质上是很多的接口.简而言之,JDBC就是一套操作数据库的接口规范,由于所有的数据库驱动都遵循JDBC规范,我们在学习和使用数据库时只要学习JDBC中的接口就可以了. 组成JDBC的2个包:java.sql,javax.sql,开发JDBC应用需要以上2个包的支持外,还需要导入相应JDBC的数据库实

Spring JDBC详解

<Spring JDBC详解> 本文旨在讲述Spring JDBC模块的用法.Spring JDBC模块是Spring框架的基础模块之一. 作者:chszs,转载需注明.博客主页:http://blog.csdn.net/chszs 一.概述 在Spring JDBC模块中,所有的类可以被分到四个单独的包:1)core即核心包,它包含了JDBC的核心功能.此包内有很多重要的类,包括:JdbcTemplate类.SimpleJdbcInsert类,SimpleJdbcCall类,以及NamedP

数据库和JDBC编程

JDBC是一种数据库连接,它是一种可执行SQL语句的Java API.程序可以通过JDBC API连接到关系型数据库,并使用结构化查询语言来完成对数据库的查询,更新.通过使用JDBC,就可以使用同一种API访问不同的数据库系统,开发人员面向JDBC API编写应用程序,然后根据不同的数据库,安装不同数据库的驱动程序即可.数据库驱动程序是JDBC程序和数据库之间的转换层,数据库驱动程序负责将JDBC调用映射成特定的数据库调用.当需要连接某个特定的数据库时,必须有相应的数据库驱动程序.JDBC驱动的

第十三章.MySQL数据库与JDBC编程(下)

JDBC的典型用法: JDBC4.2常用接口和类简介: DriverManager:用于管理JDBC驱动的服务类,程序中使用该类的主要功能是获取Connection对象,该类包含如下方法: public static synchronized Connection getConnection(String url, String user, String  pass) throws SQLException:该方法获得url对应数据库的连接 Connection:代表数据库连接对象,每个Conn

JDBC操作数据库的三种方式比较

JDBC(java Database Connectivity)java数据库连接,是一种用于执行上sql语句的javaAPI,可以为多种关系型数据库提供统一访问接口.我们项目中经常用到的MySQL.oracle.DB2等关系型数据库均是通过JDBC来访问的,现在主流的ORM框架Hibernate.Mybatis等均是在JDBC的基础上做的进一步封装.优化.一般小型的项目,可以直接用JDBC来访问数据库,简单方便.我在进过几个项目后,总结了三总JDBC的基本用法,对这几种用法做一个总结. 第一种

第13章 MySQL数据库与JDBC编程

13.1 JDBC基础 13.1.1 JDBC简介 13.1.2 JDBC驱动程序 13.2 SQL语法 13.2.1 安装数据库 13.2.2 关系数据库基本概念和MySQL基本命令 13.2.3 SQL语句基础 13.2.4 DDL语言 13.2.5 数据库约束 13.2.6 索引 13.2.7 视图 13.2.8 DML语句语法 13.2.9 单表查询 13.2.10 数据库函数 13.2.11 分组和组函数 13.2.12 多表连接查询 13.2.13 子查询 13.2.14 集合查询

JDBC——CreateStatement和PrepareStatement作用区别

本文主要讲了PrepareStatement和CreateStatement的作用区别,大家可以一起学习!走后端的小伙伴都会必修JDBC,在前段时间作者实训期间,看到老师举例的时候用了CreateStatement(当然老师只是随便举得例子).而本人的个人习惯是用PrepareStatement的,作者之前是很困惑过这两个之间的区别的,在实践之后以及看的一些资料积攒了一些看法,在这里和大家谈一下CreatStatement和PrepareStatement的作用和区别吧.(图为老师的案例) 作用

眼下最好的JSP分页技术

2005-08-24   来源:CSDN  作者:wanchao2001 前言     在使用数据库的过程中,不可避免的须要使用到分页的功能,但是JDBC的规范对此却没有非常好的解决.对于这个需求非常多朋友都有自己的解决方式,比方使用 Vector等集合类先保存取出的数据再分页.但这样的方法的可用性非常差,与JDBC本身的接口全然不同,对不同类型的字段的支持也不好.这里提供了一种与 JDBC兼容性非常好的方案.   JDBC和分页 Sun的JDBC规范的制定,有时非常让人哭笑不得,在JDBC1.