加载MYSQL数据库驱动
本作者使用的开发工具是IntelliJ IDEA,其他集成环境也是类似的原理。
下载MYSQL数据库驱动
JDBC即(Java Data Base Connectivity),应用程序为了能访问MYSQL数据库服务器上的数据库,必须保证应用程序所驻留的计算机上安装有相应的JDBC-MYSQL驱动。可以到官网:www.mysql.com下载,也可以使用我下载好的mysql驱动。 1.登录官网www.mysql.com之后,在页面的导航条上选择Products 2.在页面右侧区中的MySQL Features下选择MYSQL Connectors 3.在页面右侧区域中的Developed by MySQL下选择JDBC Driver for MySQL(Connector/J) 4.或者也可以使用我下载好的驱动 mysql-connector-java-5.1.40-bin.jar 链接:https://pan.baidu.com/s/1XEwVXKilL9Hc7Tjhl5xXGA 提取码:5zrb
导入MYSQL数据库驱动
1.点击File->Project Structure 2.点击Modulus、点击 Dependencies 、点击 +号 、点击JARs or directories,然后选择刚才下载好的数据库驱动 3.导入成功后,External Libraries 中看到这个驱动了
加载MYSQL数据库驱动
应用程序负责加载JDBC-MYSQL数据库驱动的代码如下,使用try-catch语句是因为有可能会出现异常加载不成功
try{
Class.forName("com.mysql.jdbc.Driver");
}
catch(Exception e){
}
连接MYSQL数据库
连接MYSQL数据库有两种方式,其中getConnction()是重载方法。
第一种连接方式
数据库连接对象只使能用Connection 来声明,不能使用new来获取。要想获取数据库连接对象,必须使用JDBC提供的API:驱动管理者DriverManager调用其方法getConnection(url)来获取。如下:
Connection con = DriverManager.getConnection(String url);
其中url的格式为:
String url = "jdbc:mysql://localhost:3306/xsxk?user=root&password=root&userSSL=true&characterEncoding=utf-8";
1、localhost:这个是你所要连接的数据库所在主机的IP地址,如果是在本机则使用localhost 2、3306:这个是mysql数据库所使用的端口号,由于3306是MYSQL数据库服务器的默认端口号,连接数据库时允许应用程序省略默认的端口号 3、xsxk:这个是你所要连接的数据库的名称,我这里所连接的是本机上一个名为xsxk的数据库。 4、user=root:这个是有权访问该数据库的用户名,我使用的用户名是root 5、password=root:这个是与用户名对应的密码,我使用的密码是root 6、useSSL=true:MYSQL5.6版本以上可写可不写,5.6之后的版本必须要写;useSSL即:use Secure Socket Link,使用安全套接字连接 7、characterEncoding=utf-8:如果数据库的表的记录有汉字,那么在建立连接时必须额外多传一个参数characterEncoding,并取值gb2312或utf-8
第二种连接方式
第二种连接方式更为简介,那就是把账号和密码从URL中剥离出来,作为两个参数传递给getConnection(String url,String user,String passeord)函数,如下:
Connextion con;
String url = "jdbc:mysql://localhost:3306/xsxk?userSSL=true";
String user = "root";
String password = "root";
try{
con = DriverManager.getConnection(url,user,password);
}catch(SQLException e){}
查询操作
发送SQL语句
1.获得SQL语句对象 SQL语句对象只能用Statement来声明,不可以使用new来生成,需要使用上面获得的数据库连接对象调用其方法createStatement()来获得,如下:
try{
Statement sql = con.createStatement();
}catch(SQLException e){}
2.发送sql语句 sql语句对象调用方法executeQuery(“String sql”),发送SQL查询语句。 并返回一个结果集Resultset,以下是向一个名叫students的表发送查询请求:
ResultSet rs = sql.executeQuery("SELECT * FROM students");
处理查询结果
ResultSet对象一次只能看到一个数据行,使用next()方法移动到下一行,获得一行数据后,ResultSet对象可以使用getXxx()方法获得字段值,函数参数既可以是字段名也可以是阿拉伯数字表示的第几列,如getInt(“name”)或getInt(1)。值得注意的是,ResultSet对象的初始位置是在结果集第一行的前面 ResultSet的若干方法
返回类型 方法名称
boolean next()
byte getByte(int columnIndex)
Date getDate(int columnIndex)
double getDouble(int columnIndex)
float getFloat(int columnIndex)
int getInt(int columnIndex)
long getLong(int columnIndex)
String getString(int columnIndex)
byte getByte(String columnName)
Date getDate(String columnName)
double getDouble(String columnName)
float getFloat(String columnName)
int getInt(String columnName)
long getLong(String columnName)
String getString(String columnName)
关闭连接
JDBC使用的映射技术而不是复制,对于查询得到的结果,映射到ResultSet中,就像是照镜子一样,而不是复制。这就意味着Resuluset对象和数据库连接对象实现了紧密的绑定,一旦连接对象被关闭,ResultSet中的数据立刻消失。所以我们在使用ResultSet中的数据时,必须始终保持和数据库的连接,直至使用完毕ResultSet中的数据为止,所以在使用完数据之后再调用con.close()。
顺序查询例子
所谓顺序查询,是指resultSet对象一次只能看到一个数据行,使用next方法移动到下一个数据行,下面的例子是查询xsxk(学生选课)数据库中xsb(学生表)的name字段的值
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class Example {
public static void main(String[] args) {
Connection con = null;
Statement sql;
ResultSet re;
try{
Class.forName("com.mysql.jdbc.Driver");
}
catch (Exception e){
System.out.println("加载失败");
}
String uri = "jdbc:mysql://localhost:3306/xsxk?useSSL=true";
String user = "root";
String password = "root";
try{
con = DriverManager.getConnection(uri,user,password);
}
catch (Exception e){
System.out.println("连接获取失败");
}
try{
sql = con.createStatement();
re = sql.executeQuery("SELECT * FROM xsb");
while(re.next()){
String xuehao = re.getString(1);
String number = re.getString("xm");
System.out.print(xuehao);
System.out.println(" "+number);
}
con.close();
}
catch (Exception e){
System.out.println(e);
}
}
}
查询后的结果和数据库中的数据一致,如下图:
游标查询例子
结果集的游标位置在第一行的上面,使用next()方法查看数据成为顺序查询。如果想直接获得结果集中某一行的数据,就需要得到一个可滚动的结果集,为此在使用con.createStatement()方法时,我们需要做相应的变动,如下所示:
Statement sql = con.createStatement(int type,int concurrency);
1.type的取值决定滚动方式,取值如下: 1)ResultSet.TYPE.FORWORD_ONLY:结果集的游标只能向下移动 2)ResultSet.TYPE.SCROLL_INSENSITIVE:结果集的游标可以上下移动,当数据库变化时,当前结果集不变 3)ResultSet.TYPE.SCROLL_SENSITIVE:结果集的游标可以上下移动,当数据变化时,当前结果集同步变化
2.concurrent的取值决定是否可以用结果集更新数据库,取值如下: ResultSet.CONCUR.READ_ONLY:不能用结果集更新数据库中的表 ResultSet.CONCUR.UPDATEBLE:可以用结果集更新数据库中的表
3.使用游标查询时,经常使用到ResultSet的以下方法:
public boolean previous();
public void beforeFirst();
public void afterLast();
public void first();
public void last();
public boolean isAfterLast();
public boolead isBeforeFirst();
public boolean isFirst();
public boolean isLast();
public int getRow();
public boolean absolute(int row);
以下这个例子先是将游标移动到最后一行,得到学生表一共有多少条记录,然后再将游标移动到第15行,得出第15行的那个学生的姓名
package Example11;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class Example {
public static void main(String[] args) {
Connection con = null;
Statement sql;
ResultSet re;
try{
Class.forName("com.mysql.jdbc.Driver");
}
catch (Exception e){
System.out.println("加载JDBC失败");
}
String uri = "jdbc:mysql://localhost:3306/xsxk?useSSL=true";
String user = "root";
String password = "root";
try{
con = DriverManager.getConnection(uri,user,password);
}
catch (Exception e){
System.out.println("连接失败");
}
try{
sql = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
re = sql.executeQuery("SELECT * FROM xsb");
re.last();
int max = re.getRow();
System.out.println("学生表一共有"+max+"记录");
re.absolute(15);
String name = re.getString("xm");
System.out.println("第15行的那个学生的姓名是:"+name);
con.close();
}
catch (Exception e){
System.out.println(e);
}
}
}
运行结果和数据库中的表的数据对应
更新、添加和删除操作
Statement 对象调用以下方法,通过参数sql实现对数据库的更新、添加和删除操作:
public int executeUpdate(String sql);
以下例子,实现了 插入一个名为“张三”的记录 更新一个名为“张张张”的记录为“陈陈陈” 删除了一个名为“李四”的记录
package Example11;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class Example11_4 {
public static void main(String[] args) {
Connection con = null;
Statement sql;
String url="jdbc:mysql://localhost:3306/xsxk?useSSL=true&characterEncoding=utf-8";
String user="root";
String password = "root";
try{
Class.forName("com.mysql.jdbc.Driver");
}catch (Exception E){
System.out.println("加载JDBC失败");
}
try{
con = DriverManager.getConnection(url,user,password);
}catch (Exception e){
System.out.println("连接失败");
}
try{
sql = con.createStatement();
sql.executeUpdate("insert into try values (3,'张三')");
sql.executeUpdate("update try set name = '陈陈陈' where id = 1 ");
sql.executeUpdate("delete from try where name='李四'");
con.close();
}catch(Exception e){
System.out.println("操作失败");
}
}
}
运行前的表内记录为: 运行后的表内记录为:
使用预处理语句
Java提供了更高效率的数据库操作机制,就是PreparedStatement对象,该对象被习惯地称作预处理语句对象 1.预处理语句的优点 向数据库发送一个SQL语句,例如 select * from try,数据库中的SQL解释器负责把SQL语句生成底层的内部命令,然后执行该命令,完成相关的操作。如果不断地向数据库提交SQL语句,势必增加数据库中SQL解释器的负担,影响执行的速度。如果应用程序能够针对连接的数据库,实现就将SQL语句解释为数据库底层的内部命令,然后直接让数据库去执行这个命令,显然不仅减轻了数据库的负担,而且也提高了访问数据库的速度。
对于JDBC而言,如果使用了Connection和某个数据库建立了连接对象con,那么con就可以调用preparedStatement(String sql)方法对参数sql指定的语句进行预编译处理,得到一个预处理语句对象。 2.使用通配符 在对SQL语句进行预处理时,可以使用通配符?(英文问号)来代替字段的值,但是必须要在预处理对象执行之前设置好通配符所代表的具体的值。 以下例子表示第一个通配符?代表的值是“张三”,第二个通配符?代表的值是“李四”:
sql.setString(1,"张三");
sql.setString(2,"李四");
在使用预处理语句对象设置通配符?的值时,常用的方法有
void setDate(int preparedIndex,Date x);
void setDouble(int preparedIndex,Double x);
void setFloat(int preparedIndex,Float x);
void setInt(int preparedIndex,Int x);
void setLong(int preparedIndex,Long x);
void setString(int preparedIndex,String x);
以下例子是使用通配符向表内插入了一条序号为100,名为“使用通配符”的记录
package Example11;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
public class Example11_5 {
public static void main(String[] args) {
Connection con = null;
String url = "jdbc:mysql://localhost:3306/xsxk?useSSL=true&characterEncoding=utf-8";
String user = "root";
String password = "root";
PreparedStatement sql;
try{
Class.forName("com.mysql.jdbc.Driver");
}catch(Exception e){
System.out.println("加载失败");
}
try{
con = DriverManager.getConnection(url,user,password);
}catch(Exception e){
System.out.println("连接失败");
}
try{
sql = con.prepareStatement("insert into try values(?,?)");
sql.setInt(1,100);
sql.setString(2,"使用通配符");
sql.executeUpdate();
con.close();
}catch(Exception e){
System.out.println("操作失败");
}
}
}
结果如下图所示:
|