JDBC(二)JDBC中增删改查

方法一:

1. 定义学生类:

作用:与数据库的内容相同,控制层调用此类方法,数据库查询数据封装为Student对象,在把Student对象传进数组中
格式:私有属性;构造有参无参方法,get和set方法,加一个toString()方法
这里使用时Integer非int,因为integer默认值是null,而int默认为0,防止数组库中有null,
int和integer区别

package com.www.domain;

import javax.xml.crypto.Data;

public class Student {
    private Integer sid;
    private String last_name;
    private Integer age;
    //private Data birthday;

    public Student() {
    }

    public Student(Integer sid, String last_name, Integer age) {
        this.sid = sid;
        this.last_name = last_name;
        this.age = age;
       // this.birthday = birthday;
    }

    public Integer getSid() {
        return sid;
    }

    public String getLast_name() {
        return last_name;
    }

    public Integer getAge() {
        return age;
    }

//    public Data getBirthday() {
//        return birthday;
//    }

    public void setSid(Integer sid) {
        this.sid = sid;
    }

    public void setLast_name(String last_name) {
        this.last_name = last_name;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    /*public void setBirthday(Data birthday) {
        this.birthday = birthday;
    }*/

    @Override
    public String toString() {
        return "Student{" +
                "sid=" + sid +
                ", last_name='" + last_name + '\'' +
                ", age=" + age +
                '}';
    }
}

2.1. 学生类接口(包是dao):–相当于dao层,进行业务判断和数据库存取

作用:只写抽象方法(增删改查),具体类有学生类方法实现去解决:类似jdbc和各数据库厂家模式一样;

package com.www.dao;
import com.www.domain.Student;

import java.util.ArrayList;
//抽象类接口,不写具体方法
public interface StudnetDao {
    //查询所有学生信息
    public abstract ArrayList<Student> findAll();
    //条件查询,根据id获取学生信息
    public abstract Student findById(Integer id);
    //新增学生信息
    public abstract  int  insert(Student stu);
    //修改学生信息
    public abstract int update(String stu);

    //删除学生信息
    public abstract int delete(Integer id);
}

2.2. 学生类具体实现方法(包是dao):—相当于模型,进行业务判断和数据库存取

作用:具体些增删改差的实现方法,如何连接数据库,如何编写sql语句去实现查询:

package com.www.dao;

import com.www.domain.Student;

import java.sql.*;
import java.util.ArrayList;

public  class StudentDaolmpl implements StudnetDao {
    ArrayList<Student> list = new ArrayList<>();
    Connection con = null;
    Statement stat = null;
    ResultSet rs = null;

