Mysql jdbc 連接數(shù)據(jù)庫
- statement方式
- 1.注冊驅(qū)動
2.建立連接
3.獲取執(zhí)行者平臺
4.準備sql語句
5.執(zhí)行sql語句,返回結(jié)果集
6.處理結(jié)果集
7.釋放資源
@Test
public void run(){
try {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/studydemo?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true";
String user = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement();
String sql = "select * from student;";
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()){
System.out.println(rs.getString("name")+" -- "+rs.getString("age"));
}
rs.close();
stmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
Oracle
@Test
public void run(){
try {
Class.forName("oracle.jdbc.OracleDriver");
String url = "jdbc:oracle:thin:@localhost:1521:orcl";
String user = "scott";
String password = "1234";
Connection conn = DriverManager.getConnection(url, user, password);
Statement stmt = conn.createStatement();
String sql = "select * from emp";
ResultSet rs = stmt.executeQuery(sql);
while(rs.next()){
System.out.println(rs.getString("ename")+" -- "+rs.getInt("deptno"));
}
rs.close();
stmt.close();
conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
- prepareStatements方式
- 1.注冊驅(qū)動
2.建立連接
3.準備sql語句
4.獲取預處理執(zhí)行者平臺
5.將需要操作的信息設置到ptmt
6.執(zhí)行sql語句
*7.釋放資源
@Test
public void run1(){
try {
Class.forName("com.mysql.cj.jdbc.Driver");
String url = "jdbc:mysql://localhost:3306/studydemo?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true";
String user = "root";
String password = "root";
Connection conn = DriverManager.getConnection(url, user, password);
String sql = "select * from student where id = ?;";
PreparedStatement ptmt = conn.prepareStatement(sql);
ptmt.setString(1, "4");
ResultSet rs = ptmt.executeQuery();
/*int i = ptmt.executeUpdate();
if(i == 1){
System.out.println("查詢成功");
System.out.println(rs.getString("name")+"--"+rs.getShort("age"));
}else{
System.out.println("查詢失敗");
}*/
while(rs.next()){
System.out.println(rs.getString("name")+"--"+rs.getShort("age"));
}
rs.close();
ptmt.close();
conn.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
Oracle
@Test
public void run1() throws Exception{
Class.forName("oracle.jdbc.OracleDriver");
String url = "jdbc:oracle:thin:@localhost:1521:orcl";
String user = "scott";
String password = "1234";
Connection conn = DriverManager.getConnection(url, user, password);
String sql = "select * from emp";
PreparedStatement ptmt = conn.prepareStatement(sql);
ResultSet rs = ptmt.executeQuery();
while(rs.next()){
System.out.println(rs.getInt("empno")+"+"+rs.getString("ename")+"+"+rs.getString("job"));
}
rs.close();
ptmt.close();
conn.close();
}
QueryRunner操作對象
插入數(shù)據(jù)
public void insert() throws SQLException {
// 1. 獲取 Connection 連接對象
// Connection conn = DataBaseUtils.getDataBaseConnection();
// 2. 創(chuàng)建 QueryRunner 操作對象
// 在調(diào)用 QueryRunner() 方法的時候,需要傳入一個 dataSource 數(shù)據(jù)源
// dataSource 數(shù)據(jù)源 到底是一個什么東西?
// 簡單理解,就是需要操作的數(shù)據(jù)庫中的數(shù)據(jù) DataSource
// 在 DataBaseUtils 工具類中,通過 getDataBaseConnection() 已經(jīng)將數(shù)據(jù)庫資源獲取了
QueryRunner qr = new QueryRunner();
// 3. 準備 SQL
String sql = "insert into tb_student(username, password) values (?, ?)";
// 4. 給占位符進行賦值
Object[] params = { "hello", 123 };
// 5. 執(zhí)行操作
int i = qr.execute(conn, sql, params);
// 也可以使用 update() 方法進行操作,update() 方法可以同時操作 insert、update、delete
// int i = qr.update(conn, sql, params);
System.out.println(i);
// 5. 釋放資源
DbUtils.close(conn);
}
更新數(shù)據(jù)
public void update() throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "update tb_student set username = ?, password = ? where id = ?";
Object[] params = { "溫老板", 250, 3};
int i = qr.execute(conn, sql, params);
System.out.println(i);
// 5. 釋放資源
DbUtils.close(conn);
}
刪除數(shù)據(jù)
public void delete() throws SQLException {
QueryRunner qr = new QueryRunner();
String sql = "delete from tb_student where id = ?";
int i = qr.execute(conn, sql, 5);
DbUtils.close(conn);
}
DateBaseUtils工具類
public class DataBaseUtils {
public DataBaseUtils(){
super();
}
private static Connection conn;
// 如果將注冊和獲取連接對象放到一個方法中的話,其實不好,因為想要用到它們的時候必須要先調(diào)用方法才行。
// 而每次調(diào)用方法,都要重新注冊一次,獲取一次新的連接對象,對性能消耗太大
// 疑問:能不能只要去注冊一次,只要有一個連接對象就可以?
static {
try {
// 1. 注冊驅(qū)動(老司機)
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 獲取連接對象
conn = DriverManager.getConnection(
"jdbc:mysql://localhost:3306/studydemo?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true ",
"root", "root");
} catch (Exception e) {
e.printStackTrace();
}
}
// 1. 獲取數(shù)據(jù)庫連接
public static Connection getDataBaseConnection(){
return conn;
}
// 2. 關閉資源
public static void closeResource(Connection conn , Statement stmt, ResultSet rs){
// 注意,在關閉之前,要判斷所操作的資源不能是 null,否則報 NullPointerException 異常
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void closeResource(Connection conn , Statement stmt){
if(stmt != null){
try {
stmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
public static void closeResource(Connection conn){
if(conn != null){
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
commons.dbutils.QueryRunner query方法中RequestSetHandler 參數(shù)對應的返回類型:
AbstractListHandler -- 返回多行List的抽象類
ArrayHandler -- 返回一行的Object[]
ArrayListHandler -- 返回List,每行是Object[]
BeanHandler -- 返回第一個Bean對象
BeanListHandler -- 返回List,每行是Bean
ColumnListHandler -- 返回一列的List
KeyedHandler -- 返回Map,具體見代碼
MapHandler -- 返回單個Map
MapListHandler -- 返回List,每行是Map
ScalarHandler -- 返回列的頭一個值
apache.commons.dbutils.QueryRunner.query方法的handler參數(shù)
第一次用apache.commons.dbutils.QueryRunner訪問數(shù)據(jù)庫的人會有一個疑問..
String url = "jdbc:mysql://localhost:3306/test";
Connection con = DriverManager.getConnection(url, "root", "pwd");
String sql = "select * from myTable";
QueryRunner qr = new QueryRunner();
qr.query(con, sql, handler); //con是數(shù)據(jù)庫連接, sql是查詢語句, handler是什么?
QueryRunner.query方法的返回值是一個Object對象,該Object對象保存著從數(shù)據(jù)庫獲取的數(shù)據(jù),
它的類型(可顯式轉(zhuǎn)換的類型)是由調(diào)用query方法時的handler參數(shù)決定的.
ResultSetHandler handler = new ArrayHandler();
Object obj = qr.query(con, sql, handler);
Object[] arr = (Object[])obj;
ResultSetHandler handler = new ArrayListHandler();
Object obj = qr.query(con, sql, handler);
List list = (List)obj;
也就是說,保存數(shù)據(jù)的Object對象的顯式轉(zhuǎn)換類型是由handler參數(shù)決定的.