加载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&useSSL=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;//SQL语句对象
ResultSet re;//结果集对象
try{
Class.forName("com.mysql.jdbc.Driver");//加载JDBC-MYSQL驱动
}
catch (Exception e){
System.out.println("加载失败");//异常处理
}
String uri = "jdbc:mysql://localhost:3306/xsxk?useSSL=true";//将要访问的数据库的URL
String user = "root";//被授权可访问数据库的用户名
String password = "root";//与用户名对应的密码
try{
con = DriverManager.getConnection(uri,user,password);//获得连接
}
catch (Exception e){
System.out.println("连接获取失败");//异常处理
}
try{
sql = con.createStatement();//获得SQL语句对象
re = sql.executeQuery("SELECT * FROM xsb");//执行查询操作
while(re.next()){
String xuehao = re.getString(1);//查看第一列的值(学号)
String number = re.getString("xm");//查看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(); //将游标向上移动,当移动到第一行之前时返回false
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(); //获得当前游标所指向的行号,行号从1开始编码,如果结果集没有行,返回0
public boolean absolute(int row);
//将游标移动到参数row指定的行,如果row是负数就是代表倒数的行,absolute表示移动到最后一行,absolute(-2)表示移动到倒数第二行,当移动到第一行前面或最后一行后面是,该方法返回false。
以下这个例子先是将游标移动到最后一行,得到学生表一共有多少条记录,然后再将游标移动到第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("操作失败");
}
}
}
结果如下图所示: