JDBC连接mysql数据库-由浅入深

jdbc连接mysql数据库:
最近在学java访问数据库进行增删查改的操作,用的是jdbc来连接数据库。jdbc有些朋友会觉得陌生,不怕,听我仔细到来:

首先,我们需要自己下载一个jdbc驱动包,网上到处都是的,xxx-jdbc-connection.jar包 ,然后导入自己的java项目中,如果是java EE的话,将jdbc驱动包放在WebContent/WEBINF/lib目录下局可以了。

官方解读:JDBC API是一个Java API可以访问任何类型的数据库的数据,尤其是存储在关系数据库中的数据。
jdbc 中的类主要是来自java.sql包,下面介绍主要的几个类:

1.DriverManager
这个类管理数据库驱动程序的列表。确定内容是否符合从Java应用程序使用的通信子协议正确的数据库驱动程序的连接请求。识别JDBC在一定子协议的第一个驱动器将被用来建立数据库连接。
3.Connection : 此接口与接触数据库的所有方法。连接对象表示通信上下文,即,与数据库中的所有的通信是通过此唯一的连接对象。
4.Statement : 可以使用这个接口创建的对象的SQL语句提交到数据库。一些派生的接口接受除执行存储过程的参数。
**5.ResultSet:**statement将sql语句提交到数据库后,将得到一个结果集,放在resultset中,踏实一个迭代器,可以通过指正访问下一个记录。

那么,了解了这么多,我们如何来使用jdbc呢,使用jdbc有几个步骤,我来教大家一个口诀:
一注册驱动、二建立连接、三执行语句、四关闭连接:

注册驱动:Class.forName("com.mysql.jdbc.Driver");
建立连接:Connection conn = DriverManager.getConnection();
执行语句:Statement stmt = conn.getStatement();  stmt.excuteQuery("查询语句");
关闭连接 :conn.close();stmt.close();

在实际编程中,我们一般用到的是预处理语句来对查询语句动态赋值,不适用预处理语句的话,我们每一次的查询都需要自己去重新写一遍sql语句,而且修改起来也麻烦,但是用于处理语句将重复的sql语句放在固定程序中,每次我们只需要将关键词添加到预处理语句中就行了,比如我要查询数据库中每个人的信息,假如不用预处理语句,那么我需要每次都将整条sql传入,因为每个人对应的查询语句中某些值不同,比如姓名、编号等。这样太麻烦了,用预处理语只需要一条sql,这条sql中将重要的信息由?来代替,例如 select * from student where name=?;这样每次我根据名字查询信息的时候就只需要输入name,为预处理语句赋值就行了,减少了大量代码。
给大家讲了这么多,大家还是觉得干瘪,马上来例子:
班级人员管理系统:
先给大家说下设计思路:用户层-Dao层-数据库,用户通过调用dao层,dao层再对数据库进行操作。这样分层更有利于代码的改动以及程序的调试,而且层次感也很明显。
摆了这么多,上代码:

首先是数据库连接:

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

import javax.sql.rowset.CachedRowSet;

import com.sun.rowset.CachedRowSetImpl;

public class DataBase {
 
 //student是我自己的数据库名
     private static String url = "jdbc:mysql://localhost:3306/student?serverTimezone=Asia/Shanghai";	
     
 private static String driver  ="com.mysql.jdbc.Driver";
 
 private static String username = "root";
 
 private static String password = "xxxxxx";//自己数据库的密码
 
 private static Connection connection = null;
 
 private static PreparedStatement preparedstatement = null;
 
 private static ResultSet resultset = null;
 
 //建立预编译通道
 public static PreparedStatement getPstmt(String sql) throws SQLException{
	 
	 try{
		 //建立驱动,注册驱动
		 Class.forName(driver);
         //建立连接
		 connection = DriverManager.getConnection(url,username,password);
		 //建立预处理通道,创建预编译语句(预处理语句)
		 preparedstatement = connection.prepareStatement(sql);

	 }catch(Exception e){
		 e.printStackTrace();
	 }
	 return preparedstatement;
 }
 
 //设置预编译通道里面sql的参数,可能有多个参数,而且类型可变所以用Object对象数组存放这些参数
 public static PreparedStatement setPstmt(Object[] obj,PreparedStatement pstmt){
	 //如果sql不是预处理语句
	 if(obj.length!=0){
		 
	   try{
			 
		 for(int i = 0;i<obj.length;i++){
			 
			 if(obj[i] instanceof Integer){
                //将预处理语句中的问号(?)}设置成具体参数,该参数我放在obj数组里面
				 pstmt.setInt(i+1,(Integer)obj[i]);
			 }
			 if(obj[i] instanceof String){
                 //将参数设置为String类型的
 				 pstmt.setString(i+1,(String)obj[i]);
 			 }
			 if(obj[i] instanceof Double){
                 //将参数设置为Double类型的
 				 pstmt.setDouble(i+1,(Double)obj[i]);
 			 }
		 }
	 }catch(Exception e){
		 e.printStackTrace();
	 }
	}
	 return pstmt;
 }
 
 //封装查询功能
 public static ResultSet select (String sql,Object[] obj){
	 //创建离线结果集,顾名思义使用离线结果集可以避免内存泄漏(也就是数=数据连接忘了关闭)
	 CachedRowSet cachedrowset = null;
try{
	 //获得预编译语句
	 PreparedStatement pstmt = setPstmt(obj,getPstmt(sql));
	 //执行查询语句,返回查询结果集
	 resultset = pstmt.executeQuery();
      	 
	 cachedrowset = new CachedRowSetImpl();
	 //将result放在离线结果集里面
	 cachedrowset.populate(resultset);
	 }catch(SQLException e){
		   e.printStackTrace();
	 }
	 return cachedrowset; 
 }
 
 //修改的方法(增、删、改)
 public static Integer modify(String sql,Object[] obj){
	 
	 Integer affects = null;
try{
//创建预编译通道、建立预处理语句、设置预处理语句
	 PreparedStatement pstmt = setPstmt(obj,getPstmt(sql));
	 //执行操作,返回受影响行数
	affects = pstmt.executeUpdate();
	 
	}catch(SQLException e){
		e.printStackTrace();
	}finally{
		//关闭连接,防止内存泄漏
		ClosedDB(connection,preparedstatement);
	}
	 return affects;
 }
 
 //关闭连接
 public static void ClosedDB(Connection coonnecion,PreparedStatement pstmt){
	 
  try{
	 connection.close();
	
	 pstmt.close();
  }catch(Exception e){
	  e.printStackTrace();
  }
 }
 }

Dao层:

package JDBC;

import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Scanner;

import JDBC.DataBase;

public class Dao implements ImplDao{

