一、简介
1.MySQL驱动包(JDBC接口的实现类,就是一个jar包)。
2.JDBC是SUN公司提出一套规范,就是一组接口。这写接口的实现类是由各个数据库的生产商提供的。
3.JDBC的快速入门的开发有一些的开发步骤
二、常见的类和接口
1.DriverManage类
(1)注册驱动
DriverManager.registerDriver(new Driver());
* 其实这个方法有两点不好
- 过于依赖MySQL驱动包。
- 注册驱动的代码实际上执行了2次。
* 想使用一种方式解决上述两个问题。
Class.forName("com.mysql.jdbc.Driver");
(2)获取连接对象
Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/zcm", "root", "123456");
jdbc:mysql://localhost:3306/zcm 数据库的连接地址
* jdbc :数据库之间传输数据的协议
* mysql :jdbc协议的子协议。
* localhost :服务器的地址
* 3306 :默认的端口号
* zcm :数据库的名称
如果你要链接你自己电脑上的数据库,简写的方式 * jdbc:mysql:///zcm
root -- 用户名
password -- 你的数据库的密码
2.Connection对象
(1)创建执行SQL语句的对象
* Statement createStatement() -- 获取执行SQL语句对象
* PreparedStatement prepareStatement(String sql) -- 获取执行SQL语句对象,预编译SQL语句,防止SQL注入
* CallableStatement prepareCall(String sql) -- 获取执行SQL语句对象,执行存储过程
(2)管理事物
事物:一组逻辑上的操作。
* void setAutoCommit(boolean autoCommit) -- 设置事物自动提交
* void commit() -- 提交事物
* void rollback() -- 回滚事物
3.Statement对象
(1)执行SQL语句
* ResultSet executeQuery(String sql) -- 执行查询语句(select语句)
* int executeUpdate(String sql) -- 执行增删改的操作(insert update delete)
* boolean execute(String sql) -- 执行任意的sql(如果第一个结果为 ResultSet 对象,则返回 true;如果其为更新计数或者不存在任何结果,则返回 false )
(2)执行批处理
可以一批插入或者删除数据。(表格)
* void addBatch(String sql) -- 把SQL语句添加批处理中
* int[] executeBatch() -- 执行批处理
* void clearBatch() -- 清除批处理
4.ResultSet对象
(1)执行查询语句,才有结果集。
(2)游标的默认位置在第一行数据之前。
(3)调用rs.next()方法,游标判断是否有下一行数据,如果有,移动到下一行。可以通过getXXX()方法获取该行的数据。
(4)游标默认只能向下移动,如果滚动,可以设置滚动的结果集。
(5)getXXX() 这些方法都是重载的int(字段的位置) String(字段的名称)
(6)getObject() 获取任意类型的数据(强转)
5.释放资源
(1)connection链接对象,晚创建早释放。
(2)释放标准的代码
if(rs != null){
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
rs = null;
}
6.SQL注入的问题
(1)在文本框输入一些特殊的字符,在已知用户名的情况下,输入用户登陆进去。
(2)xxx ' or ' 1=1 或者 xxx ' –
(3)sql语句 select * from t_user where username = '' and password = '';
使用了特殊字符获得的结果:
select * from t_user where username = 'bbb ' or ' 1=1 ' and password = '任意';
select * from t_user where username = 'bbb ' -– ' and password = '';
(4)根本原因就是因为拼接了参数。
(5)解决这种问题
* 前台校验(治标不治本)
* 后台的验证(使用PreparedStatement对象)
(6)PreparedStatement来完成操作
* 编写SQL语句,SQ L语句的参数使用?代替
* 预编译SQL语句 conn.prepareStatement(sql)
* 设置参数的真正的值 stmt.setString(1,值) 1:代表?的位置
* 执行SQL(不用传入SQL语句)
7.批处理
(1)批量插入和批量删除。
* void addBatch(String sql) -- 把SQL语句添加批处理中
* int[] executeBatch() -- 执行批处理
* void clearBatch() -- 清除批处理
* insert into xxx values (null,"值"); 如果使用Statement对象执行SQL语句。
* insert into xxx values (null,?); 先发送SQL到服务器端,预编译。设置值。使用PreparedStatement对象
三、详解:
参考:https://blog.csdn.net/u012124438/article/details/81431000