发表于: 2018-03-02 22:32:45

1 541


今天完成的事情:今天把任务一回顾了一下,觉得之前dao模式写的不怎么好就重新写了一个DAO

一.设计数据库表

drop table if exists Student;

create table Student(
id int(11) not null primary key,
qqnumber VARCHAR(20) not null,
sNAME varchar(8) not null,
time TIMESTAMP not null,
school VARCHAR(10) not NULL,
link VARCHAR(20) not null,
hope VARCHAR(20) not null,
leader VARCHAR(8) not null
);

在这个用户表中定义了几个字段id,qqnumber,sNAME,time,school,link,hope,leader,其中id是主键表示的是你在修真院的学号,qqnumber表示qq号码,sNAME表示姓名,time是你进入修真院的时间,school表示你的毕业学校,link表示是你的链接,hope是你的个人期望,leader则是辅导你的师兄。

先在数据表中添加一点数据,这里效果我就不显示出来了。

二.定义实体类

定义一个bean,与数据表中的各个字段相对应:

package com.yuyi.jdbc;

import java.util.Date;

public class UserVo {
   private int id;
   private String qqnumber;
   private String sNAME;
   private Date time;
   private String school;
   private String link;
   private String hope;
   private String leader;
   
   public int getId() {
       return id;
   }
   
   public void setId(int id) {
       this.id=id;
   }
   
   public String getqqnumber() {
       return qqnumber;
   }
   
   public void setqqnumber(String qqnumber) {
       this.qqnumber=qqnumber;
   }
   
   public String getsNAME() {
       return sNAME;
   }
   
   public void setsNAME(String sNAME) {
       this.sNAME=sNAME;
   }
   
   public Date gettime() {
       return time;
   }
   
   public void settime(Date time) {
       this.time=time;
   }
   
   public String getschool() {
       return school;
   }
   
   public void setschool(String school) {
       this.school=school;
   }
   
   public String getlink() {
       return link;
   }
   
   public void setlink(String link) {
       this.link=link;
   }
   
   public String gethope() {
       return hope;
   }
   
   public void sethope(String hope) {
       this.hope=hope;
   }
   public String getleader() {
       return leader;
   }
   public void setleader(String leader) {
       this.leader=leader;
   }
   
   @Override
   public String toString() {
       return "UserVo[id="+id+",qqnumber="+qqnumber+",sNAME="+sNAME+",time="+time+",school="+school+",link="
               +link+",hope="+hope+",leader="+leader+"]";
   }
}

三.定义数据库连接类

package com.yuyi.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;

public class DButil {
    private static final String url="jdbc:mysql://127.0.0.1:3306/apply?"  
            + "user=root&password=628081&useUnicode=true&characterEncoding=UTF-8";  
    private static final String DRIVER = "com.mysql.jdbc.Driver";  
    
    public static Connection connectDB() throws Exception {  
        //1、加载数据库驱动  
        Class.forName(DRIVER);  
        //2、获取数据库连接  
        Connection conn = DriverManager.getConnection(url);  
          
        return conn;  
    }  
}

其中数据库的url,账户,密码根据你的实际情况写。

四.实现数据库的增删改查

实现数据库的连接后,就可以进行数据库的增删改查操作,创建一个UserDao类来操作数据库

先看查询操作,查询可以一次查询出所有的数据,也可以根据相应的条件查询。
查询所有的数据,在UserDao中定义一个queryAll()方法:

 public List<UserVo> queryAll() throws Exception {  
        Connection conn = DButil.connectDB();  
        String sql = "SELECT * FROM student";  
        List<UserVo> userList = new ArrayList<UserVo>();  
          
        Statement stmt = conn.createStatement();  
        ResultSet rs = stmt.executeQuery(sql);  
        while(rs.next()) {  
            UserVo user = new UserVo();  
            user.setId(rs.getInt("id"));  
            user.setqqnumber(rs.getString("qqnumber"));  
            user.setsNAME(rs.getString("sNAME"));  
            user.settime(rs.getDate("time"));  
            user.setlink(rs.getString("link"));  
            user.sethope(rs.getString("hope"));
            user.setleader(rs.getString("leader"));
            userList.add(user);  
        }  
          
        return userList;  
    }

