我这个人比较懒,前面的几篇博客,说实话一点都没有走心。拷贝代码然后粘贴代码最多加个动态图或者图片啥的,意思意思就完事了。看了朋友的几篇博客我内心完完全全感觉羞羞哒╮(╯▽╰)╭,都是一起学习的怎么差距咋就辣么大捏,所以我试探着打算今天好好写写今天的总结。效果好不好的,我也不能打包票以后一直都仔细的做每天的学习总结,毕竟我懒。。。题外话:今儿和女朋友打闹竟然被她给制服了(掰手指。。。还是我教的那货),我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);
}
}