    //查询所有学生信息
    public ArrayList<Student> findAll() {
        try {
            //    第一步:注册驱动:
            Class.forName("com.mysql.jdbc.Driver");
//    第二步:获取连接
            con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/dbtest14", "root", "wqy13955665397");
//    第三步:获取数据库操作对象
            stat = con.createStatement();
//    第四步:执行sql语句
            String sql = "SELECT * FROM student";
            rs = stat.executeQuery(sql);
//    第五步:处理查询结果集
            while (rs.next()) {
                Integer sid = rs.getInt("sid");
                String name = rs.getString("last_name");
                Integer age = rs.getInt("age");
                // Date birthday =   rs.getDate("birthday");

                //封装Student对象
                Student stu = new Student(sid, name, age);
                //将Student对象保持在集合里
                list.add(stu);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {//finally是必须执行的、这里面注意一点是finally不能使用try语句变量,所以要申请全局变量
            //第六步:释放资源(使用完一定要关闭)
            if (con != null) {//在进行判断一下是否为null
                try {
                    con.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (stat != null) {
                try {
                    stat.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            //将结果集对象返回
            return list;
        }

    }

    //条件查询,根据id获取学生信息
    @Override
    public Student findById(Integer id) {
        Student stu = new Student();
        try {
            //    第一步:注册驱动:
            Class.forName("com.mysql.jdbc.Driver");
//    第二步:获取连接
            con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/dbtest14", "root", "wqy13955665397");
//    第三步:获取数据库操作对象
            stat = con.createStatement();
//    第四步:执行sql语句
            String sql = "SELECT * FROM student WHERE sid='" + id + "'";//把id对象传进去
            rs = stat.executeQuery(sql);
//    第五步:处理查询结果集
            while (rs.next()) {
                Integer sid = rs.getInt("sid");
                String name = rs.getString("last_name");
                Integer age = rs.getInt("age");
                // Date birthday =   rs.getDate("birthday");

                //封装Student对象
                stu.setSid(sid);
                stu.setLast_name(name);
                stu.setAge(age);
                //将Student对象保持在集合里
                list.add(stu);
            }

        } catch (Exception e) {
            e.printStackTrace();
        } finally {//finally是必须执行的、这里面注意一点是finally不能使用try语句变量,所以要申请全局变量
            //第六步:释放资源(使用完一定要关闭)
            if (con != null) {//在进行判断一下是否为null
                try {
                    con.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (stat != null) {
                try {
                    stat.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            //将结果集对象返回
            return stu;
        }
    }

    //新增学生信息
    @Override
    public int insert(Student stu) {

        int result = 0;
        try {
            //    第一步:注册驱动:
            Class.forName("com.mysql.jdbc.Driver");
//    第二步:获取连接
            con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/dbtest14", "root", "wqy13955665397");
//    第三步:获取数据库操作对象
            stat = con.createStatement();
//    第四步:执行sql语句
            //转换时间格式
//            Date d =stu.getBirthday();
//            SimpleDateFormat sdf =new  SimpleDateFormat("yyyy-MM-dd");
//            String birthday = sdf.format(d);
            String sql = "INSERT INTO student VALUES('" + stu.getSid()+ "','" + stu.getLast_name() + "','" + stu.getAge() + "')";//把id对象传进去
            result = stat.executeUpdate(sql);//赋值


        } catch (Exception e) {
            e.printStackTrace();
        } finally {//finally是必须执行的、这里面注意一点是finally不能使用try语句变量,所以要申请全局变量
            //第六步:释放资源(使用完一定要关闭)
            if (con != null) {//在进行判断一下是否为null
                try {
                    con.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (stat != null) {
                try {
                    stat.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

        }
        return result;
    }
    //修改学生信息
    @Override
    public int update(String stu) {
        int result = 0;
        try {
            //    第一步:注册驱动:
            Class.forName("com.mysql.jdbc.Driver");
//    第二步:获取连接
            con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/dbtest14", "root", "wqy13955665397");
//    第三步:获取数据库操作对象
            stat = con.createStatement();
//    第四步:执行sql语句
            //转换时间格式
//            Date d =stu.getBirthday();
//            SimpleDateFormat sdf =new  SimpleDateFormat("yyyy-MM-dd");
//            String birthday = sdf.format(d);
            String sql = "UPDATE  student SET sid='"+stu.getSid()+"',name='"+stu.getLast_name()+"',age='"+stu.getAge()+"' WHERE sid='"+stu.getSid()+"')";//把id对象传进去
            result = stat.executeUpdate(sql);//赋值


        } catch (Exception e) {
            e.printStackTrace();
        } finally {//finally是必须执行的、这里面注意一点是finally不能使用try语句变量,所以要申请全局变量
            //第六步:释放资源(使用完一定要关闭)
            if (con != null) {//在进行判断一下是否为null
                try {
                    con.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (stat != null) {
                try {
                    stat.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

        }
        return result;
    }



    //删除学生信息
    @Override
    public int delete(Integer id) {

        int result = 0;
        try {
            //    第一步:注册驱动:
            Class.forName("com.mysql.jdbc.Driver");
//    第二步:获取连接
            con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/dbtest14", "root", "wqy13955665397");
//    第三步:获取数据库操作对象
            stat = con.createStatement();
//    第四步:执行sql语句
            //转换时间格式
//            Date d =stu.getBirthday();
//            SimpleDateFormat sdf =new  SimpleDateFormat("yyyy-MM-dd");
//            String birthday = sdf.format(d);
            String sql = "DELETE FROM student WHERE sid='"+id+"'";//把id对象传进去
            result = stat.executeUpdate(sql);//赋值


        } catch (Exception e) {
            e.printStackTrace();
        } finally {//finally是必须执行的、这里面注意一点是finally不能使用try语句变量,所以要申请全局变量
            //第六步:释放资源(使用完一定要关闭)
            if (con != null) {//在进行判断一下是否为null
                try {
                    con.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            if (stat != null) {
                try {
                    stat.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

        }
        return result;
    }

}

分析:

一:查询学生信息,
前面的注册,连接,获取数据库操作对象都是一样的流程;主要查询结果需要封装数据对象
rs.getString(“last_name”)是把数据库的内容传进 String name ,然后再把这数据封装到student对象集中。

 Integer sid = rs.getInt("sid");
                String name = rs.getString("last_name");
                Integer age = rs.getInt("age");
                // Date birthday =   rs.getDate("birthday");

                //封装Student对象
                Student stu = new Student(sid, name, age);
                //将Student对象保持在集合里
                list.add(stu);
Integer sid = rs.getInt("sid");
                String name = rs.getString("last_name");
                Integer age = rs.getInt("age");
                // Date birthday =   rs.getDate("birthday");

                //封装Student对象
                Student stu = new Student(sid, name, age);
                //将Student对象保持在集合里
                list.add(stu);

二:新增信息,修改学生信息,删除信息(最大不同就是sql语句不同)
public int insert(Student stu) {},Student stu是把控制层输入的对象传进来,所以这里面肯定需要获取这些数据的方法;stu.getAge()

String sql = "INSERT INTO student VALUES('" + stu.getSid()+ "','" + stu.getLast_name() + "','" + stu.getAge() + "')";//把id对象传进去

类似:把自己输入的id对象传进去方法:sid=’" + id + "

"SELECT * FROM student WHERE sid='" + id + "'"

需要反馈信息:int execuUpdate(String sql)
int可以返回影响的行数;所以数据修改成功返回数据,控制层判断是否为0就可以知道是否修改成功了

int result =0;
 result = stat.executeUpdate(sql);//赋值

工具类

上述代码重复特别多,采用工具模式简化代码:
地址:https://blog.csdn.net/gun_wqy/article/details/123731945

3:1 服务层接口(包是service):

作用:学生类主要和数据库打交道,service主要和servlet打交道。应该就是那种降低关联吧

package com.www.service;

import com.www.domain.Student;

import java.util.ArrayList;

public interface StudnetService {
    //查询所有学生信息
    public abstract ArrayList<Student> findAll();
    //条件查询,根据id获取学生信息
    public abstract Student findById(Integer id);
    //新增学生信息
    public abstract int insert(Student stu);
    //修改学生信息
    public abstract int update(String stu);
    //删除学生信息
    public abstract int delete(Integer id);
}

3.2: 服务层接口(包是service):

作用:服务接口的具体实现方法

package com.www.service;

import com.www.dao.StudentDaolmpl;
import com.www.domain.*;
import com.www.dao.StudnetDao;
import java.util.ArrayList;

public class StudentServicelmpl implements StudnetService {
    private StudnetDao Dao = new StudentDaolmpl();

        //查询所有学生信息
        @Override
        public ArrayList<Student> findAll() {

            return Dao.findAll();
        }
        //条件查询,根据id获取学生信息
        @Override
        public Student findById(Integer id) {
            return Dao.findById(id);
        }
        //新增学生信息
        @Override
        public int insert(Student stu) {
            return Dao.insert(stu) ;
        }
        //修改学生信息
        @Override
        public int update(String stu) {
            return Dao.update(stu);
        }
        //删除学生信息
        @Override
        public int delete(Integer id) {
            return Dao.delete(id);
        }


}

4.1测试类:–控制层

package com.www.contorller;
import com.sun.scenario.effect.impl.sw.sse.SSEBlend_SRC_OUTPeer;
import com.www.service.StudentServicelmpl;
import com.www.service.StudnetService;
import com.www.domain.Student;
import org.testng.annotations.Test;
//import org.junit.Test;
import java.util.ArrayList;
import java.util.Scanner;

public class StudentController {
    private StudnetService service = new StudentServicelmpl();
        //查询所有学生信息
        @Test
        public void  findAll() {
            ArrayList<Student> list = service.findAll();
            for (Student stu : list) {
                System.out.println(stu);
            }
        }

        //条件查询,根据id获取学生信息
        @Test
        public void findById() {


           Student stu =service.findById(3);
            System.out.println(stu);
        }

        //新增学生信息
        @Test
        public void insert() {
          Student stu =new Student(15,"刘备",32);
          int result = service.insert(stu);
          if (result!=0){
              System.out.println("添加成功");
          }else
              System.out.println("添加失败");
        }

        //修改学生信息
        @Test
        public void update(String stu) {
            Student stu2 =service.findById(15);
            stu2.setLast_name("韩信");
            int result =service.update(stu);
            if (result!=0){
                System.out.println("修改成功");
            }else{
                System.out.println("修改失败");
            }
        }

        //删除学生信息
        @Test
        public int delete(Integer id) {
            int result=service.delete(15);
            if (result!=0){
                System.out.println("删除成功");
            }else{
                System.out.println("删除失败");
            }
            return result;
        }
}

分析:

MVC框架的dao层、service层和controller层之间的区别与联系
从查询方法为例:从控制层开始:
第一步:findAll()函数创建一个ArrayList 数组,调用服务层的方法findAll(),

  ArrayList<Student> list = service.findAll();

第二步:进入服务层方法findAll(), 返回Dao.findAll()数据,以 ArrayList形式返回

    public ArrayList<Student> findAll() {

            return Dao.findAll();
        }

第三步:进入dao 层,就是调用学生类的具体实现方法,因为第一步要求返回的值是 数组,所以这个方法返回的和之前一样,方法为public ArrayList findAll() {},该方法里面就是实现连接数据的六步操作;在JDBC (一)中有解释,最主要不同就sql语句的不同。

问题

一:JUnit-4.11使用报java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing错误:
原因:错误是缺少hamcrest的包

hamcrest的包的下载地址:http://www.java2s.com/Code/Jar/h/Downloadhamcrestcore13jar.htm#google_vignette

二;测试可以使用Junit包,也可以导入:import org.testng.annotations.Test;

三:java连接数据库时间格式转换问题:
在这里插入图片描述
报错:java.sql.Datae cannot be cast to javacx.xml.crypte.Date在这里插入图片描述

解决方法:去掉时间之后就运行成功了(正在探索)
在这里插入图片描述

四:修改数据方法中莫名奇妙找不到方法(解决不了)
在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

gun_wqy

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值