一、第一个JDBC程序
初始化数据库数据
eclipse中导入mysql数据驱动
实现JDBC的基本操作
1、注册驱动
2、创建连接
3、得到执行sql语句的Statement对象
4、执行sql语句,并返回结果
5、处理结果
package demo01;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
/**
* JDBC的四个核心对象:
* DriverManager :注册驱动
* Connection :创建于数据库的连接
* Statement :操作数据库sql语句的对象
* ResultSet :结果集或一张虚拟表
*/
public class demo01 {
/**
实现JDBC的操作
* @throws SQLException
*/
public static void main(String[] args) throws SQLException {
/**1注册驱动*/
DriverManager.registerDriver(new com.mysql.jdbc.Driver());
/**2创建连接*/
String url = "jdbc:mysql://localhost:3306/test1"; //test1是要进行连接的数据库
String user = "root"; //数据库用户名
String password = "123456"; //数据库用户密码
Connection conn = DriverManager.getConnection(url, user, password);
/**3得到执行sql语句的Statement对象*/
Statement statement = conn.createStatement();
String sql = "SELECT * FROM user;"; //查询数据库test1中的user表
/**4执行sql语句 并且返回结果*/
ResultSet res = statement.executeQuery(sql);
/**5处理结果*/
while(res.next()) {
//类似于集合中的迭代器遍历 通过列的索引来取
System.out.print(res.getObject(1) + " "); //ID
System.out.print(res.getObject(2) + " "); //name
System.out.print(res.getObject(3) + " "); //password
System.out.print(res.getObject(4) + " "); //email
System.out.print(res.getObject(5)); //brithday
System.out.println();
}
/*
* 控制台输出
* 1 zhangsan 123456 zs@sina.com 1980-12-04
2 lisi 123456 lisi@sina.com 1981-12-04
3 wangwu 123456 wangwu@sina.com 1979-12-04
*/
//6关闭资源
res.close(); //关闭结果集
statement.close();
conn.close(); //关闭连接
}
}
二、JDBC常用的类和接口
2.1 注册驱动 (DriverMnager类 注册驱动和创建连接)
2.2 与数据库建立连接 (Connection接口)
//第一种连接方法
String url = "jdbc:mysql://localhost:3306/test1"; //test1是要进行连接的数据库
String user = "root"; //数据库用户名
String password = "123456"; //数据库用户密码
Connection conn = DriverManager.getConnection(url, user, password);
//第二种连接方法 getConnection(String url, Properties info);
Properties info = new Properties();
info.setProperty("user", "root"); //类似于键值对
info.setProperty("password","123456");
Connection conn = DriverManager.getConnection(url, info);
2.3 得到执行sql语句的Statement对象 (Statement接口)
statement.executeQuery(String sql) | 根据查询语句返回结果集。只能执行select语句 |
statement.executeUpdate(String sql) | 根据执行的DML(insert update delete)语句,返回受影响的行数 |
statement.execute(String sql) | 此方法可以执行任意sql语句。 |
Statement statement = conn.createStatement();
String sql = "SELECT * FROM user;"; //查询数据库test1中的user表
/**4执行sql语句 并且返回结果*/
ResultSet res = statement.executeQuery(sql);
2.4 执行sql语句 并且返回结果(ResultSet接口)
res.getObject(int columnIndex); 根据序号取值,索引从1开始
res.getObject(String ColomnName); 根据列名取值。
ResultSet res = statement.executeQuery(sql);
/**5处理结果*/
while(res.next()) {
//类似于集合中的迭代器遍历 通过列的索引来取
System.out.print(res.getObject(1) + " "); //ID
System.out.print(res.getObject(2) + " "); //name
System.out.print(res.getObject(3) + " "); //password
System.out.print(res.getObject(4) + " "); //email
System.out.print(res.getObject(5)); //brithday
System.out.println();
//类似于集合中的迭代器遍历 通过列的名字来取
System.out.print(res.getObject("id"));
System.out.print(res.getObject("name")); //name
System.out.print(res.getObject("password")); //password
System.out.print(res.getObject("email")); //email
System.out.print(res.getObject("birthday")); //birthday
System.out.println();
}
/*
* 控制台输出
* 1 zhangsan 123456 zs@sina.com 1980-12-04
2 lisi 123456 lisi@sina.com 1981-12-04
3 wangwu 123456 wangwu@sina.com 1979-12-04
*/
java与mysql中数据类型的关系
byte —— tityint short —— smallint int —— int
long —— bigint float —— float double —— double
String —— char、 varchar Date —— date
可移动游标的方法(res为ResultSet的对象)
Res.next() | 将光标从当前位置向前移一行。 |
Res.previous() | 将光标移动到此 ResultSet 对象的上一行 |
Res .absolute(int row) | 参数是要输除第几行的数据,1就是第一行的数据 |
Res. afterLast() | 将光标移动到表的末尾,正好位于最后一行之后(此时没有数据) |
Res.beforeFirst() | 将光标移动到表的开头,正好位于第一行之前(此时没有数据) |
三、JDBC的增删改查操作(CURD)
数据库test1
3.1 抽取工具类(封装思想)
demo01
package demo02;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;
import com.xitiba.utils.DBUtils;
/**
封装思想
将JDBC基本操作封装到一个工具类中
*/
public class demo01 {
/**
实现JDBC的操作
* @throws SQLException
*/
public static void main(String[] args) throws SQLException {
Connection conn = null;
ResultSet res = null;
Statement statement = null;
try {
/**1注册驱动*/
//DBUtils类中已经实现
/**2创建连接*/
conn = DBUtils.getConnection();
/**3得到执行sql语句的Statement对象*/
statement = conn.createStatement();
String sql = "SELECT * FROM user;"; //查询数据库test1中的user表
/**4执行sql语句 并且返回结果*/
res = statement.executeQuery(sql);
/**5处理结果*/
while(res.next()) {
//类似于集合中的迭代器遍历 通过列的索引来取
System.out.print(res.getObject(1) + " "); //ID
System.out.print(res.getObject(2) + " "); //name
System.out.print(res.getObject(3) + " "); //password
System.out.print(res.getObject(4) + " "); //email
System.out.print(res.getObject(5)); //brithday
System.out.println();
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace(); //打印错误信息
}finally {
DBUtils.close(conn, res, statement);
}
}
}
DBUtils
package com.xitiba.utils;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
//数据库工具类
public class DBUtils {
private static String url = "jdbc:mysql://localhost:3306/test1";//test1是要进行连接的数据库
private static String user = "root"; //数据库用户名
private static String password = "123456";//数据库用户密码
private static String driverClass = "com.mysql.jdbc.Driver"; //驱动
static {
//注册驱动
try {
Class.forName(driverClass);
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
/*
* 返回一个数据库连接
* 抛出SQLException异常
*/
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(url, user, password);
}
/*
* 关闭资源类
*/
public static void close(Connection conn,ResultSet res,Statement statement) throws SQLException {
res.close(); //关闭结果集
statement.close();
conn.close(); //关闭连接
}
}
3.2 插入数据
package test;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import com.xitiba.utils.DBUtils;
//插入操作
public class test01 {
public static void main(String[] args) throws SQLException {
Connection conn = null; //创建连接
PreparedStatement stmt = null; //预处理 PreparedStatement为Statement的子类
String sql = "INSERT INTO user(id,name,password,email,birthday) VALUES(?,?,?,?,?)"; //?代表占位符 表中有几个字段就写几个?
try {
conn = DBUtils.getConnection(); //注册驱动
stmt = conn.prepareStatement(sql); //创建预处理
//设置参数 第一个参数为第几个占位符的索引 第二个为数据
stmt.setInt(1, 6);
stmt.setString(2, "张三");
stmt.setString(3, "777");
stmt.setString(4, "777@163.com");
//数据库中setDate的日期类型是java中的java.sql.Date,不是java.util.Date
//System.currentTimeMillis() 获取当前的毫秒数
stmt.setDate(5, new java.sql.Date(System.currentTimeMillis()));
int row = stmt.executeUpdate(); //执行插入操作
System.out.println("影响的行数:" + row);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally {
DBUtils.close(conn, stmt, null);
}
}
}
3.3 更改数据
package test;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import com.xitiba.utils.DBUtils;
//更改zhangsan的数据
public class test02 {
public static void main(String[] args) throws SQLException {
Connection conn = null; //创建连接
PreparedStatement stmt = null; //预处理 PreparedStatement为Statement的子类
String sql = "UPDATE user SET password = ? , email = ? WHERE id = ?"; //?代表占位符 表中有几个字段就写几个?
try {
conn = DBUtils.getConnection(); //注册驱动
stmt = conn.prepareStatement(sql); //创建预处理
//设置参数
stmt.setString(1,"654324");
stmt.setString(2, "lily@qq.com");
stmt.setInt(3,5);
int row = stmt.executeUpdate(); //执行更改
System.out.println("影响的行数:" + row);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally {
DBUtils.close(conn, stmt, null);
}
}
}
3.4 删除数据
package test;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import com.xitiba.utils.DBUtils;
//删除数据操作
public class test03 {
public static void main(String[] args) throws SQLException {
Connection conn = null; //创建连接
PreparedStatement stmt = null; //预处理 PreparedStatement为Statement的子类
String sql = "delete from user WHERE id = ?"; //?代表占位符 表中有几个字段就写几个?
try {
conn = DBUtils.getConnection(); //注册驱动
stmt = conn.prepareStatement(sql); //创建预处理
//设置参数
stmt.setInt(1,6);
int row = stmt.executeUpdate(); //执行更改
System.out.println("影响的行数:" + row);
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
}finally {
DBUtils.close(conn, stmt, null);
}
}
}