MySQL数据库和JDBC编程(续)

作者:陆金龙    发表时间:2024-02-24 05:42   

关键词:  

12.Java7 RowSet


(1) JdbcRowSet RowSetFactory
public void update(String sql)throws Exception
{
    // 加载驱动
    Class.forName(driver);
    try(
    // 获取数据库连接
    Connection conn = DriverManager.getConnection(url , user , pass);
    // 创建JdbcRowSetImpl对象
    JdbcRowSet jdbcRs = new JdbcRowSetImpl(conn))   // ①
    {
        // 设置SQL查询语句
        jdbcRs.setCommand(sql);
        // 执行查询
        jdbcRs.execute();
        jdbcRs.afterLast();
        // 向前滚动结果集
        while (jdbcRs.previous())
        {
            System.out.println(jdbcRs.getString(1)+ "\t" + jdbcRs.getString(2)+ "\t" + jdbcRs.getString(3));
            if (jdbcRs.getInt("student_id") == 3)
            {
                // 修改指定记录行
                jdbcRs.updateString("student_name", "孙悟空");
                jdbcRs.updateRow();
            }
        }
    }
}
public static void main(String[] args)throws Exception
{
    JdbcRowSetTest jt = new JdbcRowSetTest();
    jt.initParam("mysql.ini");
    jt.update("select * from student_table");
}


public void update(String sql)throws Exception
{
    // 加载驱动
    Class.forName(driver);
    // 使用RowSetProvider创建RowSetFactory
    RowSetFactory factory = RowSetProvider.newFactory();
    try(
    // 使用RowSetFactory创建默认的JdbcRowSet实例
    JdbcRowSet jdbcRs = factory.createJdbcRowSet())
    {
        // 设置必要的连接信息
        jdbcRs.setUrl(url);
        jdbcRs.setUsername(user);
        jdbcRs.setPassword(pass);
        // 设置SQL查询语句
        jdbcRs.setCommand(sql);
        // 执行查询
        jdbcRs.execute();
        jdbcRs.afterLast();
        // 向前滚动结果集
        while (jdbcRs.previous())
        {
            System.out.println(jdbcRs.getString(1)+ "\t" + jdbcRs.getString(2)+ "\t" + jdbcRs.getString(3));
            if (jdbcRs.getInt("student_id") == 3)
            {
                // 修改指定记录行
                jdbcRs.updateString("student_name", "孙悟空");
                jdbcRs.updateRow();
            }
        }
    }
}

public static void main(String[] args)throws Exception
{
    RowSetFactoryTest jt = new RowSetFactoryTest();
    jt.initParam("mysql.ini");
    jt.update("select * from student_table");
}

(2) 离线RowSet
public CachedRowSet query(String sql)throws Exception
{
    // 加载驱动
    Class.forName(driver);
    // 获取数据库连接
    Connection conn = DriverManager.getConnection(url , user , pass);
    Statement stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery(sql);
    // 使用RowSetProvider创建RowSetFactory
    RowSetFactory factory = RowSetProvider.newFactory();
    // 创建默认的CachedRowSet实例
    CachedRowSet cachedRs = factory.createCachedRowSet();
    // 使用ResultSet装填RowSet
    cachedRs.populate(rs);    // ①
    // 关闭资源
    rs.close();
    stmt.close();
    conn.close();
    return cachedRs;
}
public static void main(String[] args)throws Exception
{
    CachedRowSetTest ct = new CachedRowSetTest();
    ct.initParam("mysql.ini");
    CachedRowSet rs = ct.query("select * from student_table");
    rs.afterLast();
    // 向前滚动结果集
    while (rs.previous())
    {
        System.out.println(rs.getString(1)
            + "\t" + rs.getString(2)
            + "\t" + rs.getString(3));
        if (rs.getInt("student_id") == 3)
        {
            // 修改指定记录行
            rs.updateString("student_name", "孙悟空");
            rs.updateRow();
        }
    }
    // 重新获取数据库连接
    Connection conn = DriverManager.getConnection(url
    , user , pass);
    conn.setAutoCommit(false);
    // 把对RowSet所做的修改同步到底层数据库
    rs.acceptChanges(conn);
}

