JavaWeb09-JDBC实现CRUD并用Junit进行单元测试

什么是JDBC?

JDBC可以理解为Java DataBase Connection,就是用来连接数据库的,我们要做持久层操作,必须连接数据库,JDBC就是用来充当用户和数据库之间的那个桥梁。

直接上案例

架构:

 数据库 id主键自增

User.class 我写了两个有参构造器,有一个不用赋值id,因为它自增了,执行插入数据的时候不能插入id

import java.util.Objects;

public class User {
    private  int id;
    private  String name;
    private  int age;
    private  String sex;

    public User() {
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        User user = (User) o;
        return id == user.id && age == user.age && Objects.equals(name, user.name) && Objects.equals(sex, user.sex);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, name, age, sex);
    }

    public User(String name, int age, String sex) {

        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    public User(int id, String name, int age, String sex) {
        this.id = id;
        this.name = name;
        this.age = age;
        this.sex = sex;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

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

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                '}';
    }
}

UserDao.class


public interface  UserDao {
        void insertStudent(User user);//插入
        void deleteById(int id);//删除
        void updateStudent(User user);//修改
        User selectById(int id);//根据id查询
        User selectByname(String name);//根据name查询
}

UserDaoImpl.class 

import com.wjc.Dao.UserDao;
import com.wjc.pojo.User;

import java.sql.*;

