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>
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);//获取数据库的连接
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 }
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 }
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 }
经过测试发现
数据库中也不存在相应的数据。
1.5:数据库连接池
本人推荐看写的很详细http://www.cnblogs.com/xdp-gacl/p/4002804.html