(3) 离线RowSet分页
public CachedRowSet query(String sql , int pageSize
    , int page)throws Exception
{
    // 加载驱动
    Class.forName(driver);
    try(
    // 获取数据库连接
    Connection conn = DriverManager.getConnection(url , user , pass);
    Statement stmt = conn.createStatement();
    ResultSet rs = stmt.executeQuery(sql))
    {
        // 使用RowSetProvider创建RowSetFactory
        RowSetFactory factory = RowSetProvider.newFactory();
        // 创建默认的CachedRowSet实例
        CachedRowSet cachedRs = factory.createCachedRowSet();
        // 设置每页显示pageSize条记录
        cachedRs.setPageSize(pageSize);
        // 使用ResultSet装填RowSet,设置从第几条记录开始
        cachedRs.populate(rs , (page - 1) * pageSize + 1);
        return cachedRs;
    }
}
public static void main(String[] args)throws Exception
{
    CachedRowSetPage cp = new CachedRowSetPage();
    cp.initParam("mysql.ini");
    CachedRowSet rs = cp.query("select * from student_table" , 3 , 2);   // ①
    // 向后滚动结果集
    while (rs.next())
    {
        System.out.println(rs.getString(1)+ "\t" + rs.getString(2)+ "\t" + rs.getString(3));
    }
}

13.事务 

public void insertInTransaction(String[] sqls) throws Exception
{
    // 加载驱动
    Class.forName(driver);
    try(
    Connection conn = DriverManager.getConnection(url , user , pass))
    {
        // 关闭自动提交,开启事务
        conn.setAutoCommit(false);
        try(
        // 使用Connection来创建一个Statment对象
        Statement stmt = conn.createStatement())
        {
            // 循环多次执行SQL语句
            for (String sql : sqls)
            {
                stmt.executeUpdate(sql);
            }
        }
        // 提交事务
        conn.commit();
    }
}
public static void main(String[] args) throws Exception
{
    TransactionTest tt = new TransactionTest();
    tt.initParam("mysql.ini");
    String[] sqls = new String[]{
    "insert into student_table values(null , 'aaa' ,1)",
        "insert into student_table values(null , 'bbb' ,1)",
        "insert into student_table values(null , 'ccc' ,1)",
        // 下面这条SQL语句将会违反外键约束,
        // 因为teacher_table中没有ID5的记录。
        "insert into student_table values(null , 'ccc' ,5)" //①
};
    tt.insertInTransaction(sqls);
}

14.分析数据库信息


public void info() throws Exception
{
    // 加载驱动
    Class.forName(driver);
    try(
    // 获取数据库连接
    Connection conn = DriverManager.getConnection(url, user , pass))
    {
        // 获取的DatabaseMetaData对象
        DatabaseMetaData dbmd = conn.getMetaData();

        // 获取MySQL支持的所有表类型
        ResultSet rs = dbmd.getTableTypes();
        System.out.println("--MySQL支持的表类型信息--");
        printResultSet(rs);

        // 获取当前数据库的全部数据表
        rs = dbmd.getTables(null,null, "%" , new String[]{"TABLE"});
        System.out.println("--当前数据库里的数据表信息--");
        printResultSet(rs);

        // 获取student_table表的主键
        rs = dbmd.getPrimaryKeys(null , null, "student_table");
        System.out.println("--student_table表的主键信息--");
        printResultSet(rs);

        // 获取当前数据库的全部存储过程
        rs = dbmd.getProcedures(null , null, "%");
        System.out.println("--当前数据库里的存储过程信息--");
        printResultSet(rs);

        // 获取teacher_table表和student_table之间的外键约束
        rs = dbmd.getCrossReference(null,null, "teacher_table"
            , null, null, "student_table");
        System.out.println("--teacher_table表和student_table之间"
            + "的外键约束--");
        printResultSet(rs);

        // 获取student_table表的全部数据列
        rs = dbmd.getColumns(null, null, "student_table", "%");
        System.out.println("--student_table表的全部数据列--");
        printResultSet(rs);
    }
}
public void printResultSet(ResultSet rs)throws SQLException
{
    ResultSetMetaData rsmd = rs.getMetaData();
    // 打印ResultSet的所有列标题
    for (int i = 0 ; i < rsmd.getColumnCount() ; i++ )
    {
        System.out.print(rsmd.getColumnName(i + 1) + "\t");
    }
    System.out.print("\n");

    // 打印ResultSet里的全部数据
    while (rs.next())
    {
        for (int i = 0; i < rsmd.getColumnCount() ; i++ )
        {
            System.out.print(rs.getString(i + 1) + "\t");
        }
        System.out.print("\n");
    }
    rs.close();
}
public static void main(String[] args)
throws Exception
{
    DatabaseMetaDataTest dt = new DatabaseMetaDataTest();
    dt.initParam("mysql.ini");
    dt.info();
}