jdbc连接mysql数据库:
最近在学java访问数据库进行增删查改的操作,用的是jdbc来连接数据库。jdbc有些朋友会觉得陌生,不怕,听我仔细到来:
首先,我们需要自己下载一个jdbc驱动包,网上到处都是的,xxx-jdbc-connection.jar包 ,然后导入自己的java项目中,如果是java EE的话,将jdbc驱动包放在WebContent/WEBINF/lib目录下局可以了。
官方解读:JDBC API是一个Java API可以访问任何类型的数据库的数据,尤其是存储在关系数据库中的数据。
jdbc 中的类主要是来自java.sql包,下面介绍主要的几个类:
那么,了解了这么多,我们如何来使用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
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 selectById(Integer id) {
// TODO Auto-generated method stub
//建立预处理语句
String sql = "select * from student where id=?";
Object[] obj = {id};
ArrayList 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 selectAll() {
// TODO Auto-generated method stub
String sql = "select * from student";
Object[] obj = {};
ArrayList 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 arraylist = new ArrayList<>();
arraylist = impldao.selectById(number);
Iterator 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 arraylist = new ArrayList<>();
arraylist = impldao.selectAll();
Iterator 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学习之路才开始!