手写jdbc,详细操作

JDBC
Java数据库连接,Java Database Connectivity,简称JDBC是Java和数据库之间的一个桥梁,提供了诸如查询和更新数据库中数据的方法。以下使用MYSQL数据库做例子。
相关的步骤写在代码里面,如下:
  • 1.将mysql的数据库连接jar包导入到项目中

mysql-connector-java-8.0.15.jar(这个文件可以在网上下载)
链接如下:
https://repo1.maven.org/maven2/mysql/mysql-connector-java/8.0.15/mysql-connector-java-8.0.15.jar
在这里插入图片描述

在这里插入图片描述

  • 2.编写JDBCUtil.java数据库连接工具类
package com.my.test.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;

//mysql数据库工具类,因为我们每一次都要使用数据库连接,所以将它抽象成一个工具类
public class JDBCUtil {
	
	  private static Connection connection=null;
	  //静态的方法,使用类名就可调用
      public static Connection getConnection() {
    	  try {
    		  //1.加载mysql数据库的驱动
			Class.forName("com.mysql.cj.jdbc.Driver");
			//2.获取连接对象,public class DriverManager是一个类
			connection=DriverManager.getConnection("jdbc:mysql://localhost:3306/test_jdbc?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8", "root", "root");
			//注意以上的连接参数,localhost:表示的是本地的mysql ip地址,3306是mysql默认的端口,test_jdbc是我们在mysql中建立的数据库名称,?表示的后面要加参数,&表示的是连接多个参数的分割符
			//这样设置是为了当我们插入中文的信息到数据库中不出现中文乱码问题
			//serverTimezone=GMT%2B8不加它的话在新版的mysql会出现异常
			//&useSSL=false,在高版本的mysql中使用的,SSL(Secure Sockets Layer 安全套接字协议),及其继任者传输层安全(Transport Layer Security,TLS)是为网络通信提供安全及数据完整性的一种安全协议。
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
		} catch (SQLException e) {
			e.printStackTrace();
		}
    	  return connection;
      }
      //静态的关闭的方法,参数传递进来的
      public static void close(Connection connection,PreparedStatement pst) {
    	  if(pst!=null) {
  			try {
  				pst.close();
  				pst=null;//如果没有关掉我们将它手动赋值为null
  			} catch (SQLException e) {
  				e.printStackTrace();
  			}
  			
  		}
  		if(connection!=null) {
  			try {
  				connection.close();
  				connection=null;
  			} catch (SQLException e) {
  				e.printStackTrace();
  			}
  		}
      }
}

可能出现的异常以及解决办法(代码中写的注释)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 3.编写一个含有main方法的类,后续操作将在这个类中进行
package com.my.test.jdbc;

public class TestJdbc {

	public static void main(String[] args) {
	//为了测试我们的连接是否正常,我们输出一下连接对象
//     System.out.println(ConnectionUtil.getConnection());
		
	}

}
  • 4.编写实体类Student与在test_jdbc数据库中建立表student_info
package com.my.test.jdbc;

//学生实体类
public class Student {
   private Integer id;//学生的id 
   private String name;//学生的姓名
   private Integer age;//学生的年龄
   private String sex;
   
public Student() {
	super();
}

public Student(Integer id, String name, Integer age, String sex) {
	super();
	this.id = id;
	this.name = name;
	this.age = age;
	this.sex = sex;
}

public Integer getId() {
	return id;
}

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

public String getName() {
	return name;
}

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

public Integer getAge() {
	return age;
}

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

public String getSex() {
	return sex;
}

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

@Override
public String toString() {
	return "Student [id=" + id + ", name=" + name + ", age=" + age + ", sex=" + sex + "]";
}
   
}
  • 5.完善含有main方法的类TestJdbc,包含基本的增删改查操作,参考代码如下:
package com.my.test.jdbc;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;


public class TestJdbc {

	private static Connection connection=null;
	private static PreparedStatement pst=null;
	private static Statement stm=null;//public interface Statement
	private static boolean tag=false;
	private static ResultSet res=null;
	private static Student student=new Student();
	
	/**
	 * 
	 * @param name 插入学生的姓名
	 * @param age 插入学生的年龄
	 * @param sex 插入学生的性别
	 * @return 插入成功返回true,否则返回false
	 */
	public static boolean insertData(String name,Integer age,String sex) {
		connection=JDBCUtil.getConnection();	
		//使用PreparedStatement pst
		//public interface PreparedStatement extends Statement,它是一个接口,所以不能用new的方式创建,使用Connection对象来进行创建
		String sql="insert into student_info(name,age,sex)values(?,?,?)";
		try {
//			stm=connection.createStatement();//这是Statement的方式的创建
			pst=connection.prepareStatement(sql);//因为是预编译所以传入参数SQL语句
			//进行?占位符的替换,注意参数一parameterIndex the first parameter is 1, the second is 2,从一开始的
			pst.setString(1, name);
			pst.setInt(2,age);
			pst.setString(3, sex);
			int rows=pst.executeUpdate();
			if(rows>0) {
				System.out.println("插入新的数据成功!");
				tag=true;
				
			}else {
				System.out.println("插入新的数据失败!");
				tag=false;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			JDBCUtil.close(connection, pst);
		}
		return tag;
	}
	/**
	 * 该方法是查询所有的学生的信息
	 */
	public static void  queryAll() {
		//1.获得连接对象
		connection=JDBCUtil.getConnection();
		try {
			//2.创建Statement
			stm=connection.createStatement();
			//3.书写SQL语句
			String sql="SELECT id,name,age,sex FROM student_info";
			//4.执行sql
			res=stm.executeQuery(sql);//与PreparedStatement不一样
			//pst.executeQuery();//不传入sql语句,因为预先传入了
			//5.遍历查询结果集res
			while(res.next()) {//是否有下一个元素,初始时,指向在第一行表元素的上面
				//如果有下一个元素的话,则取出元素
				//取学生的id
				Integer id=res.getInt(1);//取出id列对应的第一个值,注意参数是从1开始的,columnIndex the first column is 1, the second is 2, ...
				//取学生的姓名
				String name=res.getString(2);
				//取学生的年龄
				Integer age=res.getInt(3);
				//取学生的性别
				String sex=res.getString(4);
				//输出学生的基本信息
				System.out.println("学生id:"+id+" "+"name:"+name+" "+"age:"+age+" "+"sex:"+sex);
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			if(res!=null) {
				try {
					res.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			if(stm!=null) {
				try {
					stm.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			if(connection!=null) {
				try {
					connection.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
		
	}
	
	/**
	 * 
	 * @param id 根据学生的id进行删除
	 * @return 删除成功返回true,否则返回false
	 */
	public static boolean deleteInfo(Integer id) {
		//1.创建连接对象
		connection=JDBCUtil.getConnection();
		try {
			//2.创建PreparedStatement加书写sql语句
			String sql="DELETE FROM student_info WHERE id=?";
			pst=connection.prepareStatement(sql);
			//3.注意进行?替换
			pst.setInt(1, id);//将编号id进行删除
			//4.执行删除操作
			int rows=pst.executeUpdate();
			if(rows>0) {//注意条件是大于0,因为在mysql中通过删除操作的观察,影响行数是1行,所以只要大于0就删除成功
				System.out.println("删除数据成功");
				tag=true;
			}else {
				System.out.println("删除数据失败");
				tag=false;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			if(pst!=null) {
				try {
					pst.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			if(connection!=null) {
				try {
					connection.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
		return tag;
	}
	//修改学生的数据
	/**
	 * 
	 * @param student 传入学生对象,进行修改
	 * @return 修改成功返回true,否则返回false
	 */
	public static boolean updateInfo(Student student) {
		connection=JDBCUtil.getConnection();
		//根据学生的id进行学生年龄的修改
		String sql="UPDATE student_info SET age=? WHERE id=?";
		try {
			pst=connection.prepareStatement(sql);
			//进行问号的替换
			pst.setInt(1, student.getAge());
			pst.setInt(2, student.getId());
			//执行操作
			int rows=pst.executeUpdate();
			if(rows>0) {
				System.out.println("修改学生信息成功");
				tag=true;
			}else {
				System.out.println("修改学生信息失败");
				tag=false;
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally {
			
			if(pst!=null) {
				try {
					pst.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
			if(connection!=null) {
				try {
					connection.close();
				} catch (SQLException e) {
					e.printStackTrace();
				}
			}
		}
		return tag;
	}
	public static void main(String[] args) {
	//为了测试我们的连接是否正常,我们输出一下连接对象
    //System.out.println(ConnectionUtil.getConnection());
	System.out.println(insertData("张无忌",29,"男"));
	     //查询所有学生
	     queryAll();
		//删除编号为7的学生
		//System.out.println(deleteInfo(7));
		//删除后再查询一波
		//queryAll();
	     //进行学生信息的修改,修改编号id为9的学生的信息,将学生的信息进行封装
//	     student.setAge(26);
//	     student.setId(9);
//	     System.out.println(updateInfo(student));
//	     queryAll();
	     
	
  }

}

  • 6.最终的项目结构,参考如下:

在这里插入图片描述

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值