刚好复习一下这块内容,顺便对这块做个总结。
结构化查询语言(SQL)是用来定义表和完整性约束以及访问和操纵数据库的语言,它是访问关系数据库的通用语言。下面先介绍常用的描述SQL有关语句格式:
CREATE DATABASE StudentScore;
USE StudentScore
#创建表Student,sNO是主码
CREATE TABLE Student (sNo CHAR(9) NOT NULL PRIMARY KEY,sName CHAR(12) NOT NULL,sex CHAR(2),age INT,dept CHAR(50));
#创建表Course,cNO是主)
CREATE TABLE Course (cNo CHAR(9) NOT NULL PRIMARY KEY,cName CHAR(30) NOT NULL,credit INT);
#创建表Score,字段组sNO和cNo是复合主码
CREATE TABLE Score (sNo CHAR(9) NOT NULL,cNo CHAR(6) NOT NULL ,grade FLOAT,PRIMARY KEY (sNo,cNo));
DROP TABLE Student;
ALTER TABLE Student ADD COLUMN phone CHAR(11);
INSERT INTO Student (sNo,sName,sex,age,dept) VALUES ('201201009','王毅','男',18,'外语');
UPDATE Student SET dept='金融' WHERE sNo='201201009';
DELETE FROM Student WHERE sNo='201201009';
SELECT sNo AS 学号,sName AS 姓名 FROM Student;
SELECT * FROM Student WHERE dept='计算机';
#在学生表中查找计算机系的所有同学
SELECT * FROM Student WHERE dept='计算机' AND sex='男';
#在学生表中查找计算机系的所有男同学
SELECT * FROM Student WHERE sName LIKE '李%';
#在学生表示中查找所有姓‘’李‘’的同学
SELECT AVG(grade) AS 平均成绩 FROM Score;
#"平均成绩"是表达式AVG(grade)的别名
SELECT sNo,grade FROM Score WHERE cNo='c001' ORDER BY grade DESC
SELECT cNo,COUNT(*) AS 人数 FROM Score GROUP BY cNo;
#人数是用于显示的别名
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
//使用JDBC开发数据库应用程序
public class JDBCText {
public static void main(String[] args) throws ClassNotFoundException, SQLException {
//1.建立与数据库的连接
//加载JDBC驱动程序
Class.forName("com.mysql.jdbc.Driver");//容易抛出ClassNotFoundException异常
//创建数据库连接
Connection conn=DriverManager.getConnection("jdbc:mysql://localhost/StudentScore","root","root");
//MySQL数据库的主机名和数据库名,用户名,密码
//2.执行语句
//创建Statement对象
Statement stmt=conn.createStatement();
//执行SQL语句
String sql="SELECT sNo,sName,sex,age FROM Student WHERE dept='计算机'";
ResultSet rs=stmt.executeQuery(sql);
//3.处理返回结果
/*
* 在使用getXXX()方法进行取值时,可以通过字段名或列号来标识要获取数据的列。以下两句作用一样
* String no=rs.getString("sNo");
* String no=rs.getString(1);
* 说明:在ResultSet中,字段是从左至右编号的,并且从1开始
*/
while(rs.next()) {
System.out.println(rs.getString("sNo")+" "
+rs.getString("sName")+" "
+rs.getString("sex")+" "
+rs.getInt("age"));
}
//4.关闭创建的各种对象
/*
*关闭次序:
*关闭结果集对象
*关闭Statement对象
*关闭连接对象
*/
try {
if(rs!=null) {
rs.close();//关闭结果集对象
}
if(stmt!=null) {
stmt.close();//关闭Statement对象
}
if(conn!=null) {
conn.close();//关闭JDBC与数据库的连接
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
运行结果如下:
201201001 钱静 女 19
201201003 周武 男 19
201201005 李俊 男 20
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Demo {
private static String driver="com.mysql.jdbc.Driver";
private static String url="jdbc:mysql://localhost/StudentScore";
private static String user="root";//自己的数据库用户名
private static String password="root";//自己的数据库密码
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Connection conn=null;
Statement stmt=null;
ResultSet rs=null;
String selectSql="SELECT * FROM Student WHERE dept='计算机'";
String insertSql="INSERT INTO Student(sNo,sName,sex,age,dept) "+
"VALUES('201201009','王毅','男',18,'外语');";
String updateSql="UPDATE Student SET dept='金融' WHERE sNo='201201009'";
String delectSql="DELETE FROM Student WHERE sNo='201201009'";
try {
Class.forName(driver);
conn=DriverManager.getConnection(url,user,password);
stmt=conn.createStatement();
rs=stmt.executeQuery(selectSql);
while(rs.next()) {
String no=rs.getString("sNo");
String name=rs.getString("sName");
String sex=rs.getString("sex");
int age=rs.getInt("age");
String dept=rs.getString("dept");
System.out.println(no+" "+name+" "+sex+" "+age+" "+dept);
}
int count=stmt.executeUpdate(insertSql);
System.out.println("添加了"+count+"条记录到Student表中");
count=stmt.executeUpdate(updateSql);
System.out.println("修改了Student表的"+count+"条记录");
count=stmt.executeUpdate(delectSql);
System.out.println("删除了Student表的"+count+"条记录");
}catch(Exception e) {
e.printStackTrace();
}
finally {
try {
if(rs!=null) {
rs.close();//关闭结果集对象
}
if(stmt!=null) {
stmt.close();//关闭Statement对象
}
if(conn!=null) {
conn.close();//关闭JDBC与数据库的连接
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
}
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
//PreparedStatement是处理预编译语句的接口,可加快访问数据库的执行速度
public class Demo1 {
private static String driver="com.mysql.jdbc.Driver";
private static String url="jdbc:mysql://localhost/StudentScore";
private static String user="root";//自己的数据库用户名
private static String password="root";//自己的数据库密码
public static void main(String[] args) throws ClassNotFoundException, SQLException {
Connection conn=null;
PreparedStatement ps=null;
ResultSet rs=null;
String selectSql="SELECT * FROM Student WHERE dept=?";//?为动态参数的占位符
String insertSql="INSERT INTO Student(sNo,sName,sex,age,dept) "+
"VALUES(?,?,?,?,?);";
String updateSql="UPDATE Student SET dept='金融' WHERE sNo=?";
String delectSql="DELETE FROM Student WHERE sNo=?";
try {
Class.forName(driver);
conn=DriverManager.getConnection(url,user,password);
ps=conn.prepareStatement(selectSql);
ps.setString(1,"计算机");
rs=ps.executeQuery();
while(rs.next()) {
String no=rs.getString("sNo");
String name=rs.getString("sName");
String sex=rs.getString("sex");
int age=rs.getInt("age");
String dept=rs.getString("dept");
System.out.println(no+" "+name+" "+sex+" "+age+" "+dept);
}
ps=conn.prepareStatement(insertSql);
ps.setString(1,"201201009");//将字符串传给第一个参数的占位符
ps.setString(2,"王毅");
ps.setString(3,"男");
ps.setInt(4,18);//将整数型18传给第四个参数的占位符
ps.setString(5,"外语");
int count =ps.executeUpdate();//执行SQL语句
System.out.println("添加了"+count+"条记录到Student");
ps=conn.prepareStatement(updateSql);
ps.setString(1,"201201009");
count=ps.executeUpdate();
System.out.println("修改了Student表的"+count+"条记录");
ps=conn.prepareStatement(delectSql);
ps.setString(1,"201201009");
count=ps.executeUpdate();
System.out.println("删除了Student表的"+count+"条记录");
}catch(Exception e) {
e.printStackTrace();
}
finally {
try {
if(rs!=null) {
rs.close();//关闭结果集对象
}
if(ps!=null) {
ps.close();
}
if(conn!=null) {
conn.close();//关闭JDBC与数据库的连接
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
}
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
public class Demo3 {
private static String driver="com.mysql.jdbc.Driver";
private static String url="jdbc:mysql://localhost/StudentScore";
private static String user="root";//自己的数据库用户名
private static String password="root";//自己的数据库密码
public static void main(String[] args) {
Connection conn=null;
try {
Class.forName(driver);
conn=DriverManager.getConnection(url,user,password);
DatabaseMetaData dmd=conn.getMetaData();
System.out.println("数据库产品:"+dmd.getDatabaseProductName());
System.out.println("数据库版本:"+dmd.getDatabaseProductVersion());
System.out.println("驱动程序:"+dmd.getDriverName());
System.out.println("数据库URL:"+dmd.getURL());
}catch(Exception e) {
e.printStackTrace();
}finally{
try {
if(conn!=null) {
conn.close();
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
}
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
//ResultSetMetaData接口主要用来获取结果集的结构,例如结果集的字段数量、字段的名字
public class Demo4 {
private static String driver="com.mysql.jdbc.Driver";
private static String url="jdbc:mysql://localhost/StudentScore";
private static String user="root";//自己的数据库用户名
private static String password="root";//自己的数据库密码
public static void main(String[] args) {
Connection conn=null;
Statement stmt=null;
ResultSet rs=null;
try {
Class.forName(driver);
conn=DriverManager.getConnection(url,user,password);
String sql="SELECT * FROM Student WHERE dept='计算机'";
stmt=conn.createStatement();
rs=stmt.executeQuery(sql);
ResultSetMetaData rsMetaData=rs.getMetaData();
System.out.println("总共有:"+rsMetaData.getColumnCount()+"列");
for(int i=1;i
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class Demo5 {
private static String driver="com.mysql.jdbc.Driver";
private static String url="jdbc:mysql://localhost/StudentScore";
private static String user="root";//自己的数据库用户名
private static String password="root";//自己的数据库密码
public static void main(String[] args) {
Connection conn=null;
Statement stmt=null;
ResultSet rs=null;
String selectSql1="INSERT INTO Student(sNo,sName,sex,age,dept) "+
"VALUES('201201010','张三','男',18,'计算机');";
String selectSql2="INSERT INTO Student(sNo,sName,sex,age,dept) "+
"VALUES('201201011','李四','男',19,'会计');";
String selectSql3="INSERT INTO Student(sNo,sName,sex,age,dept) "+
"VALUES('201201001','王五','男',20,'金融');";
try {
Class.forName(driver);
conn=DriverManager.getConnection(url,user,password);
stmt=conn.createStatement();
boolean autoCommit=conn.getAutoCommit();//获取自动提交模式
conn.setAutoCommit(false);//设置取消自动提交模式
stmt.executeUpdate(selectSql1);
stmt.executeUpdate(selectSql2);
stmt.executeUpdate(selectSql3);
conn.commit();//执行提交操作
conn.setAutoCommit(autoCommit);//还原自动提交模式
}catch(Exception e) {
e.printStackTrace();
if(conn!=null) {
try {
conn.rollback();//执行回滚操作
}catch(SQLException e1) {
e1.printStackTrace();
}
}
}
finally {
try {
if(stmt!=null) {
stmt.close();
}
if(conn!=null) {
conn.close();
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
}
JDBC不但支持回滚操作,还支持部分回滚的保存点操作,所谓保存点,就是标记需回滚的位置。通过保存点,可以更好地控制事务回滚。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Savepoint;
import java.sql.Statement;
public class Demo6 {
private static String driver="com.mysql.jdbc.Driver";
private static String url="jdbc:mysql://localhost/StudentScore";
private static String user="root";//自己的数据库用户名
private static String password="root";//自己的数据库密码
public static void main(String[] args) {
Connection conn=null;
Statement stmt=null;
ResultSet rs=null;
String selectSql1="INSERT INTO Student(sNo,sName,sex,age,dept) "+
"VALUES('201201010','张三','男',18,'计算机');";
String selectSql2="INSERT INTO Student(sNo,sName,sex,age,dept) "+
"VALUES('201201011','李四','男',19,'会计');";
String selectSql3="INSERT INTO Student(sNo,sName,sex,age,dept) "+
"VALUES('201201012','王五','男',20,'金融');";
boolean ynRollback=true;
try {
Class.forName(driver);
conn=DriverManager.getConnection(url,user,password);
stmt=conn.createStatement();
boolean autoCommit=conn.getAutoCommit();
conn.setAutoCommit(false);
stmt.executeUpdate(selectSql1);
Savepoint s1=conn.setSavepoint();
stmt.executeUpdate(selectSql2);
stmt.executeUpdate(selectSql3);
if(ynRollback) {
conn.rollback(s1);
}
conn.commit();
conn.setAutoCommit(autoCommit);
}catch(Exception e) {
e.printStackTrace();
if(conn!=null) {
try {
conn.rollback();//执行回滚操作
}catch(SQLException e1) {
e1.printStackTrace();
}
}
}
finally {
try {
if(stmt!=null) {
stmt.close();
}
if(conn!=null) {
conn.close();
}
}catch(Exception e) {
e.printStackTrace();
}
}
}
}