JDBC案例演示,供参考

在这写一下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();
    }



}
上一篇:StackExchange.Redis 访问封装类


下一篇:“千万元”级别商机背后的数据库的技术支撑和优化