数据库的增删改查操作:
软件:eclipse、sqlyog
数据库:Mysql
项目整体结构:
mysql驱动的jar文件引入项目方法:项目右键->Build Path->Configure Build Path->Libraries->Add External JARs->选择mysql驱动的jar打开即可添加。
数据库、数据表定义:
数据表字段定义:
jdbc_crud.java:(CRUD-增删改查方法)
package com.led.dao; import java.sql.*; import com.led.entities.Student; import com.mysql.jdbc.PreparedStatement; public class jdbc_crud { public Connection conn = null; public PreparedStatement pst = null; ResultSet rs = null; // 1.增---------增加学生 public int Add(Student student) throws Exception { conn = JdbcUtils.GetConnetion();// 2.建立连接 System.out.println("数据库连接成功!"); String sql = "insert into t_jdbc_crud (id,stuName,age,mathGrade,scienceGrade)values(null,?,?,?,?,?)"; pst = (PreparedStatement) conn.prepareStatement(sql); pst.setString(1, student.getStuName()); pst.setInt(2, student.getAge()); pst.setString(3, student.getSex()); pst.setDouble(4, student.getMathGrade()); pst.setDouble(5, student.getScienceGrade()); int result ; result = pst.executeUpdate(); if (result==1) { System.out.println("增加学生成功!"); } else { System.out.println("增加学生失败!"); } JdbcUtils.free(rs, pst, conn); return result; } // 2、删---------删除学生 public int Delete(int id) throws Exception { conn = JdbcUtils.GetConnetion(); System.out.println("连接成功"); String sql = "delete from t_jdbc_crud where id=?"; pst = (PreparedStatement) conn.prepareStatement(sql); pst.setInt(1, id); int result; result = pst.executeUpdate(); if (result==1) { System.out.println("删除学生成功!"); } else { System.out.println("删除学生失败!"); } JdbcUtils.free(rs, pst, conn); return result; } // 3、改---------改变某个学生的数学成绩 public void UpdateMathGrade(int id,double mathGrade) throws Exception { conn = JdbcUtils.GetConnetion(); System.out.println("数据库连接成功!"); String sql2 = "update t_jdbc_crud set mathGrade=? where id=?"; pst = (PreparedStatement) conn.prepareStatement(sql2); pst.setDouble(1, mathGrade); pst.setInt(2, id); int result; result = pst.executeUpdate(); if(result==1){ System.out.println("更新数学成绩成功!"); }else{ System.out.println("更新数学成绩失败!"); } JdbcUtils.free(rs, pst, conn); } // 4.1、查--------查询某个学生 public void searchStudent(int id) throws Exception { conn = JdbcUtils.GetConnetion(); System.out.println("数据库连接成功!"); //使用select *会被领导骂的,因为 String sql = "select id,stuName,age,sex,mathGrade,scienceGrade from t_jdbc_crud where id=?"; pst = (PreparedStatement) conn.prepareStatement(sql); pst.setInt(1, id); rs = pst.executeQuery(); System.out.println("4.1、查--------查询某个学生"); while (rs.next()) { System.err.println("id: " + rs.getObject("id") +" "+"stuName: "+" "+ rs.getObject("stuName") +" "+"age: " + rs.getObject("age") +" "+"sex:"+rs.getObject("sex") +" "+"mathGrade: " + rs.getObject("mathGrade") +" "+"scienceGrade: " + rs.getObject("scienceGrade")); } JdbcUtils.free(rs, pst, conn); } // 4.2、查--------查询所有学生 public void getAll() throws Exception { conn = JdbcUtils.GetConnetion(); String sql = "select id,stuName,age,sex,mathGrade,scienceGrade from t_jdbc_crud"; pst = (PreparedStatement) conn.prepareStatement(sql); rs = pst.executeQuery(); System.out.println("4.2、查--------查询所有学生"); while (rs.next()) { System.err.println("id:" + rs.getObject("id") +" "+"stuName:"+" "+ rs.getObject("stuName") +" "+"age:" + rs.getObject("age") +" "+"sex:"+rs.getObject("sex") +" "+"mathGrade:" + rs.getObject("mathGrade") +" "+"scienceGrade:" + rs.getObject("scienceGrade")); } JdbcUtils.free(rs, pst, conn); } }
JdbcUtils.java:(数据库连接与关闭操作)
package com.led.dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import com.mysql.jdbc.PreparedStatement; public class JdbcUtils { public JdbcUtils() { super(); } private static String driverClass = "com.mysql.jdbc.Driver";//mysql驱动 private static String url = "jdbc:mysql://localhost:3306/db_jdbc_crud";//数据库uri private static String username = "root";//数据库用户名 private static String password = "root";//数据库密码 static { try { Class.forName(driverClass);//利用反射的方式加载数据库驱动 } catch (Exception e) { e.printStackTrace(); } } public static Connection GetConnetion() throws Exception {//获取数据库连接 return DriverManager.getConnection(url, username, password); } public static void free(ResultSet rs, PreparedStatement pst, Connection conn) {//释放资源 try { if (rs != null) { rs.close(); if (pst != null) { pst.close(); if (conn != null) { conn.close(); } } } System.out.println("ResultSet、PreparedStatement、Connection closed!"); } catch (Exception e) { e.printStackTrace(); } } }
Student.java:(定义学生类)
package com.led.entities; public class Student { private int id; private String stuName; private String sex; private int age; private double mathGrade; private double scienceGrade; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getStuName() { return stuName; } public void setStuName(String stuName) { this.stuName = stuName; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public double getMathGrade() { return mathGrade; } public void setMathGrade(double mathGrade) { this.mathGrade = mathGrade; } public double getScienceGrade() { return scienceGrade; } public void setScienceGrade(double scienceGrade) { this.scienceGrade = scienceGrade; } public Student() { super(); // TODO Auto-generated constructor stub } public Student(String stuName, int age, String sex, double mathGrade, double scienceGrade) { super(); this.stuName = stuName; this.sex = sex; this.age = age; this.mathGrade = mathGrade; this.scienceGrade = scienceGrade; } }
jdbc_crud_Test.java:(测试CRUD方法)
package com.led.service; import com.led.dao.jdbc_crud; import com.led.entities.Student; public class jdbc_crud_Test { public static void main(String[] args) throws Exception{ jdbc_crud jdbc1=new jdbc_crud(); //jdbc1.Add(new Student("jack", 11,"male", 99.0, 97.5));//增加学生 //jdbc1.Delete(3);//删除学生 //jdbc1.UpdateMathGrade(1, 98.5);//改变学生数学成绩 //jdbc1.getAll();//查询所有学生 jdbc1.searchStudent(1);//查询某个学生 } }
注意:一般使用PreparedStatement接口,而不是Statement接口,原因是PreparedStatement能对sql语句进行预编译并放入缓存,当使用相同的sql语句时,直接可以从缓存中拿,大大提高了数据库操作效率。
/*****************************/
PreparedStatement接口的常用方法:
execute
boolean execute() throws SQLException
在此 PreparedStatement
对象中执行 SQL 语句,该语句可以是任何种类的 SQL 语句。一些特别处理过的语句返回多个结果,execute
方法处理这些复杂的语句,executeQuery
和 executeUpdate
处理形式更简单的语句。
execute
方法返回一个 boolean
值,以指示第一个结果的形式。必须调用 getResultSet
或 getUpdateCount
方法来检索结果,并且必须调用 getMoreResults
移动到任何后面的结果。
返回:如果第一个结果是 ResultSet
对象,则返回 true
;如果第一个结果是更新计数或者没有结果,则返回 false.
executeQuery
ResultSet executeQuery() throws SQLException
在此 PreparedStatement
对象中执行 SQL 查询,并返回该查询生成的 ResultSet
对象。
返回:包含该查询生成的数据的 ResultSet
对象;从不返回 null
抛出:SQLException
- 如果发生数据库访问错误或者 SQL 语句没有返回一个 ResultSet
对象
executeUpdate
int executeUpdate() throws SQLException
在此 PreparedStatement
对象中执行 SQL 语句,该语句必须是一个 SQL INSERT
、UPDATE
或 DELETE
语句;或者是一个什么都不返回的 SQL 语句,比如 DDL 语句。
返回:(1) 对于 INSERT
、UPDATE
或 DELETE
语句,返回行数 (2) 或者对于什么都不返回的 SQL 语句,返回 0
抛出:抛出:SQLException
- 如果发生数据库访问错误或者 SQL 语句返回一个 对象
java.sql
接口 PreparedStatement
所有超级接口:Statement
所有已知子接口:CallableStatement
public interface PreparedStatementextends Statement
表示预编译的 SQL 语句的对象。
SQL 语句被预编译并且存储在 PreparedStatement
对象中。然后可以使用此对象高效地多次执行该语句。
注:用来设置 IN 参数值的 setter 方法(setShort
、setString
等等)必须指定与输入参数的已定义 SQL 类型兼容的类型。例如,如果 IN 参数具有 SQL 类型 INTEGER
,那么应该使用 setInt
方法。
如果需要任意参数类型转换,使用 setObject
方法时应该将目标 SQL 类型作为其参数的类型。
在以下设置参数的示例中,con
表示一个活动连接:
PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES SET SALARY = ? WHERE ID = ?"); pstmt.setBigDecimal(1, 153833.00) pstmt.setInt(2, 110592)
第一个问号的序号是1!不是0!否则会造成空指针异常的发生!
executeUpdate():常用于增、删、改;
executeQuery():常用于查。