how2j.cn

本视频是解读性视频,所以希望您已经看过了本知识点的内容,并且编写了相应的代码之后,带着疑问来观看,这样收获才多。 不建议一开始就观看视频



4分15秒
本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)



步骤 1 : 获取自增长id   
步骤 2 : 获取表的元数据   
步骤 3 : 练习-自增长id   
步骤 4 : 答案-自增长id   

步骤 1 :

获取自增长id

在Statement通过execute或者executeUpdate执行完插入语句后,MySQL会为新插入的数据分配一个自增长id,(前提是这个表的id设置为了自增长,在Mysql创建表的时候,AUTO_INCREMENT就表示自增长)

CREATE TABLE hero (
id int(11) AUTO_INCREMENT,
...
}

但是无论是execute还是executeUpdate都不会返回这个自增长id是多少。需要通过StatementgetGeneratedKeys获取该id
注: 第20行的代码,后面加了个Statement.RETURN_GENERATED_KEYS参数,以确保会返回自增长ID。 通常情况下不需要加这个,有的时候需要加,所以先加上,保险一些

PreparedStatement ps = c.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
package jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class TestJDBC { public static void main(String[] args) { try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } String sql = "insert into hero values(null,?,?,?)"; try (Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/how2java?characterEncoding=UTF-8","root", "admin"); PreparedStatement ps = c.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); ) { ps.setString(1, "盖伦"); ps.setFloat(2, 616); ps.setInt(3, 100); // 执行插入语句 ps.execute(); // 在执行完插入语句后,MySQL会为新插入的数据分配一个自增长id // JDBC通过getGeneratedKeys获取该id ResultSet rs = ps.getGeneratedKeys(); if (rs.next()) { int id = rs.getInt(1); System.out.println(id); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
步骤 2 :

获取表的元数据

元数据概念:
和数据库服务器相关的数据,比如数据库版本,有哪些表,表有哪些字段,字段类型是什么等等。
获取表的元数据
package jdbc; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class TestJDBC { public static void main(String[] args) throws Exception { try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } try (Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/how2java?characterEncoding=UTF-8","root", "admin");) { // 查看数据库层面的元数据 // 即数据库服务器版本,驱动版本,都有哪些数据库等等 DatabaseMetaData dbmd = c.getMetaData(); // 获取数据库服务器产品名称 System.out.println("数据库产品名称:\t"+dbmd.getDatabaseProductName()); // 获取数据库服务器产品版本号 System.out.println("数据库产品版本:\t"+dbmd.getDatabaseProductVersion()); // 获取数据库服务器用作类别和表名之间的分隔符 如test.user System.out.println("数据库和表分隔符:\t"+dbmd.getCatalogSeparator()); // 获取驱动版本 System.out.println("驱动版本:\t"+dbmd.getDriverVersion()); System.out.println("可用的数据库列表:"); // 获取数据库名称 ResultSet rs = dbmd.getCatalogs(); while (rs.next()) { System.out.println("数据库名称:\t"+rs.getString(1)); } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
步骤 3 :

练习-自增长id

Or  姿势不对,事倍功半! 点击查看做练习的正确姿势
当插入一条数据之后,通过获取自增长id,得到这条数据的id,比如说是55.

删除这条数据的前一条,54.

如果54不存在,则删除53,以此类推直到删除上一条数据。
步骤 4 :

答案-自增长id

在查看答案前,尽量先自己完成,碰到问题再来查看答案,收获会更多
本视频是解读性视频,所以希望您已经看过了本答案的内容,带着疑问来观看,这样收获才多。 不建议一开始就观看视频

3分10秒 本视频采用html5方式播放,如无法正常播放,请将浏览器升级至最新版本,推荐火狐,chrome,360浏览器 如果装有迅雷,播放视频呈现直接下载状态,请调整 迅雷系统设置-基本设置-启动-监视全部浏览器 (去掉这个选项)


答案-自增长id
package jdbc; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class TestJDBC { public static void main(String[] args) { try { Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } String sql = "insert into hero values(null,?,?,?)"; try (Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/how2java?characterEncoding=UTF-8", "root", "admin"); PreparedStatement ps = c.prepareStatement(sql); Statement st = c.createStatement();) { ps.setString(1, "盖伦"); ps.setFloat(2, 616); ps.setInt(3, 100); ps.execute(); ResultSet rs1 = ps.getGeneratedKeys(); int id = -1; if (rs1.next()) { id = rs1.getInt(1); } System.out.println("刚插入的数据的id是:" + id); for (int i = id - 1; i > 0; i--) { int targetId = i; ResultSet rs2 = st.executeQuery("select id from Hero where id = " + targetId); if (rs2.next()) { System.out.println("id=" + targetId + " 的数据存在,删除该数据"); String deleteSQL = "delete from hero where id = " + targetId; st.execute(deleteSQL); break; } } } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }


HOW2J公众号,关注后实时获知布最新的教程和优惠活动,谢谢。


问答区域    
2018-11-12 交作业
599599



答案
package JDBC;
/*
当插入一条数据之后,通过获取自增长id,得到这条数据的id,比如说是55.

删除这条数据的前一条,54.

如果54不存在,则删除53,以此类推直到删除上一条数据。
 */

import java.sql.*;

public class Exercise6 {

    public static void main(String[] agrs){

        try{
            Class.forName("com.mysql.jdbc.Driver");
            System.out.println("数据库驱动加载成功");
        }catch (ClassNotFoundException e ){

            e.printStackTrace();
        }

        //准备sql语句
        String sql = "insert into hero values(null,?,?,?)";
        String sql1 = "select * from hero";
        //尝试连接数据库
        try(
                Connection c = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/test?characterEncoding=UTF-8","root","Lyz599599");

                //创建执行插入语句的对象
                PreparedStatement ps = c.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
                //创建查询语句的对象
                PreparedStatement ps1 = c.prepareStatement(sql1);

                Statement s = c.createStatement();
                )
        {
            //设置参数
            ps.setString(1,"狼");

            ps.setFloat(2,333);

            ps.setInt(3,400);

            //执行插入
            ps.execute();
            //执行查询
            ps1.execute();
            ResultSet rs = ps1.getResultSet();

            //循环遍历打印出来
            while (rs.next()){

                int id = rs.getInt(1);
                String name = rs.getString(2);
                float hp = rs.getFloat(3);
                int damage = rs.getInt(4);

                //打印插入数据后的数据
                System.out.printf("%d\t %s\t %.2f\t %d%n",id,name,hp,damage);
            }

            //获取插入数据的自增id
            ResultSet getId = ps.getGeneratedKeys();
            int id = 0;
            while(getId.next()){

                id = getId.getInt(1);
                System.out.println("插入数据的自增id:"+id);
            }

            //存储自增id数据
            int a = id;
            System.out.println("存储的自增id数据为:"+a);
            //判断上一条数据是否存在
            int b = a-1;
            System.out.println("循环之前的上一条自增id数据为:"+b);
            //循环,直到找到上一条数据
            while (true) {
                //查询上条数据是否存在
                String checksql = "select * from hero where id = "+b+" ";

                //删除语句

                String delsql = "delete from hero where id = "+b+" ";
                //将查询结果返回rs2
                ResultSet rs2 = s.executeQuery(checksql);

                //返回类型为boolean类型
                boolean next = rs2.next();

                if (next) {
                    System.out.println("上条数据id:" + b + "存在");
                    System.out.println("执行删除。。");
                    s.execute(delsql);
                    System.out.println("删除完毕");
                    break;
                }
                else {
                    System.out.println("没有找到数据,执行id-1操作");
                    b = b - 1;
                    System.out.println("将新的上一条id:" + b + "进行查询");
                }


            }
        }catch (SQLException e ){

            e.printStackTrace();
        }
    }
}

							






答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2018-10-21 作业
AKZ



作业
package jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;



public class Test4 {
public static void main(String[] args) {
//	当插入一条数据之后,通过获取自增长id,得到这条数据的id,比如说是55. 
//
//	删除这条数据的前一条,54.
//
//	如果54不存在,则删除53,以此类推直到删除上一条数据。
	Todb todb=new Todb();
	String addSql="insert into hero values(null,?,?,?)";
	try (Connection c=todb.getConnection();
			Statement s=c.createStatement();
			PreparedStatement ps=c.prepareStatement(addSql,Statement.RETURN_GENERATED_KEYS)){
		ps.setString(1, "getId");
		ps.setFloat(2, 666.0f);
		ps.setInt(3, 999);
		ps.execute();
		ResultSet rs = ps.getGeneratedKeys();
		Integer preId=null;
		if(rs.next()) {
			int id=rs.getInt(1);
			System.out.println("插入一条数据,本次数据的id:"+id);
			preId=id-1;
			
		}
		while(true) {	
			String delSql="delete from hero where id ="+preId;
			String checkSql="select * from hero where id="+preId;
			ResultSet rs2 = s.executeQuery(checkSql);
			boolean next = rs2.next();	
			if(next) {
				System.out.println("上一条数据id:"+preId+",是否存在:"+next);
				System.out.println("上一条数据存在,执行删除操作...");
				s.execute(delSql);
				System.out.println("删除操作执行成功...");
				break;
			}
				System.out.println("上一条数据id:"+preId+",是否存在:"+next);
				preId-=1;	
			try {
				Thread.sleep(1000);
			} catch (InterruptedException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}	
	} catch (SQLException e) {
		// TODO: handle exception
		e.printStackTrace();
	}
}
}

							






答案 或者 代码至少填写一项, 如果是自己有问题,请重新提问,否则站长有可能看不到





2018-10-21 作业
2018-08-16 作业
2018-04-03 交作业,感觉PreparedStatement好蠢啊
2017-12-21 步骤4中的问题。
2017-09-22 疑惑
2017-08-22 PreparedStatement放在try-with-resource中不能使用两次的问题
2017-07-13 关于自增长
2017-06-12 int id = -1?是初始化吗?
2016-12-28 步骤1
2016-07-20 获取自增长id




提问之前请登陆
关于 JAVA 中级-JDBC-特殊操作 的提问

尽量提供截图代码异常信息,有助于分析和解决问题。 也可进本站QQ群交流: 902680467
提问尽量提供完整的代码,环境描述,越是有利于问题的重现,您的问题越能更快得到解答。
对教程中代码有疑问,请提供是哪个步骤,哪一行有疑问,这样便于快速定位问题,提高问题得到解答的速度
在已经存在的几千个提问里,有相当大的比例,是因为使用了和站长不同版本的开发环境导致的,比如 jdk, eclpise, idea, mysql,tomcat 等等软件的版本不一致。
请使用和站长一样的版本,可以节约自己大量的学习时间。 站长把教学中用的软件版本整理了,都统一放在了这里, 方便大家下载: http://how2j.cn/k/helloworld/helloworld-version/1718.html

上传截图