【JDBC-03】取得自动增长的主键值+使用占位符

1. 取得自动增长的主键值

1.1 主键值自动增长

1.在很多使用中,需要取的自动增长的主键值,好方便对数据的操作,就必须保证主键值是自动增长的
2. Oracle中使用序列实现主键值的自动增长
3. mysql中可以在创建数据表的时候就指定主键值自动增长,也可以在工具中修改比如在Navicat中

在这里插入图片描述

1.2 取得自动增长的主键值

/取得发送sql语句的对象时,增加参数,取得主键自增长的值
                pst = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);

再调用PrepraedStatement对象的getGeneratedKeys()方法,返回封装主键值的ResultSet对象,再从ResultSet对象中取出主键值
ResultSet key = pst.getGeneratedKeys();

在这里插入图片描述

  /**
             * 插入数据,并取的主键自增长的值
             * @throws Exception
             */
        public static  void addEmp() throws Exception{
                Connection conn = null;
                PreparedStatement pst=null;

                try {
                //获得连接对象
                conn = ConnectionUtil.getConnection();
                //准备sql语句
                String sql = "insert INTO emp (ename,job,sal,hiredate,mgr,comm,deptno)" + "VALUES('Bob','Cleaner',2000.0,NOW(),7788,null,40)";
                //取得发送sql语句的对象,增加参数,取得主键自增长的值
                pst = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
                //发送sql语句指令
                    pst.executeUpdate();

                    //返回主键自增值
                    ResultSet key = pst.getGeneratedKeys();
                    if(key.next()){
                        System.out.println("主键自增长的值为"+key.getInt(1));
                    }

                }catch (Exception e){
                e.printStackTrace();
                }finally{
                //关闭资源
                conn.close();
                }

                }
                -----------------------------
                //主方法执行
        public class Test01
        {

        public static void main(String[] args)  throws Exception{
            addEmp();    
            }
            }     

在这里插入图片描述
在这里插入图片描述

2. 使用占位符

2.1 sql注入风险

sql注入:比如下列这种,就能在没有真实密码的情况下登录账户,非常不安全

在这里插入图片描述

2.2 占位符的使用

2.2.1 PreparedStatement接口的特征

在这里插入图片描述

PreparedStatement接口的特征:
   1. 使用这个接口操作的sql语句会预先编译成指令再发送给数据库,数据库执行该指令,可以在一定程度上提高执行速度。
   2. 可以避开sql需要使用字符串拼接的方式拼接在一起,使用占位符(?)来代替原来的字符串拼接,就没有sql注入的风险。
   3. 占位符会为字符串自动增加单引号

插入,修改都可以使用占位符,更加安全。
 /**
             * 占位符的使用,防止sql注入,在修改数据中也可以使用
             * @param
             * @return
             */
        public static boolean perch() throws Exception{
            //获取连接
            Connection conn = ConnectionUtil.getConnection();
            //准备sql语句,值使用占位符
            String sql ="INSERT INTO emp (ename,job,sal) VALUES(?,?,?)";
            //定义发送sql对象
            PreparedStatement pst = null;
            try{
                //获取发送sql对象
                pst=conn.prepareStatement(sql,Statement.RETURN_GENERATED_KEYS);
                //为占位符赋值
                pst.setString(1,"Mary");
                pst.setString(2,"程序媛");
                pst.setDouble(3, 3000.0);

                //执行sql语句
               return  pst.executeUpdate()>0;

            }catch(Exception e){
                e.printStackTrace();
            }finally{
                //关闭资源
                ConnectionUtil.close(conn,pst);
            }
            return false;
        }
        ----------------
        //主方法调用
        

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是基于Java语言和DBCP连接池的程序设计,实现对数据表users的查询操作: ```java import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import org.apache.commons.dbcp2.BasicDataSource; public class DBCPUtils { //定义数据库连接池对象 private static BasicDataSource dataSource = new BasicDataSource(); static { //设置数据库驱动 dataSource.setDriverClassName("com.mysql.jdbc.Driver"); //设置数据库连接地址、用户名、密码 dataSource.setUrl("jdbc:mysql://localhost:3306/test"); dataSource.setUsername("root"); dataSource.setPassword("123456"); //设置数据库连接池的一些参数 dataSource.setInitialSize(5); //初始化连接数 dataSource.setMaxIdle(10); //最大空闲连接数 dataSource.setMinIdle(2); //最小空闲连接数 dataSource.setMaxTotal(20); //最大连接数 dataSource.setMaxWaitMillis(5000); //最大等待时间,单位毫秒 } //获取数据库连接 public static Connection getConnection() throws SQLException { return dataSource.getConnection(); } //关闭数据库连接 public static void closeConnection(Connection conn, PreparedStatement ps, ResultSet rs) { try { if (rs != null) { rs.close(); } if (ps != null) { ps.close(); } if (conn != null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } } ``` 接下来,我们创建QueryState类,完成查询操作id=1,并返回对象: ```java import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class QueryState { public static void main(String[] args) { Connection conn = null; PreparedStatement ps = null; ResultSet rs = null; try { //获取数据库连接 conn = DBCPUtils.getConnection(); //定义查询语句,使用占位符 String sql = "SELECT * FROM users WHERE id = ?"; //创建PreparedStatement对象 ps = conn.prepareStatement(sql); //设置占位符的值为1 ps.setInt(1, 1); //执行查询操作 rs = ps.executeQuery(); //遍历查询结果 while (rs.next()) { int id = rs.getInt("id"); String name = rs.getString("name"); String password = rs.getString("password"); String email = rs.getString("email"); String birthday = rs.getString("birthday"); //创建User对象并返回 User user = new User(id, name, password, email, birthday); return user; } } catch (SQLException e) { e.printStackTrace(); } finally { //关闭数据库连接 DBCPUtils.closeConnection(conn, ps, rs); } //如果查询不到数据,则返回null return null; } } ``` 其中,User类的定义如下: ```java public class User { private int id; private String name; private String password; private String email; private String birthday; public User(int id, String name, String password, String email, String birthday) { this.id = id; this.name = name; this.password = password; this.email = email; this.birthday = birthday; } //省略getter和setter方法 } ``` 以上程序可以完成对数据表users的查询操作id=1,并返回对象。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值