一、简介
JDBC:java database connectivity。是SUN公司制订的一套操作数据库的规范。不同的数据库厂商虽然数据库驱动各不相同,但都保证了各自的驱动是遵循了JDBC规范的。
SUN公司制作的规范都在java.sql.*与javax.sql.*包中。
二、入门级的编写步骤
注册驱动 --> 获得连接 --> 获得发送sql语句对象 --> 执行 --> 关闭资源
1. 注册驱动 class.forName(...)
2. 获取连接 DriveManager.getConnection(...)
Jdbc:mysql://localhost:3306/cartitem root chen
3. 获取代表SQL语句对象 Statement stmt = conn.createStatement()
4. 执行SQL语句 stmt.executeQuery(sql)返回ReusltSet rs对象
5. 遍历结果 rs.next() 使用相关的rs.getString() 、rs.getInt()
6. 关闭资源 rs.close() stmt.close() conn.close()
三、Statement 对象常用方法
executeQuery(String sql)、executeUpdate(String sql)、execute(String sql)、addBatch(String sql)、executeBatch()、clearBatch()
四、ResultSet对象常用方法 封装了结果集
next():移动到下一行 previous():移动到前一行
absolute(int row):移动到指定行
beforeFirst():移动resultSet的最前面。
afterLast() :移动到resultSet的最后面。
五、SQL注入问题与解决方法 、insert into获取自增主键及PreparedStatement
<input name=”username” ../>
若有类似select username,birthday.. From users where username = ‘?’
若这里的?问题被人输入了’ or ‘1’=’1 这样的就称为SQL注入了。
解决方法,要用PreparedStatement,有以下好处:
a、是Statement的子接口 b、防止SQL注入
c、使用占位符?替代用户输入的参数 d、支持SQL语句预编译,执行效率高
String sql = "insert into tablename (id,name,age) value(?,?,?)";
PreparedStatement stmt = conn.prepareStatement(sql); //预编译
stmt.setInt(1,123);
还可以
ResultSet rs = stmt.getGeneratedKeys(),然后和
rs.getInt 获取刚自增的主键。
除了以上可以支持占位预编译的方式外,还可以支持批量操作相关的方法如下:
addBatch()、executeBatch()、clearBatch()如下示例代码:
conn = JdbcUtil.getConnection();
String sql = "insert into person values(?,?)";
stmt = conn.prepareStatement(sql);
for(int i=1;i<=1000001;i++){
stmt.setInt(1, i);
stmt.setString(2, "aaa"+i);
stmt.addBatch();
if(i%1000==0){
stmt.executeBatch();
stmt.clearBatch();
}
}
CallableStatement专门用于调用存储过程的接口
delimiter $$
CREATE PROCEDURE demoSp(IN inputParam VARCHAR(255), INOUT inOutParam varchar(255))
BEGIN
SELECT CONCAT('FANZHANJIANG Love ', inputParam) into inOutParam;
END $$
delimiter ;
-------------------------java调用存储过程--------------
Connection conn = JdbcUtil.getConnection();
String sql = "{call demoSp(?,?)}"; //调用存储过程 demoSp(存储过程)
CallableStatement stmt = conn.prepareCall(sql);
stmt.setString(1, "QingNai");//输入的参数:设置参数
stmt.registerOutParameter(2, Types.VARCHAR); //注册输出参数类型
stmt.execute();
System.out.println(stmt.getString(2));