JDBC入门:
JDBC(Java Data Base Connectivity),java数据库连接。
准备:
开发工具:eclipse
数据库: MySQL
jar包:mysql-connector-java-5.1.22-bin.jar
JDBC helloworld,编写流程
- 0 导入jar包(驱动)
- 1 注册驱动
- 2 获得链接
- 3 获得语句执行者
- 4 执行sql语句
- 5 处理结果
- 6 释放资源
Jvav 代码:
package com.my.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class MyJdbcTest {
public static void main(String[] args) throws Exception {
// 1 注册驱动
Class.forName("com.mysql.jdbc.Driver");
// 2 获得链接
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "1234");
// 3 获得语句执行者
Statement st = conn.createStatement();
// 4 执行sql语句
ResultSet rs = st.executeQuery("select * from users");
// 5 处理结果
while (rs.next()) {
String id = rs.getString("id");
String name = rs.getString("name");
int age = rs.getInt("age");
System.out.println(id + " # " + name + " # " + age);
}
// 6 释放资源
rs.close();
st.close();
conn.close();
}
}
结果:
JDBC API详解
-
1 注册驱动
-
接口:java.sql.Driver ,每个驱动程序类必须实现的接口
-
工具类:java.sql.DriverManager ,驱动管理类
-
提供一个static方法:registerDriver(Driver driver) ,注册驱动
-
最终代码:Class.forName(“com.mysql.jdbc.Driver”);
-
2 获得链接
- 接口:java.sql.Connection,与特定数据库的连接
- 获得链接:DriverManger.getConnection(url,user,password)
- user --> 数据库的用户名
- password --> 用户名对应的密码
- mysql url -->
jdbc:mysql://localhost:3306/mydb
- 接口:java.sql.Connection,与特定数据库的连接
-
方法 :
- 获得预处理对象:prepareStatement(String sql)
- 执行数据库存储过程:prepareCall(String sql)
-
3 获得语句执行者
- 接口:java.sql.Statement 获得方式:createStatement()
- 方法:
执行DQL(数据查询语言)语句 :ResultSet executeQuery(sql)
,返回值表示结果集,将所有的查询数据都存放到该对象
执行DML(数据操作语句)语句 :int executeUpdate(sql) ,
返回值表示响应的行数
执行sql语句:boolean execute(sql) 如果返回true,表示执行DQL;如果返回false,表示执行的DML 返回结果为true时,通过getResultSet获得结果集 -
4 处理结果
- 接口:java.sql.ResultSet
- 获得方式:Statement.executeQuery(sql) 详解
1.默认情况结果集指向头
2.当执行结果的next()方法,游标将向下移动一行
3.通过getXxx方法获得需要的数据
方法:
getXxx(字段名称),通过指定的字段名称,获得当前记录的字段的值。 getXxx(字段索引),索引从1开始。通过指定的索引,获得指定索引的字段的值。
4.next() 如果指向的记录,返回true,如果指向头或尾,返回false
如果出现中文乱码,在获得链接时,在url中追加参数:?useUnicode=true&characterEncoding=UTF-8
例如:DriverManager.getConnection(“jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8”, “root”, “1234”);
- sql注入
页面传递的数据,作为了sql语句的一部分。被数据库进行编译。- 预处理对象
接口:java.sql.PreparedStatement
获得方式:Connection.preparedStatement(sql) ,提前提供sql语句将实际参数使用?替换预先编译sql语句,在使用实际参数替换回?,实际参数就不会作为sql语句被编译,只作为具体的参数
- 预处理对象
JDBC 的增上改查:
package com.my.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import org.junit.Test;
public class CRUDTest {
@Test
public void save() throws Exception{
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "1234");
Statement st = conn.createStatement();
int r = st.executeUpdate("insert into users(id,name,age) values('u004','Joe','15')");
System.out.println(r);
st.close();
conn.close();
}
@Test
public void update() throws Exception{
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "1234");
Statement st = conn.createStatement();
int r = st.executeUpdate("update users set age = '21' where id = 'u004' ");
System.out.println(r);
st.close();
conn.close();
}
@Test
public void delete() throws Exception{
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "1234");
Statement st = conn.createStatement();
int r = st.executeUpdate("delete from users where id = 'u004'");
System.out.println(r);
st.close();
conn.close();
}
@Test
public void findById() throws Exception{
Class.forName("com.mysql.jdbc.Driver");
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydb", "root", "1234");
Statement st = conn.createStatement();
ResultSet rs = st.executeQuery("select * from users where id = 'u004'");
//处理结果 -- 通过id查询,没有结果,只有一条记录
if(rs.next()){
String id = rs.getString("id");
String name = rs.getString("name");
int age = rs.getInt("age");
System.out.println(id + " # " + name + " # " + age);
} else {
System.out.println("没有结果");
}
rs.close();
st.close();
conn.close();
}
}
JdbcUtils
将driver, url,username,password基本四项移到配置文件
jdbcinfo.properties:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8
username=root
password=1234
JdbcUtils demo;
package com.my.jdbc;
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 JdbcUtils {
private static Connection conn;
static {
try {
// jdbc 基本4项 : driver url user password
ResourceBundle bundle = ResourceBundle.getBundle("jdbcinfo"); // 文件基本名称
String driver = bundle.getString("driver");
String url = bundle.getString("url");
String user = bundle.getString("username");
String password = bundle.getString("password");
// 1 注册驱动
Class.forName(driver);
// 2 获得链接
conn = DriverManager.getConnection(url, user, password);
} catch (Exception e) {
throw new RuntimeException(e.getMessage(), e);
}
}
public static Connection getConnection() {
return conn;
}
public static void closeResource(Connection conn, Statement st, ResultSet rs) {
try {
if (rs != null) {
rs.close();
}
} catch (SQLException e) {
throw new RuntimeException(e.getMessage(), e);
} finally {
try {
if (st != null) {
st.close();
}
} catch (SQLException e) {
throw new RuntimeException(e.getMessage(), e);
} finally {
try {
if (conn != null) {
conn.close();
}
} catch (SQLException e) {
throw new RuntimeException(e.getMessage(), e);
}
}
}
}
}