public class UserDaoImpl implements UserDao {
    static final String url = "jdbc:mysql://localhost:3306/ssm?useUnicode=true&characterEncoding=utf8&useSSL=true&serverTimezone=UTC";
    static final String username = "root";
    static final String password = "111111";
    static   Connection connection = null;
    static   PreparedStatement statement = null;
    @Override
    public void insertStudent(User user) {
        try {
            //1.加载驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2.连接数据库
            connection = DriverManager.getConnection(url, username, password);
            String sql = "INSERT INTO user(name,age,sex) values(?,?,?)";
            //预编译
            statement = connection.prepareStatement(sql);
            statement.setString(1, user.getName());
            statement.setInt(2, user.getAge());
            statement.setString(3, user.getSex());
            //执行sql
            int i = statement.executeUpdate();
            if (i > 0) {
                System.out.println("插入成功");
            }
            //关闭资源
            if (statement != null) {
                statement.close();
            }
            if (connection != null) {
                statement.close();
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }

    @Override
    public void deleteById(int id) {
        try {
            //1.加载驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2.连接数据库
            connection = DriverManager.getConnection(url, username, password);
            String sql = "DELETE  FROM  user  Where id=?";
            //预编译
            statement = connection.prepareStatement(sql);
            statement.setInt(1, id);
            //执行sql
            int i = statement.executeUpdate();
            if (i > 0) {
                System.out.println("删除成功");
            }
            //关闭资源
            if (statement != null) {
                statement.close();
            }
            if (connection != null) {
                statement.close();
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }


    @Override
    public void updateStudent(User user) {
        try {
            //1.加载驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2.连接数据库
            connection = DriverManager.getConnection(url, username, password);
            String sql = "UPDATE user SET name=?,age=?,sex=? WHERE id=?";
            //预编译
            statement = connection.prepareStatement(sql);
            statement.setString(1, user.getName());
            statement.setInt(2, user.getAge());
            statement.setString(3, user.getSex());
            statement.setInt(4, user.getId());
            //执行sql
            int i = statement.executeUpdate();
            if (i > 0) {
                System.out.println("更新成功");
            }
            //关闭资源
            if (statement != null) {
                statement.close();
            }
            if (connection != null) {
                statement.close();
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }

    }

    @Override
    public User selectById(int id) {
        User user=new User();
        try {
            //1.加载驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2.连接数据库
            connection = DriverManager.getConnection(url, username, password);
            String sql = "SELECT * FROM  user  where id=?";
            //预编译
            statement = connection.prepareStatement(sql);
            statement.setInt(1, id);
            //执行sql
            ResultSet resultSet = statement.executeQuery();
            while (resultSet.next()) {
                user.setId(resultSet.getInt("id"));
                user.setName(resultSet.getString("name"));
                user.setAge(resultSet.getInt("age"));
                user.setSex(resultSet.getString("sex"));
                System.out.println("id=" + resultSet.getInt("id"));
                System.out.println("name=" + resultSet.getString("name"));
                System.out.println("age=" + resultSet.getInt("age"));
                System.out.println("sex=" + resultSet.getString("sex"));
            }

            //关闭资源
            if (statement != null) {
                statement.close();
            }
            if (connection != null) {
                statement.close();
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return user;
    }

    @Override
    public User selectByname(String name) {
        User user=new User();
        try {
            //1.加载驱动
            Class.forName("com.mysql.cj.jdbc.Driver");
            //2.连接数据库
            connection = DriverManager.getConnection(url, username, password);
            String sql = "SELECT * FROM  user  where name=?";
            //预编译
            statement = connection.prepareStatement(sql);
            statement.setString(1, name);
            //执行sql
            ResultSet resultSet = statement.executeQuery();
            while (resultSet.next()) {
                user.setId(resultSet.getInt("id"));
                user.setName(resultSet.getString("name"));
                user.setAge(resultSet.getInt("age"));
                user.setSex(resultSet.getString("sex"));
                System.out.println("id=" + resultSet.getInt("id"));
                System.out.println("name=" + resultSet.getString("name"));
                System.out.println("age=" + resultSet.getInt("age"));
                System.out.println("sex=" + resultSet.getString("sex"));
            }

            //关闭资源
            if (statement != null) {
                statement.close();
            }
            if (connection != null) {
                statement.close();
            }

        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return user;
    }
}

测试类

import com.wjc.pojo.User;
import org.junit.Assert;
import org.junit.Test;



public class CrudTest {
    @Test
    public  void inserttest() {
        User user = new User("wjc", 18, "男");
        UserDaoImpl userDao=new UserDaoImpl();
        userDao.insertStudent(user);
        //如果能够获取id 说明插入数据成功
        Assert.assertTrue(userDao.selectByname("wjc").getId()>0);
    }
    @Test
    public  void deletetest() {
    UserDaoImpl userDao=new UserDaoImpl();
    userDao.deleteById(5);
    //调用userDao的按id查询的方法,查询为空说明删除成功
        User user = userDao.selectById(5);
        Assert.assertEquals(user.getId(),0);
    }

    @Test
    public  void updatetest(){
        User user = new User(5, "小红更新", 21, "女");
        UserDaoImpl userDao=new UserDaoImpl();
        userDao.updateStudent(user);
        //
        Assert.assertEquals(userDao.selectById(5),user);
    }
    @Test
    public  void selectByIdtest(){
        UserDaoImpl userDao=new UserDaoImpl();
        User user1 = userDao.selectById(1);
        //如果user1里的id和查询的id相同,贼查询成功
        //注意,要用equals的话要重写user的equals方法
        Assert.assertEquals(user1.getId(),1);
    }
    @Test
    public  void selectByNametest(){
        UserDaoImpl userDao=new UserDaoImpl();
        User user = userDao.selectByname("albaa");
        //name相同则成功
        Assert.assertEquals(user.getName(),"albaa");
    }
}

总结:JDBC一般用预编译PreparedStatement,防止sql注入。

补充:数据库在对prepareStatement进行预编译后,会将用户穿进来的and 或者or等操作数据库的操作视为普通的字符串,以此达到防止SQL注入的目的。这样就算参数中包含破环性语句(or ‘1=1’)也不会被执行。

executeUpdate()执行增删改操作,executeQuery()执行查询。 JDBC里每次使用sql都要编写sql语句,注入,执行,然后sql语句庞大的,就十分繁琐了。

使用junit断言的时候要合适使用,并理解assertSame和assertEquals的区别,用assertEquals要重写equals方法,否则跟assertSame一样还是比较引用相等

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

JagTom

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

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

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

打赏作者

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

抵扣说明:

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

余额充值