java连接数据库和执行静态和动态的sql语句


►JDBC (Java DatabaseConnectivity) 是用于执行SQL 语句的Java 应用程序接口,由一组用Java 语言编写的类和接口组成。
►JDBC 是一种规范,各数据库厂商为Java 程序员提供标准的数据库访问类和接口,使得独立于DBMS 的Java 应用程序的开发工具和产品成为可能。
►其官方网站为:http://java.sun.com/products/jdbc/index.jsp。
oracle数据库的驱动:oracle.jdbc.oracleDriver
oracle的url:jdbc:oracle:thin:@localhost:1521:安装数据库时的别名  一般都是orcl
mysql数据库的驱动:com.mysql.jdbc.Driver
oracle的url:jdbc:mysql://localhost:3306/数据库名

连接数据库案例
获取Connection对象
第一种
Connection conn=DriverManager.getConnection(url, name, paw);
Class.forName("数据的驱动");

第二种  封装一个工具类来获取Connection对象
创建一个 资源文件====== properties文件  以oracle为例
url=jdbc:oracle:thin:@localhost:1521:orcl
driverClass=oracle.jdbc.OracleDriver
username=scott
password=tiger
创建一个工具类  可以获取connection对象
package cn.et;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Properties;

public class OracleDbUtil {
	static Properties p=new Properties();
	static{
		//读取资源文件
		InputStream is=OracleDbUtil.class.getResourceAsStream("/oracle.properties");
		try {
			//将properties文件的键值对加载到内存中
			p.load(is);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public static Connection getConnection() throws Exception{
		String url=p.getProperty("url");//获取连接服务器的ip地址 端口 和数据库
		String driverClass=p.getProperty("driverClass");//告诉jdbc使用的是什么数据库
		String uname=p.getProperty("username");//使用哪个账号登录
		String pwd=p.getProperty("password");//登录密码
		Class.forName(driverClass);//加载该类
		Connection conn=DriverManager.getConnection(url,uname,pwd);//获取连接数据库的对象
		return conn;
	}
}
测试类(执行静态的sql语句)
Statement st=conn.createStatement()  获取执行静态sql
package jdbcCURD;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;

import org.junit.Test;

import java.sql.DatabaseMetaData;

public class MysqlCURD {
	public static void main(String[] args) throws Exception {
		
	}
	//查询
	@Test
	public void select() throws Exception{
		Connection conn=MysqlDbUtils.getConnection();
		
		Statement st=conn.createStatement();
		//Statement用于执行静态的sql语句
		ResultSet re=st.executeQuery("select * from dept");
		//ResultSet游标遍历数据行 next()
		while(re.next()){
			String deptno=re.getString("deptno");//通过列明获取数据
			String dname=re.getString("dname");
			String loc=re.getString(3);//通过索引获取数据
			System.out.println(deptno+"--"+dname+"--"+loc);
		}
		st.close();
		conn.close();
	}
	
	//增加
	@Test
	public void insert() throws Exception{
		Connection conn=MysqlDbUtils.getConnection();
		Statement st=conn.createStatement();
		int re=st.executeUpdate("insert into teacher values(5,'老廖')");
		System.out.println(re);
		st.close();
		conn.close();
	}
	//删除
	@Test
	public void delete() throws Exception{
		Connection conn=MysqlDbUtils.getConnection();
		Statement st=conn.createStatement();
		int re=st.executeUpdate("delete from teacher where t=5");
		System.out.println(re);
		st.close();
		conn.close();
	}
	
	//修改
	@Test
	public void update() throws Exception{
		Connection conn=MysqlDbUtils.getConnection();
		Statement st=conn.createStatement();
		int re=st.executeUpdate("update teacher set tname='廖廖' where t=5");
		System.out.println(re);
		st.close();
		conn.close();
	}
}

测试类1(执行动态的sql语句)
预编译SQL语句:PreparedStatement pscolumn=conn.prepareStatement(sql);
package cn.et;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class Test_2 {

	/*
	 * 3 写出一个分页的方法
     *   	定义如下
     *     tablePager(tableName,curPage,pageSize)
     *   	调用 
     *     	tablePager('Emp',2,10) 
     *       	查询emp表中 第二页的数据(每页显示10条 第二页就是 10-20条)	
	 * 5
	 * 
	 * 1  1--5     curPage*pageSize-(pageSize-1)    curPage*pageSize
	 * 2  6---10    curPage*pageSize-oageSize*1+1=pageSize*(curPage-1)+1
	 * 3  11---15
	 * 
	 * 
	 */
	public static void main(String[] args) throws Exception {
		tablePager("EMP",1,100);
	}
	
	public static void tablePager(String tableName,int curPage,int pageSize) throws Exception{
		int start=pageSize*(curPage-1)+1;
		int end=curPage*pageSize;
		//连接数据库
		Connection conn=OracleDbutil.getConnection();
		//获取所有的列明
		String count="select wm_concat(column_name) from user_tab_cols where table_name=?";
		//System.out.println(count);
		//预编译获取所有的列明语句
		PreparedStatement pscolumn=conn.prepareStatement(count);
		//设值
		pscolumn.setString(1,tableName);
		//游标抓取数据
		ResultSet rs=pscolumn.executeQuery();
		rs.next();
		//获取一行数据
		String column=rs.getString(1);
		//按逗号分隔   把所有的列名放在s数组中
		String[] s=column.split(",");
		//分页查询语句
		String sql="select "+column+" from (select t.*,rownum rn from "+tableName+" t) where rn>=? and rn<=?";
		//System.out.println(sql);
		//预编译分页查询语句
		PreparedStatement ps=conn.prepareStatement(sql);
		//设值
		ps.setInt(1,start);
		ps.setInt(2, end);
		//游标抓取数据
		ResultSet rt=ps.executeQuery();
		while(rt.next()){
			//遍历数组可以获取下标
			for(int i=1;i<=s.length;i++){
				System.out.print(rt.getString(i)+"   ");
			}
			System.out.println();
		}
	}
}
测试类2(动态sql语句)
package cn.et;

import java.sql.Statement;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

/*定义一个存储过程 传入表名
删除该表中的重复记录
比如 deleteMul(tableName)
调用 deleteMul('emp'); 必须删除表emp的重复数据  (execute immediate    using )*/
public class Test_3 {

	public static void main(String[] args) throws Exception {
		deleteMul("EMP");
	}

	public static void deleteMul(String tableName) throws Exception{
		//连接数据库
		Connection cn=OracleDbutil.getConnection();
		//获取列明语句
		String count="select wm_concat(column_name) from user_tab_cols where table_name=?";
		//预编译获取列明语句
		PreparedStatement pscount=cn.prepareStatement(count);
		//设值
		pscount.setString(1, tableName);
		//获取所有的列明
		ResultSet rs=pscount.executeQuery();
		rs.next();//必须调用该方法
		String columns=rs.getString(1);
		System.out.println(columns);
		
		
		//删除重复记录语句
		String delete="delete from "+tableName+" where rowid not in (select min(rowid) from "+tableName+" group by "+columns+ ")";
		System.out.println(delete);
		Statement stat=cn.createStatement();
		stat.executeQuery(delete);
		//关闭连接
		stat.close();
		rs.close();
		pscount.close();
		cn.close();
	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值