JDBC取得自增长的主键值
在实际开发中很多时候都需要取得自增长主键值,但是这种情况下必须保证数据表中的主键值是自动增长。在Oracle中使用序列实现主键的自动增长,mysql中如果要让主键数据自动增长可以在创建数据表的时候指定,也可以使用工具修改。在指定主键自增长的时候需要保证自增长的字段必须是主键和数字类型。
取得自增长的主键值示例代码如下:
public class AutoIncrementDemo {
public static void main(String[] args) {
try {
System.out.println(insertEmp());
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
*
* @return
* @throws SQLException
*/
public static boolean insertEmp() throws SQLException {
// 取得连接对象
Connection conn = ConnectionUtils.getConnection();
// 定义sql语句
String sql = "INSERT INTO emp(ename,job,mgr,hiredate,sal,comm,deptno)"
+ "VALUES('王五','总经理',7789,NOW(),13000.00,5000.00,10)";
// 取得预编译对象
PreparedStatement pst = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
// 执行sql语句
int row = pst.executeUpdate();
// 取得自增长的主键值
ResultSet rst = pst.getGeneratedKeys();
if (rst.next()) {
System.out.println(rst.getInt(1));
}
// 关闭连接
ConnectionUtils.close(conn);
return row > 0;
}
}
sql注入的方式
实现无密码的登录操作示例代码如下:
public class SelectLoginDemo {
public static void main(String[] args) {
selectLogin("'smith'", "'abcd' OR 1=1");
}
/**
* 实现登录
* @param name 用户名
* @param password 密码
* @throws SQLException
*/
public static void selectLogin(String name, String password) {
// 取得连接对象
Connection conn = ConnectionUtils.getConnection();
// 定义sql语句
String sql = "SELECT * FROM myuser WHERE userid=" + name + " AND password=" + password;
try {
// 取得发送sql语句对象
Statement st = conn.createStatement();
// 发送sql语句
ResultSet rst = st.executeQuery(sql);
if (rst.next()) {
System.out.println("登录成功!!!");
} else {
System.out.println("用户密码不正确");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
ConnectionUtils.close(conn);
}
}
}
使用”Statement“接口发送sql语句缺点如下:
- 使用Statement接口对象发送的sql语句需要在数据库中进行一次编译之后成为指令才能执行,每条sql语句都需要编译一次,这样程序运行的效率会很慢。
- 使用Statement接口操作的sql语句只能使用字符串拼接的方式实现,这样的方式可能存在sql注入的安全风险并且拼接字符串比较麻烦。
JDBC占位符的使用
使用PreparedStatement接口操作的sql语句会先预编译成指令再发送给数据库,数据库就执行指令即可,这样就提高了程序运行时一定速度,而且使用该接口可以避开sql需要使用字符串拼接的方式,从而没有了sql注入的安全风险,而是使用占位符(?)来替代原来的字符串拼接。
使用占位符来实现无密码登录测试示例代码如下:
public class SelectLoginDemo01 {
public static void main(String[] args) {
selectLogin1("smith", "1234");
}
/**
* 实现登录
*
* @param name 用户名
* @param password 密码
* @throws SQLException
*/
public static void selectLogin1(String name, String password) {
// 取得连接对象
Connection conn = ConnectionUtils.getConnection();
// 定义sql语句
String sql = "SELECT * FROM myuser WHERE userid=? AND password=?";
try {
// 取得预编译对象
PreparedStatement pst = conn.prepareStatement(sql);
// 为占位符设置指定内容,即是赋值
pst.setString(1, name);
pst.setString(2, password);
// 发送sql语句
ResultSet rst = pst.executeQuery();
if (rst.next()) {
System.out.println("登录成功!!!");
} else {
System.out.println("用户密码不正确");
}
} catch (Exception e) {
e.printStackTrace();
} finally {
ConnectionUtils.close(conn);
}
}
}
使用占位符的好处:
- 避开sql语句的注入风险
- 会为字符串自动增加上单引号