java mysql 下拉框_JDBC事务、下拉框

summarize

事务开启:只有两条路,要么回滚,要么提交。开启事务(start transaction)后,到回滚(rollback)。中间的所有操作都是无效数据库,cmd里面显示的都是在内存里,没有真正进入表,从开启事务到 提交commit; 中间所有SQL操作才有效

一、事务概述

1.什么是事务

一件事情有n个组成单元 要不这n个组成单元同时成功 要不n个单元就同时失败

就是将n个组成单元放到一个事务中

2.mysql的事务

默认的事务:一条sql语句就是一个事务 默认就开启事务并提交事务

手动事务:

1)显示的开启一个事务:start transaction

2)事务提交:commit代表从开启事务到事务提交 中间的所有的sql都认为有效   真正的更新数据库

3)事务的回滚:rollback 代表事务的回滚 从开启事务到事务回滚 中间的所有的   sql操作都认为无效数据库没有被更新

开启事务后

7e7b27d8a3e3dea03ecc07daca9ba235.png

查询的所有命令都只是写在内存里,只有提交commit后 才会写入表内,rollback个人理解为清屏

一、JDBC事务操作

默认:自动事务:

执行sql语句:executeUpdate() ---- 每执行一次executeUpdate方法 代表     事务自动提交

通过jdbc的API手动事务:

开启事务:conn.setAutoComnmit(false);(默认:true)

提交。。:conn.commit();

回滚。。:conn.rollback();

注意:控制事务的connnection必须是同一个

执行sql的connection与开启事务的connnection必须是同一个才能对事务进行控制

建个Java项目  导包

b3d7827bbeec18c71ec40c496332a918.png

packagecom.oracle.demo01;//事务