	@Override
public ArrayList<Student> selectById(Integer id) {
	// TODO Auto-generated method stub
	//建立预处理语句
	String sql = "select * from student where id=?";
	
	Object[] obj = {id};
	
	ArrayList<Student> students = new ArrayList<>();
	//将预处理语句和obj传到select方法中,上面sql语句中的?将会被设置成id,并返回查询结果
	ResultSet rs = DataBase.select(sql, obj);
	
try{	
	while(rs.next()){
	//遍历rs,将信息全部存到Student类型的集合里面
	students.add(new Student(rs.getInt(1),rs.getString(2),rs.getString(3),rs.getString(4)));
	
	}
}catch(Exception e){
	
	e.printStackTrace();
}finally{
	try{
		//关闭连接
		if(rs!=null){
			rs.close();
		}
	}catch(Exception e){
		e.printStackTrace();
	}
}
	return students;
}

@Override
public ArrayList<Student> selectAll() {
	// TODO Auto-generated method stub
	String sql = "select * from student";
	
	Object[] obj = {};
	
	ArrayList<Student> students = new ArrayList<>();
	
	ResultSet rs= DataBase.select(sql, obj);
	
try{	
	while(rs.next()){
		students.add(new Student(rs.getInt(1),rs.getString(2),rs.getString(3),rs.getString(4)));			
	}
}catch(Exception e){
	e.printStackTrace();
}finally{
	try{
		if(rs!=null){
			rs.close();
		}
	}catch(Exception e){
		e.printStackTrace();
	}
}
	return students;
}

@Override
public Integer delete(Integer id) {
	// TODO Auto-generated method stub
 Integer affects = null;
 
 String sql = "delete from student where id=?";
 
 Object[] obj = {id};
  //返回受影响行数
 affects = DataBase.modify(sql, obj);	
	
 return affects;
}

@Override
public Integer insert() {
	// TODO Auto-generated method stub
	System.out.println("请以此输入学生的ID、姓名、年级、班级(用(中文)、隔开)");
	
	Scanner scan = new Scanner(System.in);
	//以、将字符串分分割
	String[] buf = scan.next().split("、");
	
	Object[] obj = {Integer.parseInt(buf[0]),(String)buf[1],(String)buf[2],(String)buf[3]};
	//创建预处理语句,该语句中有4个参数等待设置,该例中设置成了obj里面的4个参数
	String sql = "insert into student values(?,?,?,?)";
	//调用modify方法获取和设置预编译语句,并操作数据库
	Integer affects = DataBase.modify(sql, obj);
	
	return affects;
}

@Override
public Integer update(Integer id) {
	// TODO Auto-generated method stub
	System.out.println("请修改这个学生的信息:");
	
	System.out.println("以此输入修改后学生的姓名、年级、和班级号(用(中文)、隔开)");
	
    Scanner scan = new Scanner(System.in);
  
    String[] buf = scan.next().split("、");
    
    String sql = "update student set name=?,grade=?,classno=? where id=?";
    
    Object[] obj ={(String)buf[0],(String)buf[1],(String)buf[2],id}; 
    
    Integer affects = DataBase.modify(sql, obj);
    		
	return affects;
}
}

用户层:
package JDBC;

import java.awt.AWTException;
import java.awt.Robot;
import java.awt.event.InputEvent;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.Scanner;

