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();
    }

}
时间: 2024-09-13 09:18:05

JDBC案例演示,供参考的相关文章

简单的三级联动案例,供参考

写个简单的三级联动案例,以地区来演示,供参考,大家注意下自己的jquery导入路径,如有不对的地方欢迎大家纠正. <html> <head> <!--导入jquery--> <script type="text/javascript"src="jquery1.7.1.js"> </script> </head> <script type="text/javascript"

url传递中文字符,特殊危险字符的解决方案(仅供参考)urldecode、base64

web开发的过程中,当我们需要在url中传递中文字符或是其它的html等特殊字符时,似乎总会碰到各种各样的小问题,因为不同的浏览器对他们的编码又不一样.对于中文,一般的做法是: 把这些文本字符串传给url之前,先进行urlencode($text)一下. 但是对于一些很"危险"的字符,比如说html字符,甚至是SQL注入相关的字符,如果很明显的传给系统,出于安全考虑,系统一般都会把它们过滤掉的. 那么,如果我们需要保留这些危险字符,不被过滤,该这么办呢? 我想到的办法是先给它们 bas

一份网站优化方案,仅供参考

下面是我写的一份网站优化方案,仅供参考! ****网站商城优化方案 明确网站定位: ****在线征订(http://blog.dfww.com.cn)是****网上售书商城,其作用是在互联网上******有关杂志书籍,所以是电子商务网站. 目标:通过网络******相关杂志. 思路:SEO是电子商务网站通用手法,通过关键词的优化带来流量,从而把商品**出去,获得利润. 一.确定关键词 由于****买的是早教幼教书籍,所以选取的关键词都是和早教幼教书籍杂志相关的关键词. 首页: Title:育儿杂

操作系统常见面试题(答案仅供参考)

操作系统常见面试题(答案仅供参考) 1.CPU在上电后,进入操作系统的main()之前必须做什么? 加电后,会触发CPU的reset信号,导致CPU复位,然后CPU会跳到(arm下0x00000000,x86下0xfffffff0)执行指令.主 要是做CPU初始化,确定CPU的工作模式,mmu初始化.建立页表段表,初始化中孤单控制器和中断向量表,初始化输入和输出,初始化 nandflash,把OS的TEXT区加载到sdram,然后跳转到sdram的main() 2.什么是中断?中断时CPU做什么

pyqt-最近开始学习PYQT5,请问有没有学习书籍或者资料可供参考

问题描述 最近开始学习PYQT5,请问有没有学习书籍或者资料可供参考 感觉和PYQT4的差异较大,PYQT4的资料较多,但是PYQT5的较少,麻烦各位前辈了. 解决方案 推荐一个网站:zetcode.com 上面有pyqt5的教程,可以满足你的需求,但是是英文的,应该没问题吧~ 最近在翻译上面的pyqt4教程,欢迎关注博客 http://blog.csdn.net/bigbennyguo 持续更新中~如果更完了可能会去翻译pyqt5. 解决方案二: qt5 assist 和 pyqt5下的exa

SPSS聚类分析——一个案例演示聚类分析全过程

SPSS聚类分析--一个案例演示聚类分析全过程 摘要: 案例数据源: 有20种12盎司啤酒成分和价格的数据,变量包括啤酒名称.热量.钠含量.酒精含量.价格.数据来自<SPSS for Windows 统计分析> 案例数据源: 有20种12盎司啤酒成分和价格的数据,变量包括啤酒名称.热量.钠含量.酒精含量.价格.数据来自<SPSS for Windows 统计分析>data11-03.点击下载 [一]问题一:选择那些变量进行聚类?--采用"R型聚类" 1.现在我们

信息与通信工程——重要国际学术会议和国际顶级期刊(仅供参考)

一.信息与通信工程的重要国际学术会议 主要包含两类: A类会议:本学科最顶尖级水平的国际会议: B类会议:学术水平较高.组织工作成熟.按一定时间间隔系列性召开的国际会议. A类会议(序号不表示优先顺序) 序号 / 英文名称 / 英文简称 / 中文名称 / 备注 1.IEEE International Conference on Acoustics, Speech and Signal Processing /  ICASAP /     IEEE 声学.语音和信号处理国际会议 2.IEEE I

有以下8种简单的电池节约方式可供参考

外出时突然发现手机忘充电了,希望最后一格电能撑的再久点,想在最短时间内把手机充满电,相信大家都有过以上经历.据日本网站GIGAZINE7月16日刊文介绍,有以下8种简单的电池节约方式可供参考.1.没必要把应用软件全部关闭反复的开关程序会浪费电池能源.据悉,使用iPhone时,除了语音.备忘录.音乐及地图等程序外,其余的程序在后台完全是停止状态.因此,并非是后台开的程序越多用电量就越大,2.满电后不要再继续充电智能机的锂电池满电后还长时间持续充点电的话会导致过热.一旦电池过热则会影响以后的充电状态

站长工具仅供参考 正确分析数据才是运营之道

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 对于站长工具来说,相信绝大多数站长朋友每天都会去查看自己的网站数据,目前来说chinaz和爱站的站长工具应该是大家使用最多的,正是因为站长工具能更好的分析网站,百度也启动了站长工具.守护今日看了卢松松的博客,一篇文章提到:别忘了还有站长帮手. 不管我们是否相信,对于站长来说,站长工具是大家使用比较多的一个参考数据,然而真正有多少朋友很好的使用