JAVA基础一大堆0811数据库

  我这个人比较懒,前面的几篇博客,说实话一点都没有走心。拷贝代码然后粘贴代码最多加个动态图或者图片啥的,意思意思就完事了。看了朋友的几篇博客我内心完完全全感觉羞羞哒╮(╯▽╰)╭,都是一起学习的怎么差距咋就辣么大捏,所以我试探着打算今天好好写写今天的总结。效果好不好的,我也不能打包票以后一直都仔细的做每天的学习总结,毕竟我懒。。。题外话:今儿和女朋友打闹竟然被她给制服了(掰手指。。。还是我教的那货),我1米8的个儿真是白长了。。。。自己都无力吐槽,扑街-。-
  今儿讲的啥来着,好像又在昨天数据库的基础上+了几个内容。上午写了一个单例设计模式和MVC设计模式,还有一个事务。下午貌似整了个tomcat还是啥来着,至今没搞懂。
  一点一点整理吧,先把上午的单例设计模式和MVC设计模式搞出来。
代码部分:
在昨天的SignIn的基础上做了一些修改,把原来写在SignIn类里面的Button方法给单独提出来了,原来的方法是

    btnSignIn.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String userName=textFielduserName.getText();
                String password=textFieldpassword.getText();
                Statement state=SQLManager.newInstance().getStatement();
                String sql="select * from user where name='"+userName+"' and password='"+password+"'";
                try {
                    ResultSet set=state.executeQuery(sql);
                    set.last();
                    int num=set.getRow();
                    System.out.println(num);
                    if(num==1){
                        System.out.println("登录成功");
                    }else{
                        System.out.println("登录失败");
                    }

                } catch (SQLException e1) {
                    e1.printStackTrace();
                }
            }
        });
  然后现在呢,把方法提出来又建立了一个类SQLOperate
    import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class SQLOperate {
    public static SQLOperate sqlOprate;
    //单例设计模式私有化构造器,不允许别人用这个构造器创建对象
    private SQLOperate() {

    }
    public static synchronized SQLOperate newInstance() {
        if (sqlOprate == null) {
            sqlOprate = new SQLOperate();
        }
        return sqlOprate;
    }
    /**
     * 登录的方法
     * @param 传入userName的内容
     * @param 传入password的内容
     * @return  如果数据库中存在,则返回true,否则返回false
     */
    public boolean SignIn(String userName, String password) {
        Connection conn = SQLManager.newInstance().getConnection();
        try {
            if(!conn.isClosed()){
            PreparedStatement state = conn.prepareStatement("select * from user where name=? and password=?");
            state.setString(1, userName);//1表示第一个问号,2同理
            state.setString(2, password);
            ResultSet set = state.executeQuery();
            set.last();
            int num = set.getRow();
            return num==1;
            }
        } catch (SQLException e1) {
            e1.printStackTrace();
        }
        return false;
    }
}

  然后原来的方法就变成了下面的样子

btnSignIn.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                String userName=textFielduserName.getText();
                String password=textFieldpassword.getText();
                boolean isSignIn=SQLOperate.newInstance().SignIn(userName, password);
                if(isSignIn){
                    System.out.println("登录成功");
                }else{
                    System.out.println("登录失败");
                }
            }
        });

  运行后避免了一个昨天那种方法会出现的错误:如果在password里面输入fdafdsak’or1=’1的话,会在没有正确账号密码的情况下进入数据库(刚才在弄代码的时候又忘记了导包,报错了以后才想起来)。然后呢,今儿用的这家伙Connection接口里面的PreparedStatement()方法能够创建一个 PreparedStatement 对象来将参数化的 SQL 语句发送到数据库。然后就不会出现刚说的那个漏洞了,具体怎么理解就看自己了,API上写的东西都太难理解。
  再然后呢,一开始说的单例设计模式还有MVC设计模式在上面都有体现。单例模式明显就体现在SQLOperate里面了:私有化构造器(禁止利用他的构造器来构造对象,只允许自己用这个构造器),然后构造静态属性(只构造一个静态属性)静态方法、然后就该咋整咋整了。MVC设计模式老师讲的是将 Model View Control三个方面的代码分开写。比如上面举得例子,就是讲View和Control分开了。
  事务这一块老师也讲的不多,举了一个提款机的例子:银行ATM提款 输入金额-服务器-播放录音-打开取钱口-吐钱-取款完毕
  只要其中一条断了,他前面的流程全部回滚。就算是取款口刚要打开的时候断电了,你钱没有取出来,这会儿系统也会一步一步把之前的步骤都恢复回原来的样子,你的钱还是一分没少。
具体的例子:

    btnNewButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                String sql = "insert into user(name,password)values('lis','123')";
                String sq2 = "insert into user(name,password)values('liwu','132')";
                //故意写错sq3,如果上面两条也没有添加成功,说明这个事务创建成功
                String sq3 = "insert into (name,password)values('liliu','321')";
                String sq4 = "insert into user(name,password)values('liqi','231')";
                Connection conn=SQLManager.newInstance().getConnection();
                try {
                    Statement state=conn.createStatement();
                    conn.setAutoCommit(false);
                    //添加到表中最后一次执行,比单个excute效率高
                    state.addBatch(sql);
                    state.addBatch(sq2);
                    state.addBatch(sq3);
                    state.addBatch(sq4);
                    state.executeBatch();
                    conn.commit();
                    System.out.println("事务运行完成");
                } catch (SQLException e1) {
                    // TODO Auto-generated catch block
                    e1.printStackTrace();
                }

            }
        });

  sql3我故意写错了,因为他写错了,所以原来能添加的记录也取消了。如果不加conn.setAutoCommit(false)和conn.commit()的话,state.addBatch(sql);state.addBatch(sq2);都可以执行添加一条记录。

  上午差不多就是这么多了。下午学的内容。。。说实话我还真不知道是干啥的。就是在java EE模式下新建了一个Dynamic Web Object,然后又在他下面新建了一个servlet文件,然后写了一堆莫名其妙的代码。。。。其中还把text file encoding改成了UTF-8。

import java.io.UnsupportedEncodingException;
//浏览器默认格式为ISO-8859-1,此类将浏览器格式改为UTF-8
public class Encoding {
    public static String doEncoding(String string){
        try {
            byte[] array=string.getBytes("ISO-8859-1");
            string=new String(array,"UTF-8");
        } catch (UnsupportedEncodingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return string;
    }
}


import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet implementation class MyTestServlet
 */
@WebServlet("/MyTestServlet")
public class MyTestServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public MyTestServlet() {
        super();
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String userName=request.getParameter("username");
        String password=request.getParameter("password");
        userName=Encoding.doEncoding(userName);
        System.out.println(userName+":"+password);

        String s="用户名:"+userName+",密码: "+password;
        //让浏览器以UTF-8编码格式解析
        response.setHeader("Content-type", "text/html;charset=UTF-8");
        response.getWriter().append(s);
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}

这里写图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值