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操作都认为无效数据库没有被更新

开启事务后 

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

一、JDBC事务操作

默认:自动事务:

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

通过jdbc的API手动事务:

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

提交。。:conn.commit();

回滚。。:conn.rollback();

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

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

建个Java项目  导包

package com.oracle.demo01;
//事务
import java.sql.Connection;
import java.sql.SQLException;
import java.sql.Statement;

import com.oracle.tools.JDBCUtils;

public class Demo01 {
    public static void main(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

package com.oracle.tools;

import java.sql.Connection;
import java.sql.SQLException;

import javax.sql.DataSource;

import org.apache.commons.dbcp.BasicDataSource;

public class MyDBUtils {
    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 = new BasicDataSource();
    //静态代码块(优先只执行一次)
    static {
        //对连接池对象 进行基本的配置
        dataSource.setDriverClassName(DRIVER); // 这是要连接的数据库的驱动
        dataSource.setUrl(URL); //指定要连接的数据库地址
        dataSource.setUsername(USERNAME); //指定要连接数据的用户名
        dataSource.setPassword(PASSWORD); //指定要连接数据的密码
    }
    /*
     * 返回连接池对象
     */
    public static DataSource getDataSource(){
        return dataSource;        
    }
    
//    返回一个连接对象
    public static Connection getConn(){
        Connection conn=null;
        try {
            conn=dataSource.getConnection();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return conn;
    }
}
--------------------------------------------------
package com.oracle.demo01;
//无参构造QueryRunner 事务
import java.sql.Connection;
import java.sql.SQLException;
import org.apache.commons.dbutils.QueryRunner;
import com.oracle.tools.MyDBUtils;

public class Demo02 {
    public static void main(String[] args) {
//        创建queryrunner对象
        QueryRunner qr=new QueryRunner();
//        获取连接对象
        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 

导包

新建jsp页面 transfer.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>                <!-- 用el表达式 -->
    <form action="${pageContext.request.contextPath }/TransServlet" method="post">
        转出账户:<input type="text" name="out"><br>
        转入账户:<input type="text" name="in"><br>
        转出金额:<input type="text" name="money"><br>
        <input type="submit" name="确认"><br>
    </form>
</body>
</html>
package com.oracle.web;
//获取文本框三个值
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.oracle.service.AccountService;

public class TransServlet extends HttpServlet {
private AccountService accountService=new AccountService();
    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, 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) throws ServletException, IOException {
        doGet(request, response);
    }
}
---------------------------------
package com.oracle.Dao;
//用QueryRunner方法写dao层
import java.sql.Connection;
import java.sql.SQLException;

import org.apache.commons.dbutils.QueryRunner;

import com.oracle.tools.MyDBUtils;

public class AccountDao {
//    转出
    public void Moneyout(Connection conn,String out,double money) throws SQLException{
//        创建QueryRunner对象
        QueryRunner qr=new QueryRunner();
        
        String sql="update account set money=money-? where aname=?";
        qr.update(conn,sql,money,out);
    }
    //转入
    public void Moneyin(Connection conn,String in,double money) throws SQLException{
//        创建QueryRunner对象
        QueryRunner qr=new QueryRunner();
        String sql="update account set money=money+? where aname=?";
        qr.update(conn,sql,money,in);
    }
}
------------------------------
package com.oracle.service;

import java.sql.Connection;
import java.sql.SQLException;

import com.oracle.Dao.AccountDao;
import com.oracle.tools.MyDBUtils;

public class AccountService {
    private AccountDao accountDao=new AccountDao();
//    转账
    public boolean transfer(String out,String in,double money){
//        定义变量
        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(); } } return flag; } }

 商品增删改查

 Shop下web包内建个AdminProductListServlet

 

转载于:https://www.cnblogs.com/zs0322/p/11163090.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值