DBUtils实现优化转账

DButils:

    1.创建queryrunner
    2.编写sql
    3.执行sql

QueryRunner:

    构造:
        new QueryRunner(DataSource ds):自动事务
        new QueryRunner():手动事务
    常用方法:
        update(Connection conn,String sql,Object ... params):执行的cud操作
        query(Connection conn....):执行查询操作
    注意:

        一旦使用手动事务,调用方法的时候都需要手动传入connection,并且需要手动关闭连接

代码

servlet

package com.feizhu.web.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.feizhu.service.AccountService;
import com.feizhu.service.AccountService4DB;
import com.feizhu.service.AccountService4tl;

/**
 * 转账
 */
public class AccountServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        //设置编码
           request.setCharacterEncoding("utf-8");
           response.setContentType("text/html;charset=utf-8");
           PrintWriter w=response.getWriter();
        //接受三个参数
            String  fromUser=request.getParameter("fromuser");
            String  toUser=request.getParameter("touser");
            String  money=request.getParameter("money");
        //调用accountservice.account(fromuser,touser,money)  
            try {
                //new AccountService4tl().account(fromUser,toUser,money);
                new AccountService4DB().account(fromUser, toUser, money);
                //打印信息
                w.print("转账成功");
            } catch (Exception e) {
                
                e.printStackTrace();
                 w.print("转账失败");
            }
            
        
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        doGet(request, response);
    }
 

}

service

package com.feizhu.service;

import java.sql.Connection;

import com.feizhu.dao.AccountDao;
import com.feizhu.dao.AccountDao4DB;
import com.feizhu.dao.AccountDao4tl;
import com.feizhu.utils.DataSourceUtils;
import com.feizhu.utils.JdbcUtils;

public class AccountService4DB {

    /**
     *
     * @param fromUser
     *            转出方
     * @param toUser
     *            转入方
     * @param money
     *            金额
     * @throws Exception
     */

    public void account(String fromUser, String toUser, String money) throws Exception {

        AccountDao4DB dao = new AccountDao4DB();

        try {
            //开启事物
            DataSourceUtils.startTransaction();
            // 转出
            dao.accountOut(fromUser, money);
            
            int i=1/0;
            // 转入
            dao.accountIn(toUser, money);
            //事物提交
            DataSourceUtils.commitAndClose();
        } catch (Exception e) {
            e.printStackTrace();
            
            DataSourceUtils.rollbackAndClose();
            throw e;
        }

    }

}
 

dao:

package com.feizhu.dao;

import java.sql.SQLException;

import org.apache.commons.dbutils.QueryRunner;

import com.feizhu.utils.DataSourceUtils;

public class AccountDao4DB {

    public void accountOut(String fromUser, String money) throws Exception {
        //创建queryrunner
        QueryRunner qr=  new QueryRunner();
        
        //编写sql
        String sql="update account set money=money-? where user=?";
        
        //执行sql
        qr.update(DataSourceUtils.getConnection(),sql,money,fromUser);
    }

    public void accountIn(String toUser, String money) throws SQLException {
        QueryRunner qr=new QueryRunner();
        
        String sql="update account set money=money+? where user=?";
        qr.update(DataSourceUtils.getConnection(),sql,money,toUser);
    }

}

工具类:

package com.feizhu.utils;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import javax.sql.DataSource;

import com.mchange.v2.c3p0.ComboPooledDataSource;

public class DataSourceUtils {
      
      private static ComboPooledDataSource ds=new ComboPooledDataSource();
      
      private static ThreadLocal<Connection> tl=new ThreadLocal<>();
      /**
       *获取数据源
       * @return 连接
       */
       public  static DataSource getDataSource() {
           return ds;
       }
      /**
       * 从 当前线程上获取连接
       * @return
       * @throws SQLException
       */
       public static Connection getConnection() throws SQLException {
           Connection conn=tl.get();
           
           if(conn==null) {
               //第一次获取  创建一个连接和当前的线程绑定
               conn=ds.getConnection();
               
               //绑定
               tl.set(conn);
           }
           return conn;
       }
       
       /**
        * 释放连接
        * @param conn 连接
        */
       
       public static void closeConn(Connection conn) {
           if(conn!=null) {
               try {
                conn.close();
                //和当前的线程解绑
            } catch (SQLException e) {
                
                e.printStackTrace();
            }
               conn=null;
           }
       }
       