importjava.sql.Connection;importjava.sql.SQLException;importjava.sql.Statement;importcom.oracle.tools.JDBCUtils;public classDemo01 {public static voidmain(String[] args) {//获取连接

Connection conn =JDBCUtils.getConn();

Statement sta= null;

String sql= "insert into account(aname,money) values('wangwu',1000)";//手动开启事务

try{

sta= conn.createStatement();//用statement 直接可以传值,不用占位//执行SQL前 手动开启事务

conn.setAutoCommit(false);//手动开启设置

sta.executeUpdate(sql);

}catch(SQLException e) {//回滚

try{

conn.rollback();

}catch(SQLException e1) {//TODO Auto-generated catch block

e1.printStackTrace();

}//TODO Auto-generated catch block

e.printStackTrace();

}finally { //注意位置

try{//提交事务

conn.commit();

}catch(SQLException e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

需要注意:

Statement用于将SQL语句发送到数据库中,有三种statement对象,它们都作为在给定连接执行SQL语句的包容器

statement、PreparedStatement(Statement 的子类)、CallableStatement(Statement的孙子),这爷仨都专用于发送特定类型SQL语句

①Statement:执行不带参的简单SQL,PreparedStatement执行

②PreparedStatement:执行带或不带IN参数预编译SQL

③CallableStatement:执行对数据库存储过程的调用

Statement接口提供执行语句和获取结果方法,PreparedStatement接口添加处理IN参数方法,CallableStatement添加OUT参数方法

一、DBUtils事务操作

1.QueryRunner

有参构造:QueryRunner runner = new QueryRunner(DataSource dataSource);

有参构造将数据源(连接池)作为参数传入QueryRunner,QueryRunner会从连      接池中获得一个数据库连接资源操作数据库,所以直接使用无Connection参数  的update方法即可操作数据库

无参构造:QueryRunner runner = new QueryRunner();

无参的构造没有将数据源(连接池)作为参数传入QueryRunner,那么我们在使   用QueryRunner对象操作数据库时要使用有Connection参数的方法

我们学习无参构造:有参无法保证connection唯一性,所以需要无参构造,并手动获取连接

代码 展示  新建个tool

packagecom.oracle.tools;importjava.sql.Connection;importjava.sql.SQLException;importjavax.sql.DataSource;importorg.apache.commons.dbcp.BasicDataSource;public classMyDBUtils {public static final String DRIVER = "com.mysql.jdbc.Driver";public static final String URL = "jdbc:mysql://localhost:3306/java0603?useUnicode=true&characterEncoding=UTF-8";public static final String USERNAME = "root";public static final String PASSWORD = "123456";/** 创建连接池BasicDataSource*/

public static BasicDataSource dataSource = newBasicDataSource();//静态代码块(优先只执行一次)

static{//对连接池对象 进行基本的配置

dataSource.setDriverClassName(DRIVER); //这是要连接的数据库的驱动

dataSource.setUrl(URL); //指定要连接的数据库地址

dataSource.setUsername(USERNAME); //指定要连接数据的用户名

dataSource.setPassword(PASSWORD); //指定要连接数据的密码

}/** 返回连接池对象*/

public staticDataSource getDataSource(){returndataSource;

}//返回一个连接对象

public staticConnection getConn(){

Connection conn=null;try{

conn=dataSource.getConnection();

}catch(SQLException e) {//TODO Auto-generated catch block

e.printStackTrace();

}returnconn;

}

}--------------------------------------------------

packagecom.oracle.demo01;//无参构造QueryRunner 事务

importjava.sql.Connection;importjava.sql.SQLException;importorg.apache.commons.dbutils.QueryRunner;importcom.oracle.tools.MyDBUtils;public classDemo02 {public static voidmain(String[] args) {//创建queryrunner对象

QueryRunner qr=newQueryRunner();//获取连接对象

Connection conn=MyDBUtils.getConn();

String sql="update account set money=money-? where aname=?";try{//开启事务

conn.setAutoCommit(false);//手动开启

qr.update(conn,sql,100,"zhangsan");//更改-100

} catch(SQLException e) {//回滚事务

try{

conn.rollback();//把回滚写到try里面,上面代码已有错误就会自动回到开启事务

} catch(SQLException e1) {//TODO Auto-generated catch block

e1.printStackTrace();

}//TODO Auto-generated catch block

e.printStackTrace();

}finally{ //不管对错,上面代码只要是对的,在这里就会执行//提交事务

try{

conn.commit();

}catch(SQLException e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}

}

}

转账项目,建个dynamic

导包

cbf61cd83e65ec4dff98497655e8ea6c.png

e9f6a351f9a6c254b0cc3c8dc9f1c146.png

新建jsp页面transfer.jsp

Insert title here转出账户:
转入账户:
转出金额:

packagecom.oracle.web;//获取文本框三个值

importjava.io.IOException;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importcom.oracle.service.AccountService;public class TransServlet extendsHttpServlet {private AccountService accountService=newAccountService();public void doGet(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {//解决中文乱码

request.setCharacterEncoding("UTF-8");//获取转出账户

String out=request.getParameter("out");//获取转入账户

String in=request.getParameter("in");//获取金额 从前台获取的任何数据类型 都是 String

String moneyStr=request.getParameter("money");//将字符串金额转为double

double money=Double.parseDouble(moneyStr);//将字符串转double 用parseDouble//调用service层转账方法

boolean flag=accountService.transfer(out, in, money);//解决response乱码

response.setContentType("text/htm;charset=utf-8");if(flag){ //判断

response.getWriter().write("转账成功");

}else{

response.getWriter().write("转账失败");

}

}public void doPost(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {

doGet(request, response);

}

}---------------------------------

packagecom.oracle.Dao;//用QueryRunner方法写dao层

importjava.sql.Connection;importjava.sql.SQLException;importorg.apache.commons.dbutils.QueryRunner;importcom.oracle.tools.MyDBUtils;public classAccountDao {//转出

public void Moneyout(Connection conn,String out,double money) throwsSQLException{//创建QueryRunner对象

QueryRunner qr=newQueryRunner();

String sql="update account set money=money-? where aname=?";

qr.update(conn,sql,money,out);

}//转入

public void Moneyin(Connection conn,String in,double money) throwsSQLException{//创建QueryRunner对象

QueryRunner qr=newQueryRunner();

String sql="update account set money=money+? where aname=?";

qr.update(conn,sql,money,in);

}

}------------------------------

packagecom.oracle.service;importjava.sql.Connection;importjava.sql.SQLException;importcom.oracle.Dao.AccountDao;importcom.oracle.tools.MyDBUtils;public classAccountService {private AccountDao accountDao=newAccountDao();//转账

public boolean transfer(String out,String in,doublemoney){//定义变量

boolean flag=true;//获取Conn连接对象

Connection conn=MyDBUtils.getConn();//调dao层方法

try{

accountDao.Moneyin(conn, out, money);

}catch(SQLException e2) {//TODO Auto-generated catch block

e2.printStackTrace();

}try{//开启事务

conn.setAutoCommit(false);

accountDao.Moneyin(conn,out, money);

accountDao.Moneyin(conn,in, money);

}catch(SQLException e) {

flag=false;try{

// 回滚:当try出现异常后会执行catch,然后回滚到开启事务之前

conn.rollback();

}catch(SQLException e1) {//TODO Auto-generated catch block

e1.printStackTrace();

}

e.printStackTrace();

}finally{//提交

try{

conn.commit();

}catch(SQLException e) {//TODO Auto-generated catch block

e.printStackTrace();

}

}returnflag;

}

}

商品管理页面的 增删改查

0df0e70b80bcaf2362e45c876ffd27b9.png 

4000cbce1b93b1f71097dac67b86aa38.png    先去分析JSP页面的内容,在逐步去实现功能所需要的Servlet

商品展示 新建 AdminProductListServlet

packagecom.oracle.web;//查

importjava.io.IOException;importjava.util.List;importjavax.servlet.ServletException;importjavax.servlet.http.HttpServlet;importjavax.servlet.http.HttpServletRequest;importjavax.servlet.http.HttpServletResponse;importcom.oracle.domain.Category;importcom.oracle.domain.Product;importcom.oracle.service.CategoryService;importcom.oracle.service.ProductService;public class AdminProductListServlet extendsHttpServlet {private CategoryService categoryService=newCategoryService();//后台的商品列表页面

private ProductService productService = newProductService();public void doGet(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {//获取商品列表

List list =productService.getAll();//获取所有分类List

List arr=categoryService.getCategory();//向域中存list

request.setAttribute("ProductList", list);

request.setAttribute("CategoryList", arr);//请求转发

request.getRequestDispatcher("/admin/product/list.jsp").forward(request, response);

}public void doPost(HttpServletRequest request, HttpServletResponse response) throwsServletException, IOException {

doGet(request, response);

}

}

修改admin/left.jsp

1

2

3

4

5

菜单

6

7 rel="stylesheet" type="text/css" />

8

9 href="${pageContext.request.contextPath}/css/dtree.css" type="text/css" />

10

11

12

13

14

15

16

17

18

19

20

21

22 展开所有 | 关闭所有

24

25

27

28 d = new dTree('d');29 d.add('01', -1, '系统菜单树');30 d.add('0102', '01', '分类管理', '', '', 'mainFrame');31 d32 .add(33 '010201',34 '0102',35 '分类管理',36 '${pageContext.request.contextPath}/admin/category/list.jsp',37 '', 'mainFrame');38 d.add('0104', '01', '商品管理');39 d40 .add(41 '010401',42 '0104',43 '商品管理',44 '${pageContext.request.contextPath}/AdminProductListServlet',45 '', 'mainFrame');46 document.write(d);47

48

49

50

51

52

53

在修改 product/list.jsp 用 遍历 所以先导入标签库,在进行商品遍历

--要用EL表达式 先导入标签库

window.location.href= "${pageContext.request.contextPath}/AddProductUIServlet";

}

function del(pid){

var isdel=confirm("确认删除吗?");if(isdel){

location.href= "${pageContext.request.contextPath}/DeleteProductServlet?pid="+pid;

}

}/*写一个匿名函数*/$(function(){

$("#is_hot option[value='${Condition.is_hot}']").prop("selected",true);

$("#cid option[value='${Condition.cid}']").prop("selected",true);

})

商品名称:是否热门:

请选择

所属分类:

请选择

${cate.cname }

商品列表

class="button_add" οnclick="addProduct()">

添加

style="FONT-WEIGHT: bold; FONT-SIZE: 12pt; HEIGHT: 25px; BACKGROUND-COLOR: #afd1f3">

序号商品图片商品名称商品价格是否热门编辑删除
${vs.count }%24%7Bpro.pimage%7D${pro.pname }${pro.market_price }${pro.is_hot==1?"是":"否" }

href="${ pageContext.request.contextPath }/EditProductServlet?pid=${pro.pid}">

src="${pageContext.request.contextPath}/images/i_edit.gif"border="0" style="CURSOR: hand">

src="${pageContext.request.contextPath}/images/i_del.gif"width="16" height="16" border="0" style="CURSOR: hand">

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值