JavaWeb基础篇(八)--JDBC入门

一、简介

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

猜你喜欢

转载自blog.csdn.net/weixin_43815050/article/details/87541768