       /**
        *释放语句执行者
        * @param st 执行者
        */
       public static void closeStatement(PreparedStatement st) {
           if(st!=null) {
               try {
                st.close();
            } catch (SQLException e) {
                
                e.printStackTrace();
            }
              st=null;
           }
       }
       
       
       /**
        *释放结果集
        * @param rs 结果集
        */
       public static void closeResultSet(ResultSet rs) {
           if(rs!=null) {
               try {
                   rs.close();
            } catch (SQLException e) {
                
                e.printStackTrace();
            }
               rs=null;
           }
       }
       
       /**
        *
        * @param conn
        * @param st
        * @param rs
        */
       public static void closeRouse(Connection conn,PreparedStatement st,ResultSet rs) {
           closeRouse(st,rs);
           closeConn(conn);
       }
       
       public static void closeRouse(PreparedStatement st,ResultSet rs) {
           closeResultSet(rs);
           closeStatement(st);
       }
       
       /**
        * 开启事物
        * @throws SQLException
        */
       public static void  startTransaction() throws SQLException {
           //获取连接//开启事物
           getConnection().setAutoCommit(false);
       }
       
       //事物提交
       public static void commitAndClose() {
            //获取连接
            try {
                Connection conn=getConnection();
           //提交事物
                conn.commit();
           //释放资源
                conn.close();  
           //解除绑定
                tl.remove();
            } catch (SQLException e) {
                
                e.printStackTrace();
            }

       }
       
       /**
        * 事物回滚
        * @throws SQLException
        */
       
       //事物提交
       public static void rollbackAndClose() {
            //获取连接
            try {
                Connection conn=getConnection();
           //事物回滚
                conn.rollback();
           //释放资源
                conn.close();  
           //解除绑定
                tl.remove();
            } catch (SQLException e) {
                
                e.printStackTrace();
            }

       }
}

备注:由于个人原因,本博客暂停更新。如有问题可联系本人,本人提供技术指导、学习方向、学习路线。本人微信wlp1156107728(添加注明来意)   QQ1156107728(添加注明来意)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
首先,需要创建一个User类来封装用户信息,包括用户名、密码、邮箱等等。示例代码如下: ```java public class User { private String username; private String password; private String email; // 省略getter和setter方法 } ``` 然后,需要在数据库中创建一个表来保存用户信息,示例代码如下: ```sql CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(255) NOT NULL, `password` varchar(255) NOT NULL, `email` varchar(255) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; ``` 接下来,使用DButils实现注册功能。示例代码如下: ```java public class UserDao { private QueryRunner runner = new QueryRunner(DBUtils.getDataSource()); /** * 添加用户 * @param user 用户信息 * @throws SQLException */ public void addUser(User user) throws SQLException { String sql = "INSERT INTO user(username, password, email) VALUES(?, ?, ?)"; runner.update(sql, user.getUsername(), user.getPassword(), user.getEmail()); } /** * 根据用户名查找用户 * @param username 用户名 * @return 用户信息 * @throws SQLException */ public User findUserByUsername(String username) throws SQLException { String sql = "SELECT * FROM user WHERE username = ?"; return runner.query(sql, new BeanHandler<>(User.class), username); } } ``` 在Servlet中调用上述代码来实现注册功能。示例代码如下: ```java public class RegisterServlet extends HttpServlet { private UserDao userDao = new UserDao(); @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("UTF-8"); resp.setContentType("text/html;charset=UTF-8"); String username = req.getParameter("username"); String password = req.getParameter("password"); String email = req.getParameter("email"); // 校验用户名是否已存在 try { User user = userDao.findUserByUsername(username); if (user != null) { resp.getWriter().write("用户名已存在"); return; } } catch (SQLException e) { e.printStackTrace(); resp.getWriter().write("注册失败"); return; } // 添加用户 User user = new User(); user.setUsername(username); user.setPassword(password); user.setEmail(email); try { userDao.addUser(user); resp.getWriter().write("注册成功"); } catch (SQLException e) { e.printStackTrace(); resp.getWriter().write("注册失败"); } } } ``` 以上就是使用DButils实现注册功能的示例代码,希望能对您有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值