一、简介
JDBC:javadatabaseconnectivity。是SUN公司制订的一套操作数据库的规范。不同的数据库厂商虽然数据库驱动各不相同,但都保证了各自的驱动是遵循了JDBC规范的。
SUN公司制作的规范都在java.sql.*与javax.sql.*包中。
二、入门级的编写步骤
注册驱动-->获得连接-->获得发送sql语句对象-->执行-->关闭资源
1.注册驱动class.forName(...)
2.获取连接DriveManager.getConnection(...)
Jdbc:mysql://localhost:3306/cartitemrootchen
3.获取代表SQL语句对象Statementstmt=conn.createStatement()
4.执行SQL语句stmt.executeQuery(sql)返回ReusltSetrs对象
5.遍历结果rs.next()使用相关的rs.getString()、rs.getInt()
6.关闭资源rs.close()stmt.close()conn.close()
三、Statement对象常用方法
executeQuery(Stringsql)、executeUpdate(Stringsql)、execute(Stringsql)、addBatch(Stringsql)、executeBatch()、clearBatch()
四、ResultSet对象常用方法封装了结果集
next():移动到下一行 previous():移动到前一行
absolute(introw):移动到指定行
beforeFirst():移动resultSet的最前面。
afterLast():移动到resultSet的最后面。
五、SQL注入问题与解决方法、insertinto获取自增主键及PreparedStatement
<inputname=”username”../>
若有类似selectusername,birthday..Fromuserswhereusername=‘?’
若这里的?问题被人输入了’or‘1’=’1这样的就称为SQL注入了。
解决方法,要用PreparedStatement,有以下好处:
a、是Statement的子接口 b、防止SQL注入
c、使用占位符?替代用户输入的参数 d、支持SQL语句预编译,执行效率高
Stringsql="insertintotablename(id,name,age)value(?,?,?)";
PreparedStatementstmt=conn.prepareStatement(sql); //预编译
stmt.setInt(1,123);
还可以
ResultSetrs=stmt.getGeneratedKeys(),然后和
rs.getInt获取刚自增的主键。
除了以上可以支持占位预编译的方式外,还可以支持批量操作相关的方法如下:
addBatch()、executeBatch()、clearBatch()如下示例代码:
conn=JdbcUtil.getConnection();
Stringsql="insertintopersonvalues(?,?)";
stmt=conn.prepareStatement(sql);
for(inti=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$$
CREATEPROCEDUREdemoSp(INinputParamVARCHAR(255),INOUTinOutParamvarchar(255))
BEGIN
SELECTCONCAT('FANZHANJIANGLove',inputParam)intoinOutParam;
END$$
delimiter;
-------------------------java调用存储过程--------------
Connectionconn=JdbcUtil.getConnection();
Stringsql="{calldemoSp(?,?)}";//调用存储过程demoSp(存储过程)
CallableStatementstmt=conn.prepareCall(sql);
stmt.setString(1,"QingNai");//输入的参数:设置参数
stmt.registerOutParameter(2,Types.VARCHAR);//注册输出参数类型
stmt.execute();
System.out.println(stmt.getString(2));