11-1连接数据库前的准备工作:
①下载数据库,
②安装,把下载的zip包解压到盘目录下就ok
③以MySQL为例,对数据库初始化,DOS下命令:mysqld --initialize-insecure(只需要这一次,以后不需要了)
④启动数据库。命令:mysqld(每次打开数据库都需要再输一次)(DOS界面不要关闭)
⑤下载图形界面管理软件Navicat(建表更方便)并在软件里创建你需要练习使用的表(软件很简单使用,有点计算机基础的人一看就会用)
⑥下载JDBC驱动。把驱动复制到\java\lib\ext目录下
准备工作完毕!
11-2连接数据库的代码
①Class.forname("com.mysql.jdbc.Driver"); //MySQL的数据库驱动被封装在Driver类中,这个类在包com.mysql.jdbc中
②创建一个Connection对象con: Connection con;
连接到的地址:uri="jdbc:mysql"//localhost/students?user=root&password=&useSSL=true" //jdbc要连接的数据库是jdbc,连接到本机,用户是root,密码password是没有设置密码,查询的表是students,useSSL是一种安全的连接方式
开始连接:
con=DriverManager.getConnection(uri);/连接到uri
另外还有一种连接的写法:
String password="";
String user="root";
uri="jdbc:mysql://localhost:3306/student?&useSSL=true"
con=Connect.getConnection(uri,user,password);
例:连接本地数据库,从students表中查询前三列的数据
代码:
public static void main(String[] args) {
// TODO Auto-generated method stub
Connection con=null;
Statement sql;
ResultSet rs;
try{ //加载驱动
Class.forName("com.mysql.jdbc.Driver");
}catch(Exception e){
System.out.println(e);
}
String uri="jdbc:mysql://localhost:3306/students?useSSL=true"; //要用到的连接数据库的信息
String user="root";
String password="";
try{ //连接数据库
con=DriverManager.getConnection(uri,user,password);
}catch(Exception e){
System.out.println(e);
}
try{
sql=con.createStatement(); //con已经连接到数据库,用con调用creatment方法产生一个sql对象
rs=sql.executeQuery("select * from mess");//使用sql语句通过sql对象调用一个excuteQuery方法向数据库查询
while(rs.next()){
String number=rs.getString(1); //获得数据表的第一列的数据
String name=rs.getString(2); //获得数据表的第二列的数据
String height=rs.getString(3); //获得数据表的第三列的数据
System.out.println(number);
System.out.println(name);
System.out.println(height);
}
con.close(); //关闭
}catch(Exception e){
System.out.println(e);
}
}
11-3预处理对象与通配符
由于使用Statement对象创建的语句,客户端每次把SQL语句传给服务器,服务器端的解释器每次都需要解析SQL语句给底层,当客户端请求很多时降低了效率,所以Java提供了PreparedStatement类,用它创建的对象会在客户端把SQL语句解释成机器语言,再传送给服务器,服务器的负担就会降低。
通配符:在预处理时使用英文版的"?"代替将要加入的字段,在执行之前把占位的字段添加上就可以了。这样做的目的是增加了灵活度。
例:
public class Example11_4 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Connection con;
PreparedStatement pre;
ResultSet rs;
String str="insert into mess values(?,?,?,?)";
String sqlstr="select *from mess where name like ?";
con=GetConnection.getconnection("students", "root", "");
if(con==null)return ;
try{
pre=con.prepareStatement(str); //这句话很常用,作用是把SQL语句转换为底层的机器语言,
//每次都重新得到一个pre对象,这样效率会变高
pre.setString(1, "459");
pre.setString(2, "你的撒娇");
pre.setString(3, "18-11-1");
pre.setString(4, "16656.5");
int ok=pre.executeUpdate(); //pre对象传给数据库,得到执行
pre=con.prepareStatement(sqlstr); //查询,再次塑造一个pre对象
pre.setString(1,"你的%");
rs=pre.executeQuery();
while(rs.next()){
System.out.println(rs.getString(1));
System.out.println(rs.getString(2));
System.out.println(rs.getString(3));
System.out.println(rs.getString(4));
}
con.close();
}catch(Exception e){
System.out.println(e);
}
}
}
11-4通用查询
通用查询是指得到的结果集调用getMetaData()返回一个ResultSetMetaData对象,然后这个对象调用getColumnCount()方法就可以返回结果集的列的数目,,调用getColumnName(int i)方法可以返回结果集i列的名字。这样返回的结果储存在一个二维数组里。
package Example11_4;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.Statement;
public class Query {
String database="";
String SQL;
String []colomunName;
String [][]record;
public Query(){
try {
Class.forName("com.mysql.jdbc.Driver");
}catch(Exception e){
System.out.println(e);
}
}
public void setDatabase(String database) {
this.database = database.trim();
}
public void setSQL(String sQL) {
SQL = sQL.trim();
}
public String[] getColmun(){
if(colomunName==null){
System.out.println("没有表的字段,下面开始查询:");
return null;
}
return colomunName;
}
public String[][] getRecord(){
startQuery();
return record;
}
private void startQuery() {
// TODO Auto-generated method stub
Connection con;
Statement st;
ResultSet rs;
String uri="jdbc:mysql://localhost/"+database+"?useSSL=true";
try{
con=DriverManager.getConnection(uri, "root","");
st=con.createStatement();
rs=st.executeQuery(SQL);
ResultSetMetaData metaData=rs.getMetaData();
int colomunCount=metaData.getColumnCount();
colomunName=new String [colomunCount]; //结果的数组的列数先new出来
for(int i=1;i<=colomunCount;i++){ //查列的字段名
colomunName[i-1]=metaData.getColumnName(i);
System.out.printf("%s\t",colomunName[i-1]);
}
System.out.println();
rs.last();
int recordRow=rs.getRow(); //获得行数
record=new String[recordRow][colomunCount];
int i=0;
rs.beforeFirst();
while(rs.next()){
for(int j=1;j<=colomunCount;j++){
record[i][j-1]=rs.getString(j);
System.out.printf("%s\t",record[i][j-1]);
}
System.out.println();
i++;
}
con.close();
}catch(Exception e){
System.out.println(e);
}
}
}
package Example11_4;
public class Example11_4 {
public static void main(String []args){
Query findRecord=new Query();
findRecord.setDatabase("students");
findRecord.setSQL("select *from mess");
findRecord.getColmun();
System.out.println();
findRecord.getRecord();
}
}
11-5事务:要么都做,要么都不做
package 事务;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import Example11_2.GetConnection;
public class Example11_5 {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Connection con;
Statement sql;
ResultSet res;
con=GetConnection.getconnection("students","root", "");
if(con==null)return;
try{
con.setAutoCommit(false); //关闭自动提交
sql=con.createStatement();
String Str="select *from mess where number='1'";
res=sql.executeQuery(Str);
while(res.next())
System.out.println("在更改之前,num1的身高是:"+res.getString(4));
res.next();
Str="select *from mess where number='2'";
res=sql.executeQuery(Str);
while(res.next())
System.out.println("在更改之前,num2的身高是:"+res.getString(4));
Str="update mess set height='200' where number='2'" ;
int height2=sql.executeUpdate(Str);
Str="update mess set height='190' where number='1'" ;
int height1=sql.executeUpdate(Str);
con.commit(); //提交代码
con.setAutoCommit(true); //打开自动提交
Str="select *from mess where number='1'";
res=sql.executeQuery(Str);
while(res.next()) //这里刚刚一个bug,是说before set start ,网上查到的办法是说
//res.getString之前,必须写在while(re.next())里面
System.out.println("在更改之后,num1的身高是:"+res.getString(4));
res.next();
Str="select *from mess where number='2'";
res=sql.executeQuery(Str);
while(res.next())
System.out.println("在更改之后,num2的身高是:"+res.getString(4));
con.close();
}catch(Exception e){
try {
con.rollback(); //如果其中任何一步失败了,这句代码可以撤回所有的修改
} catch (SQLException g) {
// TODO Auto-generated catch block
g.printStackTrace();
}
}
}
}