javaweb回顾第三篇数据库访问
前言:本篇主要针对数据库的操作,在这里不适用hibernate或者mybatis,用最原始的JDBC进行讲解,通过了解这些原理以后更容易理解和学习hibernate或mybatis。
1:jdbc的简单操作
首先需要下载jdbc驱动的jar包 如果不想下载在C:\Program Files (x86)\MySQL\Connector J 5.1.26位置也可以找到 如果是maven项目的话需要在pom上引入下面的依赖包
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.26</version>
</dependency>
1.1:配置连接数据库
Class.forName("com.mysql.jdbc.Driver");//加载数据库驱动
String url="jdbc:mysql://localhost:3306/blog";//数据连接地址
String username="root";//登录名
String password="123456";//密码
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()表示一个特殊的执行,主要针对返回多个结果集、多个更新计数,相对来说用的少些
粘贴一下代码
public class JDBCHelper {
private Connection connection;
private PreparedStatement preparedStatement;
public JDBCHelper(){
try {
Class.forName("com.mysql.jdbc.Driver");
String url="jdbc:mysql://localhost:3306/blog";
String username="root";
String password="123456";
connection=DriverManager.getConnection(url, username, password);
}
catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}
}
/**
* 创建数据库
* sql语句
*/
public void createDatabase(String sql)
{
Statement statement=null;
try {
statement=connection.createStatement();//主要用户不带参数的简单sql语句()执行静态SQL语句返回它生成结果
statement.executeUpdate(sql);
System.out.println("数据库创建成功");
} catch (SQLException e) {
e.printStackTrace();
}
finally {
if (statement!=null) {
try {
statement.close();
} catch (SQLException e) {
}
statement=null;
}
}
}
/**
* 增删改
* @param sql
* @param paramters
* @return
* @throws SQLException
*/
public int update(String sql,Object... paramters) throws SQLException
{
try{
preparedStatement =connection.prepareStatement(sql);
for (int i = 0; i < paramters.length; i++) {
preparedStatement.setObject(i+1, paramters[i]);
}
return preparedStatement.executeUpdate();
}
catch(SQLException e)
{
e.printStackTrace();
}
finally {
if(preparedStatement!=null)
{
preparedStatement.close();
}
preparedStatement=null;
}
return 0;
}
/**
* 用与查询
* @param sql
* @param paramters
* @return
* @throws SQLException
*/
public ResultSet query(String sql,Object... paramters) throws SQLException
{
try{
preparedStatement =connection.prepareStatement(sql);
for (int i = 0; i < paramters.length; i++) {
preparedStatement.setObject(i+1, paramters[i]);
}
return preparedStatement.executeQuery();
}
catch(SQLException e)
{
e.printStackTrace();
}
finally {
if(preparedStatement!=null)
{
preparedStatement.close();
}
preparedStatement=null;
}
return null;
}
}
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有了上面的我们就可以进行事务了下面把代码贴出来,仅供参考
public void addUserAndRole(UserBean userbean,UserRoleBean userRoleBean) throws SQLException
{
connection.setAutoCommit(false);//关闭自动提交功能
connection.setTransactionIsolation(connection.TRANSACTION_REPEATABLE_READ); String userSql="insert into b_user(name,password,level,des,tel)values"+
"(?,?,?,?,?)";
String roleSql="insert into b_user_role(userId,roleId)values(?,?)";
try { preparedStatement =connection.prepareStatement(userSql);
preparedStatement.setString(1, userbean.getName());
preparedStatement.setString(2, userbean.getPassword());
preparedStatement.setInt(3, userbean.getLevel());
preparedStatement.setString(4, userbean.getDes());
preparedStatement.setString(5, userbean.getTel());
preparedStatement.executeUpdate();
if (userRoleBean.getRoleId()==0) {
throw new Exception();
}
preparedStatement=connection.prepareStatement(roleSql);
preparedStatement.setInt(1, userRoleBean.getUserId());
preparedStatement.setInt(2, userRoleBean.getRoleId());
preparedStatement.execute();
connection.commit();
System.out.println("执行成功");
} catch (Exception e) {
System.out.println("执行失败");
connection.rollback();
}
}
Transaction
public static void main(String[] args)
{
JDBCHelper jdbcHelper=new JDBCHelper();
UserBean userBean=new UserBean();
userBean.setName("张三");
userBean.setPassword("123456");
userBean.setLevel(1);
userBean.setDes("...");
userBean.setTel("123456"); UserRoleBean userRoleBean=new UserRoleBean();
userRoleBean.setRoleId(0);
userRoleBean.setUserId(2); try {
jdbcHelper.addUserAndRole(userBean, userRoleBean);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
main
经过测试发现
数据库中也不存在相应的数据。
1.5:数据库连接池
本人推荐看写的很详细http://www.cnblogs.com/xdp-gacl/p/4002804.html
javaweb回顾第三篇数据库访问的更多相关文章
- 三种数据库访问——Spring3.2 + Hibernate4.2
前三篇随笔中介绍了 用原生的JDBC访问数据库.一种高效的数据库连接池druid.用Spring的JDBC框架访问数据库. 本文继续介绍第三种数据库访问的解决方案:Spring3.2 + Hibern ...
- 三种数据库访问——Spring JDBC
本篇随笔是上两篇的延续:三种数据库访问——原生JDBC:数据库连接池:Druid Spring的JDBC框架 Spring JDBC提供了一套JDBC抽象框架,用于简化JDBC开发. Spring主要 ...
- 第三篇数据库与ORM
第三篇 数据库与ORM 1 新建数据库 2 数据库的配置 3 ORM表模型 4 ORM之增 5 ORM之删 6 ORM之改 7 ORM之查 1 新建数据库 在终端cmd中 mysql –uroot – ...
- 三种数据库访问——原生JDBC
原生的JDBC编程主要分一下几个步骤: (原生的JDBC编程指,仅应用java.sql包下的接口和数据库驱动类编程,而不借助任何框架) 1. 加载JDBC驱动程序: 2. 负责管理JDBC驱动程序的类 ...
- javaweb回顾第七篇jsp
1:为什么会有JSP jsp全名(java server pages)中文叫做java服务器页面.在Servlet那一篇我们发现用Servlet可以生成动态页面,但是我们却在Servlet中却写了大量 ...
- javaweb回顾第六篇谈一谈Servlet线程安全问题
前言:前面说了很多关于Servlet的一些基础知识,这一篇主要说一下关于Servlet的线程安全问题. 1:多线程的Servlet模型 要想弄清Servlet线程安全我们必须先要明白Servlet实例 ...
- javaweb回顾第十一篇过滤器(附实现中文乱码问题)
1:过滤器概念 过滤器就是一种在请求目标资源的中间组件,比喻把污水转换成纯净水中间需要一个污水净化设备,那么这个设备就好比一个过滤器.那么我用图来表示过滤器(可以有多个过滤器)运行的过程 2:Filt ...
- javaweb回顾第十篇JSTL
前言:JSTL(JSP Standard Tag Library)JSP标准标签库.它的目的是为了简化JSP的开发,如何没有JSTL可能我们开发的时候就需要写大量的自定义标签,无疑会加大开发难度,有了 ...
- javaweb回顾第八篇如何创建自定义标签
前言:在javaweb开发中自定义标签的用处还是挺多的.今天和大家一起看自定义标签是如何实现的. 1:什么是标签 标签是一种XML元素,通过标签可以使JSP页面变得简介易用,而且标签具有很好的复用性. ...
随机推荐
- 搭建DHCP服务器以及DHCP中继服务器
一.DHCP服务器 1.首先配置DHCP服务器的IP地址(DHCP服务器网卡桥接在VMnet1) .配置好IP后重启DHCP服务 3.安装DHCP服务器,在这里我用的是YUM安装的(关于YUM ...
- 边表+SPFA
传说中效率很NB的单元最短路径算法,传说中时间复杂度为O(kE),k为长度,平均值为2,不知道这话是谁说的,一说流传oi界几年了 边表就是数组模拟邻接表,没学会很难,学会很简单的样子啊 #includ ...
- 关于php中正则匹配包括换行符在内的任意字符的问题总结
要使用正则匹配任意字符的话,通常有以下几种方法,这里我分别对每一种方法在使用的过程中做一个总结: 第一种方式:[.\n]*? 示例 ? PHP preg_match_all('/<div cla ...
- 20145225唐振远 实验二 "Java面向对象程序设计"
20145225<Java程序设计> 实验二 Java面向对象程序设计 实验报告 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S ...
- Android学习--摘录
今天准备开始毕业设计--做一个android应用.无奈android基础木有一点,以前做过一个蓝牙应用,不过对android各方面的知识还是不懂啊,今天在android主页上看英文的android开发 ...
- loadrunner11录制报 NOT PROXIED!错误,无法生成脚本
使用loadrunner11,IE9录制完脚本,报错: [Net An. Error (1dec:282c)] Request Connection: Remote Server @ 210.5 ...
- 『TCP/IP详解——卷一:协议』读书笔记——05
2013-08-19 22:35:57 2.6 PPP:点对点协议 PPP点对点协议修改了SLIP协议中的所有缺陷: 1. 在串联链路上封装IP数据报的方法.PPP即支持数据为8位&无奇偶检验 ...
- Hibernate配置文件与映射文件的创建
1. config文件的创建: 内容: <?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hib ...
- 新公司入职第一天遇到的 关于 CSS 单行溢出文本显示省略号...的问题
上班第一天 前端岗位,因为公司这个项目是标准开发 所以没法用框架在打架页面,好吧 我手写 各种div 各种css样式 好不忧伤,好吧 不废话了 进入正题. 想在导航栏中的 客户信息 功能点 实现溢出用 ...
- 个性二维码开源专题<前背景>
//设置图片资源 private Image imgAgo; public override void SetParam() { base.SetParam(); // 读取前背景 string _i ...