public class Main {

private int number;
//用于键入用户选择
private Scanner scan;

public void searchById(){
	
	 System.out.println("请输入要查询同学的学号:");
	 
	 Scanner scan = new Scanner(System.in);
	
	 number = Integer.parseInt(scan.next());
	 
	 ImplDao impldao = new Dao(); 
	 
	 ArrayList<Student> arraylist = new ArrayList<>();
	 
	 arraylist = impldao.selectById(number);
	 
	 Iterator<Student> it = arraylist.iterator();
	 
	 System.out.println("学号   姓名    年级    班级");
	 while(it.hasNext()){
		 
		 Student student = it.next();
		 
		 System.out.println(student.getId()+" "+student.getName()+" "+student.getGrade()+" "+student.getClassno());
	 }
	 
	   System.out.println("键入exit返回主界面");
		
	    this.scan = new Scanner(System.in);
		
		if(scan.next().equals("exit")){
			return;
		}
}
//查询所有同学信息,里面封装了dao层里面的selectAll()方法
public void searchAll(){
	
	System.out.println("正在查询所有同学的信息......");
	
	ImplDao impldao = new Dao();
	
	ArrayList<Student> arraylist = new ArrayList<>();
	
	arraylist = impldao.selectAll();
	
	Iterator<Student> it = arraylist.iterator();
	
	while(it.hasNext())
	{		
		
		Student student = it.next();
		System.out.println(student.getId()+" "+student.getName()+" "+student.getGrade()+" "+student.getClassno());
		
	}
	
	   System.out.println("键入exit返回主界面");
		
	    this.scan = new Scanner(System.in);
		
		if(scan.next().equals("exit")){
			return;
		}
}

//删除同学信息,封装了dao中按id删除信息的方法
public void deleteById(){
	
	System.out.println("请输入要删除同学的学号:");
	
	Scanner scan = new Scanner(System.in);
		
	number = Integer.parseInt(scan.next());
	
    ImplDao impldao = new Dao();
    
    Integer affects = impldao.delete(number);
	
    System.out.println("success,affects rows:"+affects);
    
    System.out.println("键入exit返回主界面");
	
    this.scan = new Scanner(System.in);
	
	if(scan.next().equals("exit")){
		return;
	}
    
}
//添加同学信息,封装了dao中的modify方法
public void insert(){
	
	System.out.println("请填写新增同学的信息");
	
	ImplDao impldao = new Dao();
	
	Integer affects = impldao.insert();
	
	System.out.println("success,affects:"+affects);
	
	System.out.println("键入exit返回主界面");
		
	    this.scan = new Scanner(System.in);
		
		if(scan.next().equals("exit")){
			return;
		}
}

//更新,封装了dao中modify方法
public void updata(){
	
	System.out.println("请输入需要修改同学的学号:");
	
	Scanner scan = new Scanner(System.in);
	
	number = Integer.parseInt(scan.next());
	
    ImplDao impldao = new Dao();
	
	Integer affects = impldao.update(number);
	
	System.out.println("success,affects"+affects);
	
	   System.out.println("键入exit返回主界面");
		
	    this.scan = new Scanner(System.in);
		
		if(scan.next().equals("exit")){
			return;
		}
	
}
//主界面
public void draw(){
	System.out.println("                    |——————————————————|");
	System.out.println("                    |欢迎来到学生管理系统            |");
	System.out.println("                    |1、通过学号查询学生信息      |");
	System.out.println("                    |2、查询所有学生信息             |");
	System.out.println("                    |3、通过学号删除学生记录      |");
	System.out.println("                    |4、添加一名学生信息             |");
	System.out.println("                    |1、通过学号修改学生信息      |");
	System.out.println("                    |——————————————————|");
}
//封装了一个机器人,它用于自动清空eclipse的控制台
public void clear() throws AWTException{
	
	Robot r = new Robot();
	//按下右鼠标
	r.mousePress(InputEvent.BUTTON3_MASK);
	//释放右鼠标
	r.mouseRelease(InputEvent.BUTTON3_MASK);
	//按下control键
	r.keyPress(KeyEvent.VK_CONTROL);
	//按下r键
	r.keyPress(KeyEvent.VK_R);
	//释放control和r键
	r.keyRelease(KeyEvent.VK_R);
	r.keyRelease(KeyEvent.VK_CONTROL);
	//r.delay(10);
}
public static void main(String[] args) throws InterruptedException{
	
	Main main = new Main();
	//Test
	//main.searchById();
	//main.searchAll();
	//main.deleteById();
	//main.insert();
    //main.updata();
	while(true){
		
		main.draw();
		System.out.println("请输入你的选择:");
		Scanner scan = new Scanner(System.in);
		
		int a = Integer.parseInt(scan.next());
		
		switch(a){
		
		case 1:
		    main.searchById();  
		    break;
		
		case 2:
			main.searchAll();
			 break;
		case 3:
			main.deleteById();
			break;
		case 4:
			main.insert();
			break;
		case 5:
			main.updata();
			break;
			
		default:
			System.out.println("无此选项,请重新输入");
			return;
		}
		try{
		  main.clear();
		}catch(AWTException e){
			e.printStackTrace();
		}
		//异步执行cleae操作,所以让线程阻塞0.5秒等待clear操作完成
		Thread.sleep(500);
	}
}
}

Student类:

public class Student {
 
 private int id;
	 private String name;
	 private String grade;
	 private String classno;
	
	 public Student(int id,String name,String grade,String classno){
			this.id = id;
			this.name = name;
		this.grade = grade;
		this.classno = classno;
	}
	 
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 String getGrade() {
	return grade;
}
public void setGrade(String grade) {
	this.grade = grade;
}
public String getClassno() {
	return classno;
}
public void setClassno(String classno) {
	this.classno = classno;
}
}

以上是我对于jdbc的心得和理解,程序仅供大家参考,界面美化还有待提高。另外就是希望有高人能够指出我的理解误区和一些编程缺点,因为编程本来就是大家一起学习,相互找出优缺点再改正,从而大家一起共同进步,一起加油,java学习之路才开始!

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值