JDBC第一课
1、数据库驱动
SUN公司为统一对数据库的操作,定义了一套Java操作数据库的规范,称之为JDBC。
2、JDBC简介
JDBC全称为:Java Data Base Connectivity(java数据库连接),它主要由接口组成。
组成JDBC的2个包:java.sql和javax.sql
开发JDBC应用需要以上2个包的支持外,还需要导入相应JDBC的数据库实现(即数据库驱动)。
3、数据库驱动:
1.在项目中新建一个文件夹,将驱动放入
2.右击放入的驱动选择 build path进行搭建路径,然后选择添加至构建路径,就会出现引用库文件
4、编写第一个JDBC程序步骤:
1)搭建实验环境:
1、在mysql中创建一个库,并创建表和插入表的数据。
2、新建一个Java工程,并导入数据驱动。
2)加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
Stringurl="jdbc:mysql://localhost:3306/jdbcdb";
1.Class.forName(“com.mysql.jdbc.Driver”);
.建议使用,不会导致驱动对象在内存中重复出现,并且采用此种方式,程序仅仅只需要一个字符串,不需要import驱动的API,这样可使程序不依赖具体的驱动,使程序的灵活性更高。
2.DriverManager. registerDriver(Driver driver)
不建议使用,因为查看Driver的源代码可以看到,如果采用此种方式,会导致驱动程序注册两次,也就是在内存中会有两个Driver对象。
3. URL用于标识数据库的位置,程序员通过URL地址告诉JDBC程序连接哪个数据库
URL的写法为:jdbc:mysql:[]//localhost:3306/test ?参数名:参数值
常用数据库URL地址的写法:
1.Oracle写法:jdbc:oracle:thin:@localhost:1521:sid
2.SqlServer—jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=sid
3.MySql—jdbc:mysql://localhost:3306/sid
Mysql的url地址的简写形式:jdbc:mysql:///sid
常用属性:useUnicode=true&characterEncoding=UTF-
3)建立连接(Connection)
Connection con=DriverManager.getConnection(url(驱动),user(用户),password(密码));
Connection:用于代表数据库的链接,是数据库编程中最重要的一个对象,客户端与数据库所有交互都是通过connection对象完成的。
常用方法:
1.createStatement():创建向数据库发送sql的statement对象。
2.prepareStatement(sql):创建向数据库发送预编译sql的PrepareSatement对象。
3.prepareCall(sql):创建执行存储过程的callableStatement对象。
4.setAutoCommit(boolean autoCommit):设置事务是否自动提交。
5.commit():在链接上提交事务。
6.rollback():在此链接上回滚事务。
4)创建向数据库发送SQL语句的Statement对象
Statement st = con.createStatement();
Statement:对象用于向数据库发送SQL语句
常用方法:
1、execute(String sql):用于向数据库发送任意sql语句
2、executeQuery(String sql):只能向数据发送查询语句。
3、executeUpdate(String sql):只能向数据库发送insert、update或delete语句
4、addBatch(String sql):把多条sql语句放到一个批处理中。
5、executeBatch():向数据库发送一批sql语句执行。
5)定义一个sql语句
String sql=”selectid,name,password,email,birthday from users”
6)执行
ResultSet rs =st.excuteQuery(sql);
ResultSet:用于代表Sql语句的执行结果。
Resultset封装执行结果时,采用的类似于表格的方式。
ResultSet 对象维护了一个指向表格数据行的游标,初始的时候,游标在第一行之前,调用ResultSet.next()方法,可以使游标指向具体的数据行,进行调用方法获取该行的数据。
方法:
1.获取任意类型的数据
如: getObject(int index)
getObject(string columnName)
2.获取指定类型的数据
如:
getString(int index)
getString(String columnName)
3.滚动的方法:
next():移动到下一行
Previous():移动到前一行
absolute(int row):移动到指定行
beforeFirst():移动resultSet的最前面。
afterLast() :移动到resultSet的最后面。
7)遍历结果集,打印到命令行窗口
while(rs.next())
{
System.out.println(rs.getInt("id"));
……
}
8)断开与数据库的连接,并释放相关资源
程序运行完后,切记要释放程序在运行过程中,创建的那些与数据库进行交互的对象,这些对象通常是ResultSet,Statement和Connection对象。
特别是Connection对象,它是非常稀有的资源,用完后必须马上释放,如果Connection不能及时、正确的关闭,极易导致系统宕机。Connection的使用原则是尽量晚创建,尽量早的释放。
为确保资源释放代码能运行,资源释放代码也一定要放在finally语句中。
Finally{
if(rs!=null){
try {
rs.close();
} catch(SQLException e) {
// TODOAuto-generated catch block
e.printStackTrace();
}
}......
}
常用数据类型转换表
SQL类型 |
Jdbc对应方法 |
返回类型 |
BIT |
getBoolean() |
Boolean |
TINYINT |
getByte() |
Byte |
SMALLINT |
getShort() |
Short |
Int |
getInt() |
Int |
BIGINT |
getLong() |
Long |
CHAR,VARCHAR,LONGVARCHAR |
getString() |
String |
Text(clob) Blob |
getClob getBlob() |
Clob Blob |
DATE |
getDate() |
java.sql.Date |
TIME |
getTime() |
java.sql.Time |
TIMESTAMP |
getTimestamp() |
java.sql.Timestamp |
使用JDBC对数据库进行CRUD(增删查改)
用例子进行说明:
在属性文件中db.properties中:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbcdb
username=root
password=root
DBManager中:
package com.hbsi.util;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
public class DBManager {
/**
* @param args
*/
staticString driver;
staticString url;
staticString username;
staticString password;
//读取文件
static//静态代码块,只要一加载类就调用静态代码块,只加载一次
{
//1.通过getClassLoader()类加载器获得对象
//getClassLoader()的getResource()方法,获取源,将源当成流,传字符串(配置文件的名字)
//整个返回值是‘输入流’,InputeStream流
InputStreamin=DBManager.class.getClassLoader().getResourceAsStream("db.properties");
//2.产生一个Properties类型的对象,properties类代表一个持久属性集
Propertiespro=new Properties();
//3.Load()方法,从输入流中读取属性列表
try{
//4.把属性列表加载到内存里
pro.load(in);
}catch (IOException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
//5.getProperty()传一个定义的属性进去
driver= pro.getProperty("driver");
url=pro.getProperty("url");
username=pro.getProperty("username");
password=pro.getProperty("password");
}
//获取连接对象方法
publicstatic Connection getConnection()
{
Connectioncon=null;
//1.加载驱动
try{
Class.forName(driver);
try{
//2.创建连接
con= DriverManager.getConnection(url,username,password);
}catch (SQLException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}catch (ClassNotFoundException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
returncon;
}
//释放的方法
publicstatic void closeDB(Connection con, Statement st, ResultSet rs)
{
if(rs!=null){
try{
rs.close();
}catch (SQLException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
if(st!=null){
try{
st.close();
}catch (SQLException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
if(con!=null){
try{
con.close();
}catch (SQLException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
}
}
publicstatic void main(String[] args) {
//TODO Auto-generated method stub
getConnection();
}
publicstatic void close() {
//TODO Auto-generated method stub
}
}
Demo2中的代码:
package com.hbsi.demo;
import java.sql.Connection;
import java.sql.ResultSet;
importjava.sql.SQLException;
importjava.sql.Statement;
import com.hbsi.util.DBManager;
public class Demo2 {
/**
* @param args
*/
//插入记录
public void insert()
{
Statementst=null;
//1.通过DBManager的getConnection获取连接对象
Connection con = DBManager.getConnection();
try{
//2.创建语句对象
//statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可。
st= con.createStatement();
//定义一个sql语句
Stringsql ="insert into users values(111,'wangli','12345','12345@qq.com','1992-01-01')";
//Statement对象的executeUpdate方法,用于向数据库发送增、删、改的sql语句,executeUpdate执行完后,将会返回一个整数(即增删改语句导致了数据库几行数据发生了变化)
inti=st.executeUpdate(sql);
if(i>0)
{
System.out.println("插入成功!");
}
}catch (SQLException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
//关闭资源
finally
{
DBManager.closeDB(con,st,null);
}
}
//删除记录
publicvoid delete()
{
Statementst=null;
//1.通过DBManager的getConnection获取连接对象
Connection con = DBManager.getConnection();
try{
//2.创建语句对象
//statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可。
st= con.createStatement();
//定义一个sql语句
Stringsql ="delete from users where id=111";
//Statement对象的executeUpdate方法,用于向数据库发送增、删、改的sql语句,executeUpdate执行完后,将会返回一个整数(即增删改语句导致了数据库几行数据发生了变化)
inti=st.executeUpdate(sql);
if(i>0)
{
System.out.println("删除成功!");
}
}catch (SQLException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
//关闭资源
finally
{
DBManager.closeDB(con,st,null);
}
}
//查询记录
publicvoid select()
{
Connectioncon=null;
Statementst=null;
ResultSetrs=null;
//1.通过DBManager的getConnection获取连接对象
con= DBManager.getConnection();
try{
//2.创建语句对象
//statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可。
st= con.createStatement();
//定义一个sql语句
Stringsql ="select id,name,password,email,birthday from users wherename='wangli'";
//Statement对象的executeQuery方法,用于向数据库发送查找的sql语句,该语句返回单个 ResultSet 对象
rs = st.executeQuery(sql);
while(rs.next())
{
System.out.println(rs.getInt("id"));
System.out.println(rs.getString("name"));
System.out.println(rs.getString("password"));
System.out.println(rs.getString("email"));
System.out.println(rs.getDate("birthday"));
}
}catch (SQLException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
//关闭资源
finally
{
DBManager.closeDB(con,st,null);
}
}
//修改记录
publicvoid update()
{
Statementst=null;
//1.通过DBManager的getConnection获取连接对象
Connection con = DBManager.getConnection();
try{
//2.创建语句对象
//statement对象用于向数据库发送SQL语句,想完成对数据库的增删改查,只需要通过这个对象向数据库发送增删改查语句即可。
st= con.createStatement();
//定义一个sql语句
Stringsql ="update users set name= 'lisi' where id=123";
//Statement对象的executeUpdate方法,用于向数据库发送增、删、改的sql语句,executeUpdate执行完后,将会返回一个整数(即增删改语句导致了数据库几行数据发生了变化)
inti=st.executeUpdate(sql);
if(i>0)
{
System.out.println("修改成功!");
}
}catch (SQLException e) {
//TODO Auto-generated catch block
e.printStackTrace();
}
//关闭资源
finally
{
DBManager.closeDB(con,st,null);
}
}
publicstatic void main(String[] args) {
//TODO Auto-generated method stub
Demo2d=new Demo2();
//d.insert();
//d.update();
d.select();
//d.delete();
}
}