IDEA连接MySQL数据库
将MySQL数据库连接器添加到项目中
以mysql-connector-java-8.0.15.jar
为例子,将jar文件添加到项目中
此时JDBC-MySQL连接器就添加成功了
创建相应的连接
连接jar文件中相应的类
try {
Class.forName("com.mysql.cj.jdbc.Driver"); //假如没有添加jar是会出错的
} catch (Exception e) {
e.printStackTrace();
}
连接数据库
java.sql包中的DriverManager类
中有两个用于建立连接的类方法
注意两个方法都可能抛出异常
Connection getConnection(java.lang.String,java.lang.Stiring,java.lang.String)
就例如
对于MySQL8.0版本,必须设置serverTimezone参数的值(值可以是MySQL8.0支持的时区之一,例如EST、CST、GMT等)例如,serverTimezone=CST或 serverTimezone =GMT(CST是Eastern Standard Time的缩写,CST是China Standard Time的缩写,GMT是Greenwich Mean Time缩写)。如果root用户密码是99,将&password=更改为&-password=99即可。
M.SQL5.7以及之后的版本建议应用程序和数据库服务器建立连接时明确设置ssL(Secure Sockets Layer),即在连接信息中明确使用useSSL参数,并设置值是true或fals;如果不设置useSSL参数,程序运行时总会提示用户程序进行明确设置(但不影响程序的运行)。对于早期的MySQL版本,用户程序不必设置该项。
String url = "jdbc:mysql://localhost:3306/book?" + "useSSL = false&serverTimezone = GMT";
try {
connection = DriverManager.getConnection(url,"root",""); //连接数据库
} catch (SQLException e) {
e.printStackTrace();
}
Connection getConnection(java.lang.String)
查询操作
得到SQL查询语句
首先使用Statement声明一个SQL语句对象
,然后让已创建的连接对象con调用creatStatement()
创建这个SQL语句对象
注意要使用try catch语句
try {
sql = connection.createStatement();
} catch (SQLException e) {
e.printStackTrace();
}
处理查询结果
有了 SQL语句对象后就可以对其进行操作,对数据库中表操作后返回一个对象,这个对象就是用ResultSet类声明的对象
SQL语句对象调用executeQuery()
方法,括号里填的是SQL语句
ResultSet resultSet = sql.executeQuery("SELECT * FROM mybooklist"); //选择表中的所有列
ResultSet对象的若干方法
boolean next()
String getString()
整合的例子
import java.sql.*;
public class Example14_1 {
public static void main(String[] args) {
Connection connection = null;
Statement sql;
ResultSet resultSet;
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (Exception e) {
e.printStackTrace();
}
String url = "jdbc:mysql://localhost:3306/book?" + "useSSL = false&serverTimezone = GMT";
try {
connection = DriverManager.getConnection(url, "root", ""); //连接数据库
} catch (SQLException e) {
e.printStackTrace();
}
try {
sql = connection.createStatement();//创建SQL语句对象
resultSet = sql.executeQuery("SELECT * FROM mybooklist"); //选择表中的所有列数
while (resultSet.next()) {
String str = resultSet.getString(1);
String str1 = resultSet.getString(2);
String str2 = resultSet.getString(3);
String str3 = resultSet.getString(4);
System.out.print(str + "/" + str1 + "/" + str2 + "/" + str3);
System.out.println();
}
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
运行结果
C:\Users\Administrator\.IntelliJIdea2019.3\config\jdbc-drivers\MySQL Connector\J 8\8.0.15\mysql-connector-java-8.0.15.jar" Chapter_14.Part_2.Example14_1
7-302-01465/高等数学/28.67/2020-12-02
7-352-01465/大学日语/58.5/2020-05-01
8-345-35621/我的大学/33.73/2019-05-09
8-345-35721/太阳湾湾/58.43/2020-04-15
进程已结束,退出代码 0
控制游标
结果集的游标的初始位置在结果集第1行的前面,结果集调用next()方法向下(后)移动游标,移动成功返回true,否则返回false。如果需要在结果集中上下(前后)移动、显示结果集中某条记录或随机显示若干条记录等,必须返回一个可滚动的结果集。为了得到一个可滚动的结果集,需使用下述方法获得一个Statement对象。
可以根据需求开获取其间的结果集
Statement stmt = con.createStatement(int type ,int concurrency)
type的取值决定滚动方式
ResultSet.TYPE_FORWORD_ONLY
:结果集的游标只能向下滚动。ResultSet.TYPE SCROLL_INSENSITIVE
:结果集的游标可以上下移动,当数据变化时,当前结果集不变。ResultSet.TYPE_SCROLL_SENSITIVE
:返回可滚动的结果集,当数据库变化时,
Concurrency取值决定是否可以用结果集更新数据库
ResultSet.CONCUR_READ_ONLY
:不能用结果集更新数据库中的表。ResultSet.CONCUR_UPDATABLE
:能用结果集更新数据库中的表。
滚动查询经常用到ResultSet的下述方法。
public boolean previous()
:将游标向上移动,该方法返回boolean型数据,当移到结果集第一行之前时返回false。public void beforeFirst
:将游标移动到结果集的初始位置,即在第一行之前。public void afterLast()
:将游标移到结果集最后一行之后。public void first()
:将游标移到结果集的第一行。public void last()
:将游标移到结果集的最后一行。public boolean isAfterLast()
:判断游标是否在最后一行之后。public boolean isBeforeFirst()
:判断游标是否在第一行之前public boolean isFirst()
:判断游标是否指向结果集的第一行。public boolean isLast()
:判断游标是否指向结果集的最后一行。public int getRow()
:得到当前游标所指行的行号,行号从1开始,如果结果集没有任何行,返回0。public boolean absolute(int row)
:将游标移到参数row指定的行。//row值为负数的话表示移到倒数第一行如此类推
由于连接数据库需要重复写大量代码,所以为了方便就把连接的代码封装到一个类里面,用静态方法进行调用
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class GetDatabaseConnection {
public static Connection connectDB(String DBname, String id, String password) {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (Exception e) {
e.printStackTrace();
}
String url = "jdbc:mysql://localhost:3306/" + DBname + "?" + "useSSL = false&serverTimezone = GMT";
Connection connection = null;
try {
connection = DriverManager.getConnection(url, id, password); //连接数据库
} catch (SQLException e) {
e.printStackTrace();
}
return connection;
}
}
随机获取表中两条纪录的例子
获取随机数的类
import java.util.LinkedList;
import java.util.Random;
public class GetRandomNumber {
public static int[] getRandomNumber(int max, int amount) {
LinkedList<Integer> linkedList = new LinkedList<Integer>(); //链表
for (int i = 1; i <= max; i++) {
linkedList.add(i); //自动装箱
}
int result[] = new int[amount];
for (int i = 0; i < amount; i++) { //
int index = new Random().nextInt(linkedList.size()); //获取链表的随机索引
int m = linkedList.remove(index); //然后移除
result[i] = m;
}
return result;
}
}
import java.sql.*;
public class Example14_1 {
public static void main(String[] args) {
Connection connection = null;
Statement sql;
ResultSet resultSet;
connection = GetDatabaseConnection.connectDB("book", "root", "");
try {
sql = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);//创建SQL语句对象
resultSet = sql.executeQuery("SELECT * FROM mybooklist"); //选择表中的所有列数
resultSet.last(); //将游标指向集的最后一个
int max = resultSet.getRow(); //获取表的行数
System.out.println("表中共有" + max + "纪录");
int[] a = GetRandomNumber.getRandomNumber(max, 2);
for (int i : a) {
resultSet.absolute(i); //游标移动到i行
String str = resultSet.getString(1);
String str1 = resultSet.getString(2);
String str2 = resultSet.getString(3);
String str3 = resultSet.getString(4);
System.out.print(str + "/" + str1 + "/" + str2 + "/" + str3);
System.out.println();
}
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
运行结果
C:\Users\Administrator\.IntelliJIdea2019.3\config\jdbc-drivers\MySQL Connector\J 8\8.0.15\mysql-connector-java-8.0.15.jar" Chapter_14.Part_2.Example14_1
表中共有4纪录
7-302-01465/高等数学/28.67/2020-12-02
8-345-35621/我的大学/33.73/2019-05-09
进程已结束,退出代码 0
条件与排序查询
where子语句
一般格式:
select 字段 from 表名 where 条件
- 固定值比较
例如,从mybooklist中查询name为高等数学的记录//
select * from mybooklist where name = '高等数学'
- 字段值在某区间范围
例如,从mybooklist中查询价格在28.68-87.7之间的记录//
select * from mybooklist where price>28.68 and price<=87.7
- 用操作符
like
进行模式匹配 //使用%代表0个或多个,_代表1个
排序
用order by 子语句对记录排序
select * from 表名 order by 字段名 (列名)
select * from 表名 where 条件 order by 字段名 (列名)
select * from mybooklist order by price //按价格进行排序
CET4P189
- primary
- outside
- variation
- interfere
- owe
- dense
- starve
- simplicity
- burden
- heap
- scatter