这里使用Connection.createStatement()方法获取一个Statement对象,这个对象里面有很多的方法可以操作数据库,使用excuteQuery(String sql)执行查询操作,查询结果为一个结果集ResultSet,可以通过这个结果集获取相关的信息。

定义main函数:

public static void main(String[] args) {  
       @SuppressWarnings("rawtypes")
        UserDao dao = new UserDao();  
         
        try {  
            @SuppressWarnings("unchecked")
            List<UserVo> userList = dao.queryAll();  
            for(UserVo user : userList) {  
                System.out.println(user);  
            }  
        } catch (Exception e) {  
            e.printStackTrace();  
        }


根据条件查询,定义一个queryByParams方法:

public List<UserVo> queryByParams(List<Map<String, Object>> params) throws Exception {  
            Connection conn = DButil.connectDB();  
            StringBuilder sql = new StringBuilder("SELECT * FROM student WHERE id=3161 ");  
              
            for(Map<String, Object> param : params) {  
                sql.append(" and ");  
                sql.append(" " + param.get("col") + " ");  
                sql.append(" " + param.get("rel") + " ");  
                sql.append(" " + param.get("value") + " ");  
            }  
            System.out.println(sql.toString());  
              
            List<UserVo> userList = new ArrayList<UserVo>();  
              
            Statement stmt = conn.createStatement();  
            ResultSet rs = stmt.executeQuery(sql.toString());  
            while(rs.next()) {  
                UserVo user = new UserVo();  
                user.setId(rs.getInt("id"));  
                user.setqqnumber(rs.getString("qqnumber"));  
                user.setsNAME(rs.getString("sNAME"));  
                user.settime(rs.getDate("time"));  
                user.setlink(rs.getString("link"));  
                user.sethope(rs.getString("hope"));
                user.setleader(rs.getString("leader"));
                  
                userList.add(user);  
            }  
              
            return userList;  
        } 

这个方法可以自由选择查询的条件,只需要向方法中传入一个条件的List即可,这些条件都是由Map组成的,每一个Map包含三个元素,col表示查询条件对应哪一列,rel表示查询条件的关系是什么,value是指查询条件的值。这样写集成了多查询条件的方法,很多的业务下,查询的逻辑可能很多,这样写只用一个统一的方法就可以解决多种不同查询条件的业务逻辑。

再写一个简单的main函数测试一下:

List<Map<String, Object>> params = new ArrayList<Map<String,Object>>();  
       Map<String, Object> param1 = new HashMap<String, Object>();  
       param1.put("col", "sNAME");  
       param1.put("rel", "like");  
       param1.put("value", "'%王育奕%'");  
       params.add(param1);  
         
       Map<String, Object> param2 = new HashMap<String, Object>();  
       param2.put("col", "id");  
       param2.put("rel", "=");  
       param2.put("value", 3161);  
       params.add(param2);  
       try {  
           @SuppressWarnings("unchecked")
        List<UserVo> userList = dao.queryByParams(params);  
           for(UserVo user : userList) {  
               System.out.println(user);  
           }  
       } catch (Exception e) {  
           e.printStackTrace();  
       } 

2)增加

现在在UserDao中写一个addUser方法用于新增一条信息:

public void addUser(UserVo user) throws Exception {  
            Connection conn = DButil.connectDB();  
            String sql = "INSERT INTO student(id, qqnumber, sNAME, time,school,link,hope,leader) "  
                    + " VALUES(?, ?, ?, ?,?,?,?,?)";  
              
            PreparedStatement pstmt = conn.prepareStatement(sql);  
            pstmt.setInt(1, user.getId());  
            pstmt.setString(2, user.getqqnumber());  
            pstmt.setString(3, user.getsNAME());  
            pstmt.setDate(4,  new Date(new java.util.Date().getTime()));  
            pstmt.setString(5, user.getschool());  
            pstmt.setString(6,user.getlink());
            pstmt.setString(7, user.gethope());
            pstmt.setString(8, user.getleader());
            pstmt.execute();  
        } 
