1、JDBC本质上是Java操作数据库的一套规范。核心有4个对象。
——DriverManager:用于注册驱动
——Connection:与数据库建立连接
——Statement:用于操作sql语句
——ResultSet:得到的结果集
2、准备工作:jar包放在lib文件夹下,并需要build path一下变成“奶瓶”才能使用(实质上是把里面的类都释放出来与项目关联)。
3、主要步骤
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.mysql.jdbc.Driver;
public class demo {
public static void main(String[] args) throws SQLException {
// 注册驱动
DriverManager.registerDriver(new Driver());
// 获取连接
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/mytest1", "root", "root");
// 得到Statement
Statement stmt = conn.createStatement();
// 执行sql语句并返回结果
ResultSet rs=stmt.executeQuery("select * from fuser;");
// 处理结果集
while(rs.next()){
System.out.println(rs.getObject(1)+"\t"+rs.getObject(2)+"\t"+rs.getObject(3));
}
// 关闭资源
rs.close();
stmt.close();
conn.close();
}
}
4、优化
——注册驱动可以用如下代替,这样免得两次注册和过于数据库的驱动jar包。
Class.forName("com.mysql.jdbc.Driver");
5、测试知识点。写@Test时会提醒导入org.junit.Test
包。测试方法不能有参数和返回值。选中某个测试方法后右击,run as即可。
import junit.framework.Assert;
import org.junit.Test;
public class TestCalc {
@Test
public void test1() {
Calc c=new Calc();
Assert.assertEquals(3, c.add(1, 2));
}
@Test
public void test2() {
Calc c=new Calc();
Assert.assertEquals(3, c.div(10, 3),0.1);
}
}
6、获取连接的其他写法。info用setProperty
方法的好处是参数都是String,如果用put方法的话,参数都是Object对象。
// 其他写法
Properties info=new Properties();
info.setProperty("user", "root");
info.setProperty("password", "root");
Connection conn=DriverManager.getConnection("jdbc:mysql:///mytest1", info);
// 其他写法
Connection conn=DriverManager.getConnection("jdbc:mysql:///mytest1?user=root&password=root");
7、处理获取的结果集,可以通过实体类。
// 定义一个实体类
public class Fuser {
private int id;
private String username;
private int age;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public String toString() {
return "Fuser [age=" + age + ", id=" + id + ", username=" + username
+ "]";
}
}
// 处理结果集
List<Fuser> list = new ArrayList<Fuser>();
Fuser fuser = null;
while(rs.next()){
fuser = new Fuser();
fuser.setId(rs.getInt("id"));
fuser.setUsername(rs.getString("username"));
fuser.setAge(rs.getInt("age"));
list.add(fuser);
}
for (Fuser f : list) {
System.out.println(f);
}
8、继续优化。
- 把驱动注册、连接等操作抽象出来,以及把关闭资源抽象出来,变成类方法,直接调用。
- 使用properties文件,把一些参数定义在这个文件中,然后用ResourceBundle加载取出来。
文件目录如下:
// info.properties文件内容
driverClass=com.mysql.jdbc.Driver
url=jdbc:mysql:///mytest1
user=root
password=root
// DBUtils类
package com.iheima.Util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ResourceBundle;
public class DBUtils {
private static String driverClass;
private static String url;
private static String user;
private static String password;
static{
// 加载属性文件并取得值
ResourceBundle rb=ResourceBundle.getBundle("info");
driverClass=rb.getString("driverClass");
url=rb.getString("url");
user=rb.getString("user");
password=rb.getString("password");
try {
Class.forName(driverClass);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static Connection getConnection() throws Exception {
return DriverManager.getConnection(url, user, password);
}
public static void CloseAll(ResultSet rs,Statement stmt,Connection conn){
if(rs!=null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs=null;
}
if(stmt!=null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
stmt=null;
}
if(conn!=null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
conn=null;
}
}
}
// 实际使用时可以简化为如下代码demo.java
package com.iheima.jdbc;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;
import com.iheima.Util.DBUtils;
import com.iheima.entity.Fuser;
public class demo {
public static void main(String[] args) throws Exception {
Connection conn=null;
Statement stmt=null;
ResultSet rs=null;
try {
conn=DBUtils.getConnection();
stmt=conn.createStatement();
rs=stmt.executeQuery("select * from fuser;");
List<Fuser> list = new ArrayList<Fuser>();
Fuser fuser = null;
while(rs.next()){
// System.out.println(rs.getObject(1)+"\t"+rs.getObject(2)+"\t"+rs.getObject(3));
fuser = new Fuser();
fuser.setId(rs.getInt("id"));
fuser.setUsername(rs.getString("username"));
fuser.setAge(rs.getInt("age"));
list.add(fuser);
}
for (Fuser f : list) {
System.out.println(f);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
// 关闭资源
DBUtils.CloseAll(rs, stmt, conn);
}
}
}
9、优化。SQL注入优化。以后基本使用PreparedStatement了,告别Statement。
import java.sql.PreparedStatement;
PreparedStatement stmt=null;
stmt=conn.prepareStatement("select * from users where username=? and password=?");
stmt.setString(1,uname);
stmt.setString(2, pwd);
rs=stmt.executeQuery();