在这写一下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(); }}新闻热点
疑难解答