这个方法使用Connection.prepareStatement(String sql)方法获取一个PreparedStatement对象,使用这个方法可以传入带参数的SQL语句,而参数的值可以通过PreparedStatement.setXXX(int index, XXX value)的方法指定,其中XXX为各种不同的类型,index指定第几个参数的下标。指定了参数的值之后,便可以执行excute()方法执行SQL语句了。
接下来写一个main方法来验证这个增加的方法:

UserVo user = new UserVo();  
         
       user.setId(3136);  
       user.setqqnumber("2940165238");  
       user.setsNAME("肖捷");  
       user.setschool("上海交大");
       user.setlink("www.souhu.com");
       user.sethope("我很帅");
       user.setleader("王彤");
       try {  
           dao.addUser(user);  
       } catch (Exception e) {  
           e.printStackTrace();  
       } 

3)删除

接下来再写一个删除的方法,根据用户的id来删除数据:

 public void deleteUser(int id) throws Exception {  
            Connection conn = DButil.connectDB();  
            String sql = "DELETE FROM student WHERE id = ?";  
              
            PreparedStatement pstmt = conn.prepareStatement(sql);  
            pstmt.setInt(1, id);  
              
            pstmt.execute();  
        } 

验证:

try {  
           dao.deleteUser(3133);  
       } catch (Exception e) {  
           e.printStackTrace();  
       }

4)更新数据库

最后来看一下更新数据库:

public void updateUser(UserVO user) throws Exception {  
            Connection conn = DButil.connectDB();  
            String sql = "UPDATE student SET qqnumber=?, sNAME=?, time=?,school=?,link=?,hope=?,leader=?"  
                    + " WHERE id=?";  
              
            PreparedStatement pstmt = conn.prepareStatement(sql);  
            pstmt.setString(1, ((UserVo) user).getqqnumber());  
            pstmt.setString(2, ((UserVo) user).getsNAME());  
            pstmt.setDate(3,(Date) ((UserVo) user).gettime());  
            pstmt.setString(4, ((UserVo) user).getschool());  
            pstmt.setString(5, ((UserVo) user).getlink());
            pstmt.setString(6, ((UserVo) user).gethope());
            pstmt.setString(7, ((UserVo) user).getleader());
            pstmt.setInt(8, ((UserVo) user).getId());
            pstmt.executeUpdate();  
        } 

从SQL语句中可以看出更新也是根据用户的id进行选择性的更新的。

写一个main方法来验证:

user.setsNAME("Mary");  
       user.setschool("肯塔基大学");  
       user.sethope("I'm NO.1");  
       user.setId(3134);  
         
       try {  
           dao.updateUser(user);  
       } catch (Exception e) {  
           e.printStackTrace();  
       } 

执行结果:

UserVo[id=3134,qqnumber=2940165238,sNAME=Mary,time=2018-03-02,school=null,link=www.souhu.com,hope=I'm NO.1,leader=王彤]
UserVo[id=3135,qqnumber=2940165238,sNAME=肖捷,time=2018-03-02,school=null,link=www.souhu.com,hope=我很帅,leader=王彤]
UserVo[id=3136,qqnumber=2940165238,sNAME=肖捷,time=2018-03-02,school=null,link=www.souhu.com,hope=我很帅,leader=王彤]
UserVo[id=3160,qqnumber=2940141971,sNAME=燕小鱼,time=2018-03-02,school=null,link=www.baidu.com,hope=我思故我在,leader=任我行]
UserVo[id=3161,qqnumber=2940141252,sNAME=王育奕,time=2018-01-28,school=null,link=www.baidu.com,hope=老大最帅,leader=任我行]
UserVo[id=3162,qqnumber=2940141971,sNAME=燕小鱼,time=2018-01-26,school=null,link=www.baidu.com,hope=老大最帅,leader=任我行]
SELECT * FROM student WHERE id=3161  and  sNAME  like  '%王育奕%'  and  id  =  3161
UserVo[id=3161,qqnumber=2940141252,sNAME=王育奕,time=2018-01-28,school=null,link=www.baidu.com,hope=老大最帅,leader=任我行]


三、结语

由此使用JDBC连接MySQL数据库并进行基本的增删改查操作就已经完成了,这些只是最简单的数据库操作,其实我个人不是很喜欢,因为操作起来还是很麻烦,随著接下来的学习继续完善。


返回列表 返回列表
评论

    分享到