javaweb回顾第三篇数据库访问

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

1:jdbc的简单操作

首先需要下载jdbc驱动的jar包 如果不想下载在C:\Program Files (x86)\MySQL\Connector 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

 

posted @ 2016-07-14 23:36  朝向远方  阅读(862)  评论(0编辑  收藏  举报