Java第十一章——JDBC与MySQL数据库

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();
			}
		}

	

	}

}

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值