JDBC案例演示,供参考

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS PostgreSQL,集群系列 2核4GB
简介: 在这写一下JDBC的案例,将JDBC的一些功能演示下,供参考,至于实体类在此我就不写出来了,大家根据需求不同记得导入对应的驱动包到项目中,我这里演示的是以mysql为例,其实区别都不大,如有不对的地方欢迎纠正。import java.sql.CallableStatement;import java.sql.Connection;import java.sql.Dr

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



}
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
7月前
|
Java 数据库连接
登录页面JDBC案例
登录页面JDBC案例
87 0
|
7月前
|
Java 关系型数据库 MySQL
【JVM】JDBC案例打破双亲委派机制
【JVM】JDBC案例打破双亲委派机制
169 4
|
6月前
|
SQL 前端开发 Java
2024考古之还在用原始JDBC开发 手搓 案例 实现一个模块的增删改
2024考古之还在用原始JDBC开发 手搓 案例 实现一个模块的增删改
40 0
|
7月前
|
SQL Java 关系型数据库
JDBC PreparedStatement 字段值为null导致TBase带宽飙升的案例分析
JDBC PreparedStatement 字段值为null导致TBase带宽飙升的案例分析
113 0
|
7月前
|
SQL Java 数据库连接
JDBC增删改查案例讲解
JDBC增删改查案例讲解
35 0
|
Oracle 关系型数据库 Java
分享一个 Oracle RAC 模式下客户端建立JDBC初始连接时因ONS造成应用启动时卡顿30秒问题的排查分析案例
分享一个 Oracle RAC 模式下客户端建立JDBC初始连接时因ONS造成应用启动时卡顿30秒问题的排查分析案例
|
Java 关系型数据库 MySQL
Java Web实战 | JDBC案例:实现图书管理
在项目开发中,应用程序需要的数据基本都是存放在数据库中的。对数据的管理过程离不开数据库。本文将运用JDBC API编写一个实现基本数据库操作(添加、修改、删除、查询)的应用程序,实现对图书信息的管理。 完成此项目的具体步骤如下。
323 0
Java Web实战 | JDBC案例:实现图书管理
|
监控 Java Spring
Spring JDBC-实施Spring AOP事务注意事项及案例分析
Spring JDBC-实施Spring AOP事务注意事项及案例分析
143 0
|
SQL 安全 Oracle
|
Java 数据库连接 数据库
【JDBC】转账案例(一)
【JDBC】转账案例
117 0
【JDBC】转账案例(一)