1. JDBC简介:
JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序,同时,JDBC也是个商标名。
JDBC工作原理: JDBC只定义接口,具体实现由各个数据库厂商负责。
程序员使用时只需要调用接口,实际调用的是底层数据库厂商的实现部分。
JDBC访问数据库的工作过程:
加载驱动,建立连接
创建语句对象
执行SQL语句
处理结果集
关闭连接
2.JDBC连接数据库步骤:
- 加载驱动
- 连接数据库
- 使用语句操作数据库
- 关闭数据库连接
鼠标右键项目 -> Build Path ->Configure Build Path -> Add Exteranl JARs...
加载数据库驱动:
mysql驱动名称: com.mysql.jdbc.Driver
加载方式: Class.forName(驱动名称); ctrl+1
4.关闭连接
例:
package jdbc.aiaoyu02sec04驱动加载;
import java.sql.DriverManager;
import java.sql.SQLException;
import com.mysql.jdbc.Connection;
public class Demo1 {
//数据库地址
private static String dbUrl="jdbc:mysql://localhost:3306/db_book";
//用户名
private static String dbuserName="root";
//密码
private static String dbpassword="123456";
//驱动名称
private static String jdbcName="com.mysql.jdbc.Driver";
public static void main(String[] args) {
try {
//加载驱动
Class.forName(jdbcName);
System.out.println("加载驱动成功了呢!");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("加载驱动失败了哦!");
}
Connection con=null;
try {
//获取数据库连接
con=(Connection) DriverManager.getConnection(dbUrl,dbuserName,dbpassword);
System.out.println("获取数据库连接成功!");
System.out.println("操作数据库!");
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
5.Statement接口:
例:
package jdbc.aiaoyu03sec02;
import java.sql.Connection;
import com.mysql.jdbc.Statement;
import util.DbUtil;
public class Demo1 {
public static void main(String[] args)throws Exception {
//定义
DbUtil dbUtil=new DbUtil();
String sql="insert into t_book Values(null,'一只羊','6565','两只羊',1)";
Connection con=dbUtil.getCon();//获取数据连接
Statement stmt=(Statement) con.createStatement();//获取Statment
int result=stmt.executeUpdate(sql);
System.out.println("操作结果"+result+"数据");
stmt.close();//关闭Statement
con.close();//关闭连接
}
}
6.PreparedStatement接口:
package jdbc.aiaoyu04sec02;
import java.sql.Connection;
import com.mysql.jdbc.PreparedStatement;
import jdbc.model.Book;
import util.DbUtil;
public class Demo1 {
private static DbUtil dbUtil=new DbUtil();
/**
* 添加图书
* @param book
* @return
* @throws Exception
*/
private static int addBook(Book book)throws Exception{
Connection con=dbUtil.getCon();//获取连接
String sql="insert into t_book values(null,?,?,?,?)";
PreparedStatement pstmt=(PreparedStatement) con.prepareStatement(sql);
pstmt.setString(1,book.getBookName());//给第一个坑设置值
pstmt.setFloat(2,book.getPrice());//给第二个坑设置值
pstmt.setString(3,book.getAuthou());//给第三个坑设置值
pstmt.setInt(4,book.getBookTypeId());//给第三个坑设置值
int result=pstmt.executeUpdate();
dbUtil.close(pstmt, con);
return result;
}
public static void main(String[] args)throws Exception {
Book book=new Book(13,"Java2", 1, "222", 1);
int result=addBook(book);
if(result==1){
System.out.println("添加成功!");
}else{
System.out.println("添加失败!");
}
}
}
7.Result结果集: 用于返回值,当我们查询数据库时,返回每一行数据.
8.CallableStatement接口:当获得了与数据库的连接后,就可以与数据库进行交互了。 JDBC Statement,CallableStatement和PreparedStatement接口定义了可用于发送SQL或PL/SQL命令,并从数据库接收数据的方法和属性。
例:
package jdbc.aiaoyu07sec02;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.Types;
import util.DbUtil;
public class Demo1 {
private static DbUtil dbUtil=new DbUtil();
/**
* 调用存储过程 (存储过程已经在数据库中写好) 通过id查询bookName
* @param id
* @return
* @throws Exception
*/
private static String getBookNameById(int id)throws Exception{
Connection con=dbUtil.getCon();//获取数据库连接
String sql="{CALL pro_getBookNameById(?,?)}";
CallableStatement cstmt=con.prepareCall(sql);
cstmt.setInt(1, id);//设置第一个值
cstmt.registerOutParameter(2, Types.VARCHAR);//设置返回类型
cstmt.execute();
String bookName=cstmt.getString("bN");//获取返回值
dbUtil.close(cstmt, con);
return bookName;
}
public static void main(String[] args)throws Exception{
System.out.println("图书名称:"+getBookNameById(13));
}
}
9.
使用DatabaseMetaData获取数据库基本信息:
例:
package jdbc.aiaoyu08sec01;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import util.DbUtil;
public class Demo1 {
public static void main(String[] args) throws Exception{
DbUtil dbUtil=new DbUtil();
Connection con=dbUtil.getCon();//获取数据库连接
DatabaseMetaData dmd=con.getMetaData();//获取元素
System.out.println("数据库名称:"+dmd.getDatabaseProductName());
System.out.println("数据库版本:"+dmd.getDriverMajorVersion()+"."+dmd.getDriverMinorVersion());
}
}
使用ResultSetMetaData获取ResultSet对象中的信息:
例:
package jdbc.aiaoyu08sec02;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSetMetaData;
import util.DbUtil;
public class Demo2 {
public static void main(String[] args) throws Exception{
DbUtil dbUtil = new DbUtil();
Connection con=dbUtil.getCon();//获取数据库连接
String sql="select * from t_book";
PreparedStatement pstmt=con.prepareStatement(sql);
ResultSetMetaData rsmd = pstmt.getMetaData();
int num=rsmd.getColumnCount();//获取元素列的总数
System.out.println("共有"+num+"列");
for(int i=1;i<=num;i++){ //遍历
System.out.println(rsmd.getColumnName(i)+","+rsmd.getColumnType(i));
}
}
}
10.事务:
事务的概念:
Mysql对事务的支持:
例:
package jdbc.aiaoyu09sec04转账;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Savepoint;
import util.DbUtil;
public class Demo1 {
private static DbUtil dbUtil=new DbUtil();
/**
* 转出
* @param con
* @param accountName
* @param account
* @throws Exception
*/
private static void outCount(Connection con,String accountName,int account)throws Exception{
String sql="update t_account set accountBalance=accountBalance-? where accountName=?";
PreparedStatement pstmt=con.prepareStatement(sql);
pstmt.setInt(1, account);
pstmt.setString(2, accountName);
pstmt.executeUpdate();
}
/**
* 转入
* @param con
* @param accountName
* @param account
* @throws Exception
*/
private static void inCount(Connection con,String accountName,int account)throws Exception{
String sql="update t_account set account=accountBalance+? where accountName=?";
PreparedStatement pstmt=con.prepareStatement(sql);
pstmt.setInt(1, account);
pstmt.setString(2, accountName);
pstmt.executeUpdate();
}
public static void main(String[] args) {
Connection con=null;
Savepoint sp=null;
try {
con=dbUtil.getCon();
con.setAutoCommit(false);//取消自动提交
System.out.println("张三开始向李四转账");
int account=500;
outCount(con,"张三",account);
sp=con.setSavepoint();//设置一个sp保存点
inCount(con, "李四", account);
System.out.println("转账成功!");
} catch (Exception e) {
try {
con.rollback(sp);//回滚到sp保存点
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
con.commit();//提交事务
con.close();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
个人觉得,对于JDBC,我们需要掌握的就是学会使用并且熟悉连接数据库的方法以及各种操作,然后再通过一些项目逐渐熟悉,这样,慢慢的就会觉得很轻松了.