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

来源:互联网 发布:mac免费office软件 编辑:程序博客网 时间:2024/06/08 10:45
►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:orcldriverClass=oracle.jdbc.OracleDriverusername=scottpassword=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 blocke.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 {}//查询@Testpublic 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();}//增加@Testpublic 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();}//删除@Testpublic 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();}//修改@Testpublic 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();}}


原创粉丝点击