当前位置:   article > 正文

11.JDBC实例_jdbc案例

jdbc案例

1、建表语句:

CREATE TABLE `student` (
  `stuid` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `sex` char(2) DEFAULT NULL,
  `birthday` datetime DEFAULT NULL,
  PRIMARY KEY (`stuid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

2、建立工程

引入jar,数据库驱动,修改pom.xml文件(在maven项目中加入依赖):

<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>5.1.49</version>
</dependency>
  • 1
  • 2
  • 3
  • 4
  • 5

3、JDBC操作的对象

(1)、Connection:数据库链接对象
(2)、Statement:sql语句执行对象
(3)、ResultSet:返回结果集对象
(4)、PreparedStatement:预处理sql执行对象,是Statement的子接口
预处理的优点:

执行效率更高,安全性更好,可以防止sql注入

有关SQL注入:https://blog.csdn.net/weixin_46048220/article/details/122298919?spm=1001.2014.3001.5502

public class jdbcTest {
    public static void main(String[] args) {
        try {
            //加载数据库驱动jar包
            ///mysql8版本:com.mysql.cj.jdbc.Driver
            Class.forName("com.mysql.jdbc.Driver");
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        //第一个参数:数据库连接
        //第二个参数:用户名
        //第三个参数:密码
        String url="jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8";
        try {
            //获取数据库链接对象
            Connection connection=DriverManager.getConnection(url,"root","root");
            System.out.println("连接成功"+ connection);
            //获取执行sql语句的对象
            Statement statement=connection.createStatement();
//            增加
//            String sql="insert into student values(null,'张三',19,'男',now())";
//            修改
//            String sql="update student set name='李四',age=22 where stuid=1";
//            删除
//            String sql="delete from student where stuid=1";
//            增删改都要用这个方法,
//            statement.executeUpdate(sql);
//            System.out.println("修改成功");
//            查询
            String sqll="select * from student";
//            查询得到的结果集
            ResultSet resultSet = statement.executeQuery(sqll);
            System.out.println();
            while (resultSet.next()){
//                columnlabel:通过字段名称查询
//                columnindex:通过字段位置查询
                System.out.print(resultSet.getInt(1)+"\t");
                System.out.print(resultSet.getString("name")+"\t");
                System.out.print(resultSet.getInt(3)+"\t");
                System.out.println(resultSet.getString("sex")+"\t");
                System.out.println(resultSet.getInt(5));
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
import java.sql.*;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Scanner;
//用户注册功能
public class jdbcSignIn {
    public static void main(String[] args) {
        try {
        Scanner scanner=new Scanner(System.in);
        System.out.println("姓名");
        String name=scanner.next();
        System.out.println("年龄");
        int age=scanner.nextInt();
        System.out.println("性别");
        String sex=scanner.next();
        System.out.println("生日");
        String birthday1=scanner.next();
        SimpleDateFormat birthday = new SimpleDateFormat(birthday1);
//        SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
//        Date birthday=sdf.parse(scanner.next());
        System.out.println("密码");
        String pwd=scanner.next();
        String url="jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8";
            Class.forName("com.mysql.jdbc.Driver");
            Connection connection= DriverManager.getConnection(url,"root","root");
//            Statement statement=connection.createStatement();
//            String sql="insert into student values(null,'"+name+"',"+age+",'"+sex+"',"+null+",'"+pwd+"')";
//            statement.executeUpdate(sql);
            String sql="insert into student values(null,?,?,?,null,?)";
            PreparedStatement preparedStatement=connection.prepareStatement(sql);
            preparedStatement.setString(1,name);
            preparedStatement.setInt(2,age);
            preparedStatement.setString(3,sex);
            preparedStatement.setString(4,pwd);

            preparedStatement.execute();
            String sqll="select * from student";
            ResultSet resultSet=preparedStatement.executeQuery(sqll);
//            查询得到的结果集
            System.out.println();
            while (resultSet.next()){
//                columnlabel:通过字段名称查询
//                columnindex:通过字段位置查询
                System.out.print(resultSet.getInt(1)+"\t");
                System.out.print(resultSet.getString("name")+"\t");
                System.out.print(resultSet.getInt(3)+"\t");
                System.out.println(resultSet.getString("sex")+"\t");
                System.out.println(resultSet.getInt(5));
                System.out.println(resultSet.getInt(6));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
```![在这里插入图片描述](https://img-blog.csdnimg.cn/55d7600f01a340ce8c14abc04234abaf.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBA5Lmh6YeM5Yir,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center)


```java
//写一个登录场景,用户输入用户名密码,验证正确显示登录成功,否则失败。用jdbc数据库完成
    String sql_userName="select * from student";
    ResultSet resultSet = statement.executeQuery(sql_userName);
    List list_userName=new ArrayList();
    List list_userPwd=new ArrayList();
    while (resultSet.next()){
        list_userName.add(resultSet.getString("name"));
        list_userPwd.add(resultSet.getString("pwd"));
    }
    System.out.println("输入用户名");
    Scanner username=new Scanner(System.in);
    String userName=username.next();
    for(int i=0;i<list_userName.size();i++){
        if(userName.equals(list_userName.get(i))){
            System.out.println("输入密码");
            Scanner userPwd=new Scanner(System.in);
            String userPwdd=userPwd.next();
            if(userPwdd.equals(list_userPwd.get(i))){
                    System.out.println("登录成功");
                    break;
            }
            if(i==list_userPwd.size()-1){
                    System.out.println("密码错误");
            }
        }else if (i==list_userName.size()-1){
            System.out.println("没有该用户");
        }else {
            System.out.println("yyy");
        }
    }
    System.out.println(list_userName);
    System.out.println(list_userPwd);
} catch (SQLException throwables) {
    throwables.printStackTrace();
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95

4、DAO开发模式:转注入数据访问层

(1)、数据库链接工具类:Dbutils——负责链接数据库和关闭资源
/**
 * 数据库工具类
 */
public class DButils {
    private static final String DRIVER="com.mysql.jdbc.Driver";
    private static final String URL="jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8";
    private static final String USERNAME="root";
    private static final String PASSWORD="root";
    public static Connection getConn(){
        try {
            Class.forName(DRIVER);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
        Connection conn=null;
        try {
            conn= DriverManager.getConnection(URL,USERNAME,PASSWORD);
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }
        return conn;
    }
    public static void closeAll(Connection conn, Statement st, ResultSet rs){
        //先开的后关
        if (rs!=null){
            try {
                rs.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if (st!=null){
            try {
                st.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if (conn!=null){
            try {
                conn.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
(2)、创建和数据库表对应的javabean对象
(数据库中有哪个表,Java中就创建哪个对象)
import java.util.Date;
public class Student {
    int stuid;
    String name;
    int age;
    String sex;
    //导入java.util包中的date(精确到了时分秒)
    Date birthday;
    String pwd;
    //使用toString能够打印输入
    @Override
    public String toString() {
        return "Student{" +
                "stuid=" + stuid +
                ", name='" + name + '\'' +
                ", age=" + age +
                ", sex='" + sex + '\'' +
                ", birthday=" + birthday +
                ", pwd='" + pwd + '\'' +
                '}';
    }
    //生成set、get方法
    public int getStuid() {return stuid;}
    public void setStuid(int stuid) {this.stuid = stuid;}
    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;}
    public Date getBirthday() {return birthday;}
    public void setBirthday(Date birthday) {this.birthday = birthday;}
    public String getPwd() {return pwd;}
    public void setPwd(String pwd) {this.pwd = pwd;}
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
(3)、创建接口,提供访问数据的方法
import java.util.List;
public interface IStudentDAO {
    //因为每个参数都要传进来,所以直接传student对象
    public int saveStu(Student s);
    public int updateStu(Student s);
    public int delStu(int stuid);
    public List<Student> queryStu(String sql);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
(4)、创建接口的实现类,完成实现方法
import java.sql.*;
import java.util.ArrayList;
import java.util.List;
public class StudentDAO implements IStudentDAO{
    private Connection conn;
    private PreparedStatement ps;
    private ResultSet rs;
    @Override
    public int saveStu(Student s) {
        //首先获取数据库链接
        conn=DButils.getConn();
        //准备sql语句
        String sql="insert into student values(null,?,?,?,?,?)";
        //预处理编译sql语句
        try {
            ps=conn.prepareStatement(sql);
            ps.setString(1,s.getName());
            ps.setInt(2,s.getAge());
            ps.setString(3,s.getSex());
            ps.setTimestamp(4, new Timestamp(s.getBirthday().getTime()));
            ps.setString(5, s.getPwd());
            return ps.executeUpdate();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            DButils.closeAll(conn,ps,rs);
        }
        return 0;
    }
    @Override
    //修改
    public int updateStu(Student s) {
        //首先判断主键是否存在
        if (s.getStuid()!=0){
            conn=DButils.getConn();
            String sql="update student set name=?,age=?,sex=?,birthday=?,pwd=? where stuid=?";
            try {
                ps=conn.prepareStatement(sql);
                ps.setString(1,s.getName());
                ps.setInt(2,s.getAge());
                ps.setString(3,s.getSex());
                ps.setTimestamp(4,new Timestamp(s.getBirthday().getTime()));
                ps.setString(5,s.getPwd());
                ps.setInt(6,s.getStuid());
                return ps.executeUpdate();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        return 0;
        }
    @Override
    public int delStu(int stuid) {
        conn=DButils.getConn();
        String sql="delete from student where stuid=?";
        try {
            ps=conn.prepareStatement(sql);
            ps.setInt(1,stuid);
            return ps.executeUpdate();
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            DButils.closeAll(conn,ps,rs);
        }
        return 0;
    }
    @Override
    //查询
    public List<Student> queryStu(String sql) {
        conn=DButils.getConn();
        try {
            ps=conn.prepareStatement(sql);
            rs=ps.executeQuery();
            List<Student> list=new ArrayList<Student>();
            while (rs.next()){
                Student stu=new Student();
                stu.setStuid(rs.getInt(1));
                stu.setName(rs.getString("name"));
                stu.setAge(rs.getInt("age"));
                stu.setSex(rs.getString("sex"));
                stu.setBirthday(rs.getTimestamp("birthday"));
                stu.setPwd(rs.getString("pwd"));
                list.add(stu);
            }
            return list;
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            DButils.closeAll(conn,ps,rs);
        }
        return null;
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
(5)、测试类
import java.util.Date;
import java.util.List;
public class Test {
    public static void main(String[] args) {
        //通过接口访问
        IStudentDAO studentDAO=new StudentDAO();
        Student stu=new Student();
//        stu.setName("ADD");
//        stu.setSex("男");
//        stu.setAge(20);
//        stu.setBirthday(new Date());
//        stu.setPwd("12321");
//        studentDAO.saveStu(stu);

//        stu.setStuid(12);
//        stu.setName("UPDATE");
//        stu.setSex("女");
//        stu.setAge(20);
//        stu.setBirthday(new Date());
//        stu.setPwd("admin");
//        studentDAO.updateStu(stu);

//        studentDAO.delStu(10);

        List<Student> list=studentDAO.queryStu("select * from student");
        for (Student student : list) {
            System.out.println(student);
        }
    }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
(6)、toString()方法

没有重写tostring方法的遍历打印结果:
在这里插入图片描述

重写tostring方法的遍历打印结果:

在这里插入图片描述

(7)、execute、executeUpdate、executeQuery三者的区别(及返回值)

参考文章

1、ResultSet:executeQuery(String sql); 执行SQL查询,并返回ResultSet 对象。
2、int:executeUpdate(String sql); 可执行增,删,改,返回执行受到影响的行数。
3、boolean:execute(String sql); 可执行任何SQL语句,返回一个布尔值,表示是否返回ResultSet 。
execute是executeQuery和executeUpdate的综合.
使用哪一个方法由SQL语句所产生的内容决定


executeUpdate() 这是 PreparedStatement 接口中的方法
executeUpdate(String sql) 这是 PreparedStatement 从父接口 Statement 中继承过来的方法

executeUpdate() 中执行 SQL 语句需要在创建 PerparedStatement 时通过 Connection 的 prepareStatement(String sql) 方法中写出,因为 PerparedStatement 中的 SQL 语句数据库需要进行预编译和缓存,因此要在创建 PerparedStatement 对象时给出 SQL 语句。
而 executeUpdate(String sql) 是 Statement 中的方法,参数中的 SQL 语句只是提交给数据库去执行,并不需要预编译。
如果 SQL 语句中有 ? 占位符,那么在设置好占位符中的值后,必须使用 executeUpdate() 执行。而 executeUpdate(String sql) 只是提交一个 SQL 语句,且这个语句中不能带有 ? 占位符。


1>方法executeQuery
用于产生单个结果集(ResultSet)的语句,例如:被执行最多的SELECT 语句。
这个方法被用来执行 SELECT 语句,但也只能执行查询语句,执行后返回代表查询结果的ResultSet对象。例如:

    Class.forName("com.mysql.jdbc.Driver");
    //加载数据库驱动
    Connection  conn = null;
    conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test",
                 "root","1234");
    //使用DriverManager获取数据库连接
    Statement  stmt = conn.createStatement();
    //使用Connection来创建一个Statment对象
    
    
    ResultSet rs =stmt.executeQuery("select * from teacher");
    //执行查询语句并且保存结果
    while (rs.next()){
                System.out.println(rs.getInt(1) + "/t" +    rs.getString(2)); 
    }
    //把查询结果输出来
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

2>方法executeUpdate
用于执行 INSERT、UPDATEDELETE 语句以及 SQL DDL(数据定义语言)语句,例如 CREATE TABLEDROP TABLE。INSERT、UPDATE 或 DELETE 语句的效果是修改表中零行或多行中的一列或多列。
executeUpdate 的返回值是一个整数(int),指示受影响的行数(即更新计数)。
对于 CREATE TABLEDROP TABLE 等不操作行的语句,executeUpdate 的返回值总为零。例如:

  Class.forName("com.mysql.jdbc.Driver");
  //加载数据库驱动
  Connection  conn = null;
  conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test",
         "root","1234");
  //使用DriverManager获取数据库连接
  Statement  stmt = conn.createStatement();
  //使用Connection来创建一个Statment对象


  return stmt.executeUpdate(sql);
  //执行DML语句,返回受影响的记录条数
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

3>方法execute:
可用于执行任何SQL语句,返回boolean值表明执行该SQL语句是否返回了ResultSet
如果执行后第一个结果是ResultSet,则返回true,否则返回false。
但它执行SQL语句时比较麻烦,通常我们没有必要使用execute方法来执行SQL语句,而是使用executeQuery或executeUpdate更适合。
但如果在不清楚SQL语句的类型时则只能使用execute方法来执行该SQL语句了。例如:

 Class.forName(driver);
  //加载驱动
  Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/test",
                                    "root","1234");
  //获取数据库连接
  stmt = conn.createStatement();
  //使用Connection来创建一个Statment对象 
  

  boolean hasResultSet = stmt.execute(sql); 
  //执行SQL,返回boolean值表示是否包含ResultSet          
  if (hasResultSet) { //如果执行后有ResultSet结果集
        rs = stmt.getResultSet();
        //获取结果集 
   
        ResultSetMetaData rsmd = rs.getMetaData();
        //ResultSetMetaData是用于分析结果集的元数据接口 
        int  columnCount = rsmd.getColumnCount();
   
        while (rs.next()){//输出ResultSet对象
             for (int i = 0 ; i < columnCount ; i++ ) {
                 System.out.print(rs.getString(i + 1) + "/t");
             }  
             System.out.print("/n");
        } 
   } else  {
         System.out.println("该SQL语句影响的记录有" + stmt.getUpdateCount() + "条");
  }  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/848029
推荐阅读
相关标签
  

闽ICP备14008679号