在这写一下JDBC的案例,将JDBC的一些功能演示下,供参考,至于实体类在此我就不写出来了,大家根据需求不同记得导入对应的驱动包到项目中,我这里演示的是以mysql为例,其实区别都不大,如有不对的地方欢迎纠正。
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import com.mysql.jdbc.PreparedStatement;
import java.sql.ResultSet;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Clob;
import java.sql.DatabaseMetaData;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Savepoint;
public class JDBCDemo {
// 数据库地址 localhost表示本地,
//3306是mysql默认的端口,db_bank是要链接的数据库
private static String dbUrl="jdbc:mysql://localhost:3306/db_bank";
// 用户名
private static String dbUserName="root";
// 密码
private static String dbPassword="123456";
// 驱动名称 这里是mysql驱动
private static String jdbcName="com.mysql.jdbc.Driver";
//静态块,最优先执行
static{
try{
Class.forName(jdbcName);//加载驱动
}catch(Exception e){
e.printStackTrace();//打印错误信息
}
}
/**
* 获取数据库连接
* @return
* @throws Exception
*/
public static Connection getCon()throws Exception{
//获取数据库链接
Connection con=DriverManager.getConnection(dbUrl,dbUserName,dbPassword);
return con;
}
/**
* 关闭数据库连接
* @param con
* @param sta
* @param rs
* @throws Exception
*/
public static void close(Connection conn,Statement sta,ResultSet rs){
try{
if(rs!=null){
rs.close();//关闭ResultSet
}
if(sta!=null){
sta.close();//关闭Statement
}
if(conn!=null){
conn.close();//关闭Connection
}
}catch(Exception e){
e.printStackTrace();//打印异常信息
}
}
/**
* 新增演示[添加图书]
* @param book 要新增的图书对象
* @return 返回受影响的行数
* @throws Exception
*/
private int addBook(Book book)throws Exception{
Connection con=getCon();//得到数据库链接
//得到PreparedStatement对象
PreparedStatement pstmt=con.prepareStatement(sql);
pstmt.setString(1, book.getBookName()); // 设置图书名称
pstmt.setFloat(2, book.getPrice()); // 设置图书价格
pstmt.setString(3, book.getAuthor()); // 设置图书作者
pstmt.setInt(4, book.getBookTypeId()); // 设置图书类型Id
//--------- 大数据字符集 --------------
InputStream inputStream=new FileInputStream(new File("c:/hello.text"));//得到输入流
//大数据类型,设置图书内容,
//这里演示mysql数据库类型是longtext
pstmt.setAsciiStream(5,inputStream,context.length());
//----大数据二进制,一般存储图片,视频,音频等 ----
//将图片转为输入流
InputStream inputStream2=new FileInputStream(new File("c:/a.jpg"));
//大数据类型,设置封面图片,
//这里演示mysql数据库类型是longblod
pstmt.setBinaryStream(6, inputStream2, pic.length());
//执行并返回受影响的行数
int result=pstmt.executeUpdate();
if(result>0){//大于0表示新增成功
//获取生成器
ResultSet rs=pstmt.getGeneratedKeys();
if(rs.next()){//判断是否有值
//得到新增数据后的主键值
int key=rs.getInt(1);
}
}
close(con,pstmt,null);//关闭连接
return result;
}
/**
* 修改演示[更新图书]
* @param book 要修改的图书对象
* @return 返回受影响的行数
* @throws Exception
*/
private int updateBook(Book book)throws Exception{
Connection con=getCon();//得到数据库链接
//新增语句
String sql="update t_book set bookName=?,price=?,author=?,bookTypeId=? where id=?";
//得到PreparedStatement对象
PreparedStatement pstmt=con.prepareStatement(sql);
pstmt.setString(1, book.getBookName());//设置图书名称
pstmt.setFloat(2, book.getPrice());//设置图书价格
pstmt.setString(3, book.getAuthor());//设置图书作者
pstmt.setInt(4, book.getBookTypeId());//设置图书类型Id
pstmt.setInt(5, book.getId());//设置要修改的图书id
//执行修改并返回受影响的行数
int result=pstmt.executeUpdate();
close(con,pstmt,null);//关闭连接
return result;
}
/**
* 删除演示[删除图书]
* @param id 要删除的图书id
* @return 返回受影响的行数
* @throws Exception
*/
private int deleteBook(int id)throws Exception{
Connection con=getCon();//得到数据库链接
String sql="delete from t_book where id=?";//删除语句
//得到PreparedStatement对象
PreparedStatement pstmt=con.prepareStatement(sql);
pstmt.setInt(1, id);//设置要删除的图书id
//执行删除并返回受影响的行数
int result=pstmt.executeUpdate();
close(con,pstmt,null);//关闭连接
return result;
}
/**
* 查询演示[查询所有图书]
* @return 返回list集合
* @throws Exception
*/
private List<Book> listBook()throws Exception{
List<Book> bookList=new ArrayList<Book>();
Connection con = getCon(); //得到数据库链接
String sql = "select * from t_book";//查询语句
//得到PreparedStatement对象
PreparedStatement pstmt = con.prepareStatement(sql);
//执行并返回结果集ResultSet
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {//遍历结果集rs.next()返回true表示有数据
int id = rs.getInt("id"); // 获取编号id
String bookName = rs.getString("bookName"); // 获取图书名称 bookName
float price = rs.getFloat("price"); // 获取图书价格 price
String author = rs.getString("author"); // 获取图书作者 author
int bookTypeId = rs.getInt("bookTypeId"); // 获取图书类别id
//---- 大数据字符集,一般存储大文本等内容 ----
//大数据类型,获取图书内容,
//这里演示mysql数据库类型是longtext
Clob c=rs.getClob("context");
//转为字符串
String context=c.getSubString(1, (int)c.length());
//---大数据二进制,一般存储图片,视频,音频等 -------
//创建一个输出流,
//将数据库中的封面图片保存到该路径中c:/pic.jpg
FileOutputStream out=new FileOutputStream(new File("c:/pic.jpg"));
//大数据类型,获取封面图片,
//这里演示mysql数据库类型是longblod
out.write(b.getBytes(1,(int)b.length()));
Book book=new Book(id,bookName,price, author,bookTypeId);//封装图书对象
bookList.add(book);//将图书对象保存集合中
}
close(con,pstmt,rs);//关闭连接
return bookList;
}
/**
* JDBC调用存储过程演示
* 数据库中有一个存储过程为 pro_getBookNameById
* 该存储过程功能是通过编号(id)查询图书名称(bookName)
* 该存储过程中有分别有一个输入参数
* 跟一个输出参数(输出参数名称为 bN )
* @param id 图书编号
* @return 返回图书名称
* @throws Exception
*/
private String getBookNameById(int id) throws Exception{
Connection con=getCon();// 获取数据库连接
//调用存储过程语句,第一个为输入参数,
//第二个是输出参数,输出参数名称是bN
String sql="{CALL pro_getBookNameById(?,?)}";
//得到CallableStatement对象
CallableStatement cstmt=con.prepareCall(sql);
cstmt.setInt(1, id);//设置第一个参数(即输入参数)
//设置返回类型(即输出参数类型),指的是数据库中的数据类型
cstmt.registerOutParameter(2, Types.VARCHAR);
cstmt.execute();//执行
//获取返回值(即输出参数 bN )
String bookName=cstmt.getString("bN");
close(con,cstmt,null);//关闭连接
return bookName;
}
/**
*元数据演示
*/
public void demo () throws Exception {
Connection con=getCon();//获取数据库链接对象
//---------- 元数据 ----------------
//获取DatabaseMetaData对象
DatabaseMetaData dmd=con.getMetaData();
//dmd.getDatabaseProductName()获取数据库名称
System.out.println("数据库名称:"+dmd.getDatabaseProductName());
//getDriverMajorVersion()得到数据库大版本号,
//dmd.getDriverMinorVersion()得到数据库小版本号
System.out.println("数据库版本:"+dmd.getDriverMajorVersion()+"."+dmd.getDriverMinorVersion());
String sql="select * from t_book";//查询语句
//得到PreparedStatement对象
PreparedStatement pstmt=con.prepareStatement(sql);
// 获取元数据列的总数(即有多少列(字段))
int num=rsmd.getColumnCount();
System.out.println("共有"+num+"列");
for(int i=1;i<=num;i++){
//rsmd.getColumnName(i)获取第i列的列名称(即字段名称),
//rsmd.getColumnTypeName(i)获取第i列的数据类型
System.out.println(rsmd.getColumnName(i)+","
+rsmd.getColumnTypeName(i));
}
}
/**
*
*事务演示
**/
public static void main(String[] args) throws Exception {
Connection con=null;
Savepoint sp=null;
try {
con=getCon();//得到数据库连接
//取消自动提交(将事务设置为手动提交)
con.setAutoCommit(false);
System.out.println("张三开始向李四转账!");
int account=500;
outCount(con, "张三", account);//此处假设转出账操作
//演示:设置一个保存点(即数据库的备份点)
//sp=con.setSavepoint();
inCount(con, "李四", account);//此处假设转入账操作
System.out.println("转账成功!");
con.commit(); //提交事务
} catch (Exception e) {
con.rollback(); //回滚事务
//con.rollback(sp);//回滚事务到sp保存点
e.printStackTrace();//打印错误信息
}finally{
con.close();//关闭连接
}
}
/**
* 假设转出操作
* @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-account? 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+account? where accountName=?";
PreparedStatement pstmt=con.prepareStatement(sql);
pstmt.setInt(1, account);
pstmt.setString(2, accountName);
pstmt.executeUpdate();
}
}