• javaweb回顾第三篇数据库访问


     前言:本篇主要针对数据库的操作,在这里不适用hibernate或者mybatis,用最原始的JDBC进行讲解,通过了解这些原理以后更容易理解和学习hibernate或mybatis。

    1:jdbc的简单操作

    首先需要下载jdbc驱动的jar包 如果不想下载在C:Program Files (x86)MySQLConnector J 5.1.26位置也可以找到 如果是maven项目的话需要在pom上引入下面的依赖包

    1 <dependency>
    2             <groupId>mysql</groupId>
    3             <artifactId>mysql-connector-java</artifactId>
    4             <version>5.1.26</version>
    5         </dependency>
    View Code

    1.1:配置连接数据库

    1 Class.forName("com.mysql.jdbc.Driver");//加载数据库驱动
    2             String url="jdbc:mysql://localhost:3306/blog";//数据连接地址
    3             String username="root";//登录名
    4             String password="123456";//密码
    5             connection=DriverManager.getConnection(url, username, password);//获取数据库的连接
    View Code

    1.2:向数据库发起请求(增删改查)

    1.2.1:statement

    statement用于已经建立好数据库连接的基础上发送sql语句的对象,不带参数简单的sql语句

    1.2.2:PreparedStatement

    由于在程序中传递sql语句必须要经过预编译,包括分析,优化等,如果重复执行一条只是参数不同的sql是比较低效的,那么久可以使用preparedStatement对象对sql语句进行预编译。(推荐使用)

    1.2.3:CallableStatement

    这个表示处理存储过程的对象。

    1.3:ResultSet的作用

    这个主要是sql执行以后返回的结果集,然后通过next属性来转换相关的结果

    1.4:executeUpdate()、executeQuery()、execute()三者区别

    executeUpdate()主要处理增删改语句,返回受影响的行数,也可以处理创建或更新数据库、以及创建或更新表结构

    executeQuery()主要是用来查询的,主要针对select开头的语句

    execute()表示一个特殊的执行,主要针对返回多个结果集、多个更新计数,相对来说用的少些

    粘贴一下代码

      1 public class JDBCHelper {
      2     private  Connection connection;
      3     private  PreparedStatement preparedStatement;
      4     public JDBCHelper(){
      5         try {
      6             Class.forName("com.mysql.jdbc.Driver");
      7             String url="jdbc:mysql://localhost:3306/blog";
      8             String username="root";
      9             String password="123456";
     10             connection=DriverManager.getConnection(url, username, password);
     11         }
     12         catch (ClassNotFoundException e) {
     13             e.printStackTrace();
     14         } catch (SQLException e) {
     15             e.printStackTrace();
     16         }
     17     }
     18     /**
     19      * 创建数据库
     20      * sql语句
     21      */
     22     public  void createDatabase(String sql)
     23     {
     24         Statement statement=null;
     25         try {
     26             statement=connection.createStatement();//主要用户不带参数的简单sql语句()执行静态SQL语句返回它生成结果
     27             statement.executeUpdate(sql);
     28             System.out.println("数据库创建成功");
     29         } catch (SQLException e) {
     30             e.printStackTrace();
     31         }    
     32         finally {
     33             if (statement!=null) {
     34                 try {
     35                     statement.close();
     36                 } catch (SQLException e) {
     37                 }
     38                 statement=null;
     39             }
     40         }
     41     }
     42     /**
     43      * 增删改
     44      * @param sql
     45      * @param paramters
     46      * @return
     47      * @throws SQLException
     48      */
     49     public  int update(String sql,Object... paramters) throws SQLException
     50     {
     51         try{
     52             preparedStatement =connection.prepareStatement(sql);
     53             for (int i = 0; i < paramters.length; i++) {
     54                 preparedStatement.setObject(i+1, paramters[i]);
     55             }
     56             return preparedStatement.executeUpdate();
     57         }
     58         catch(SQLException e)
     59         {
     60             e.printStackTrace();
     61         }
     62         finally {
     63             if(preparedStatement!=null)
     64             {
     65                 preparedStatement.close();
     66             }
     67             preparedStatement=null;
     68         }
     69         return 0;
     70     }
     71     /**
     72      * 用与查询
     73      * @param sql
     74      * @param paramters
     75      * @return
     76      * @throws SQLException
     77      */
     78     public  ResultSet query(String sql,Object... paramters) throws SQLException
     79     {
     80         try{
     81             preparedStatement =connection.prepareStatement(sql);
     82             for (int i = 0; i < paramters.length; i++) {
     83                 preparedStatement.setObject(i+1, paramters[i]);
     84             }
     85             return preparedStatement.executeQuery();
     86         }
     87         catch(SQLException e)
     88         {
     89             e.printStackTrace();
     90         }
     91         finally {
     92             if(preparedStatement!=null)
     93             {
     94                 preparedStatement.close();
     95             }
     96             preparedStatement=null;
     97         }
     98         return null;
     99     }
    100 }
    JDBCHelper

    1.4:数据库事务

    事务的定义:访问并可能更新数据库中各种数据项的一个程序执行单元(笼统的将就是一段程序执行所有的sql要么同时成功,要么就全部失败回滚)

    我们了解事务之前先看三个定义

    脏读:一个事务正在修改某行数据但是并未提交,而另一个事务正好读取了这行数据,这就是脏读

    不可重复读:一个事务读取了一行数据,在这个事务结束前另一个事务对这条数据进行修改,但是这种修改并没有提交数据库中,此时第一个事务再次读取这条数据时,出现了2次数据不一致这就是不可重复读

    幻读:当一个事务读取满足条件的数据后,另一个事务却插入一条数据,当第一个事务再次读取时,发现多了一条数据。这就是幻读。

    因为上面三种情况存在所以就出现了隔离级别,当然隔离级别越高效率会越低,下面是4中隔离级别

    connection.TRANSACTION_READ_UNCOMMITTED:这种隔离级别最低三种情况都可能发生

    connection.TRANSACTION_READ_COMMITTED:这种隔离级别避免脏读

    connection.TRANSACTION_REPEATABLE_READ:这种隔离级别避免脏读和不可重读读

    connection.TRANSACTION_SERIALIZABLE:这种隔离级别最高三种都可避免

    当了解完这种情况以后我们就可开始进行事务处理,在默认的情况下是不执行事务的。

    第一步是要开启事务:connection.setAutoCommit(false);//关闭自动提交功能(默认是true)

    然后在设置隔离级别:connection.setTransactionIsolation(connection.TRANSACTION_REPEATABLE_READ);

    ok有了上面的我们就可以进行事务了下面把代码贴出来,仅供参考

     1 public void addUserAndRole(UserBean userbean,UserRoleBean userRoleBean) throws SQLException
     2     {
     3         connection.setAutoCommit(false);//关闭自动提交功能
     4         connection.setTransactionIsolation(connection.TRANSACTION_REPEATABLE_READ);
     5 
     6 
     7         String userSql="insert into b_user(name,password,level,des,tel)values"+
     8                 "(?,?,?,?,?)";
     9         String roleSql="insert into b_user_role(userId,roleId)values(?,?)";
    10         try {
    11 
    12             preparedStatement =connection.prepareStatement(userSql);
    13             preparedStatement.setString(1, userbean.getName());
    14             preparedStatement.setString(2, userbean.getPassword());
    15             preparedStatement.setInt(3, userbean.getLevel());
    16             preparedStatement.setString(4, userbean.getDes());
    17             preparedStatement.setString(5, userbean.getTel());
    18             preparedStatement.executeUpdate();
    19             if (userRoleBean.getRoleId()==0) {
    20                 throw new Exception();
    21             }
    22             preparedStatement=connection.prepareStatement(roleSql);
    23             preparedStatement.setInt(1, userRoleBean.getUserId());
    24             preparedStatement.setInt(2, userRoleBean.getRoleId());
    25             preparedStatement.execute();
    26             connection.commit();
    27             System.out.println("执行成功");
    28         } catch (Exception e) {
    29             System.out.println("执行失败");
    30             connection.rollback();
    31         }
    32     }
    Transaction
     1 public static void main(String[] args)
     2     {  
     3         JDBCHelper jdbcHelper=new JDBCHelper();
     4         UserBean userBean=new UserBean();
     5         userBean.setName("张三");
     6         userBean.setPassword("123456");
     7         userBean.setLevel(1);
     8         userBean.setDes("...");
     9         userBean.setTel("123456");
    10         
    11         UserRoleBean userRoleBean=new UserRoleBean();
    12         userRoleBean.setRoleId(0);
    13         userRoleBean.setUserId(2);
    14         
    15         try {
    16             jdbcHelper.addUserAndRole(userBean, userRoleBean);
    17         } catch (SQLException e) {
    18             // TODO Auto-generated catch block
    19             e.printStackTrace();
    20         }
    21     }
    main

    经过测试发现

    数据库中也不存在相应的数据。

    1.5:数据库连接池

    本人推荐看写的很详细http://www.cnblogs.com/xdp-gacl/p/4002804.html

  • 相关阅读:
    show processlist 输出ID 和 information_schema.PROCESSLIST 的id,information_schema.innodb_trx的TRX_MYSQL_T
    用 Flask 来写个轻博客 (15) — M(V)C_实现博文页面评论表单
    第十二章 对象(下)
    十大最值得关注的国内大数据分析厂商
    第十二章 对象(上)
    mysql 区间锁 对于没有索引 非唯一索引 唯一索引 各种情况
    insert into select 堵塞update
    监控持有sql和被堵塞的sql
    人生应该有间隔年——北漂18年(75)
    ERROR: transport error 202: connect failed: Connection timed out
  • 原文地址:https://www.cnblogs.com/LipeiNet/p/5672110.html
Copyright © 2020-2023  润新知