欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

JDBC(1)----------基础和简单实现案例

程序员文章站 2022-04-29 23:33:03
...

1. JDBC是由SUN公司提出的一组规范,这组规范主要是由一组接口构成。主要作用就是访问数据库。

2、JDBC核心编程思想:

JDBC(1)----------基础和简单实现案例

3、核心API

JDBC(1)----------基础和简单实现案例

4、使用JDBC开发(java工程,Oracle数据库):

1)搭建开发环境:

        创建一个java project ------> 引入(数据库驱动jar)ojdbc6.jar

2)编码(伪代码):

        a)加载驱动:将实现类加载到内存中   Class.forName("oracle.jdbc.OracleDriver");

        b)获取Connection      Connection conn = DriverManager.getConnection(url,username,password);

        c)准备sql语句         String sql = "";

        e)获取PreparedStatement对象   PreparedStatement psmt = conn.preparedStatement(sql);

        f)sql语句是增删改语句:

                    int i = psmt.executeUpdate();   //返回更新的行的个数

            sql语句是查询语句:

                    ResultSet  rs = psmt.executeQuery();    //返回的结果集,常用方法 next()

        g)释放资源,关闭连接,包括:conn,rs,ps

注意:引入(数据库驱动jar)两种方式:

第一种方式:右键--->bulid path--->config build path-->  Librarys -- > add Externaljar(到本地磁盘找到jar包所在位置)

第二种方式:在项目名上右键 new folder --> 将驱动jar放到此目录下 --> 在jar包上右键 -->build path -->add to build path

5、在4题操作中,书写sql语句,可以用占位符 ‘?’,但是我们需要进行匹配占位符(利用setXXX(),getXXX()),详细做法在下面会用示例展示。

6、Statement 和 PreparedStatement的区别:

        a)使用Statement执行sql,是以字符串拼接方式给sql语句加入参数,这是增加了Sql注入的风险

        b)使用PreparedStatement 可以避免sql注入,提高程序的可读性、可维护性。

7、java中的日期类型:

    a)java.util.Date   utilDate = new java.util.Date();

    b)java.sql.Date   sqlDate = new java.sql.Date(utilDate.getTime());

    c)实际应用转换:字符串日期格式

    String str='2018-4-8';

    SimpleDateFormat sdf = new SimpleDateFormat('yyyy-MM-dd');

    java.util.Date  utilDate  = sdf.parse(str);

    long time = utilDate.getTime();

    java.sql.Date sqlDate = new java.sql.Date(time);

8、JDBC工具类封装

    无论是对数据查询操作还是增、删、改操作,都相同代码,此时,我们需要将此代码进行封装。

    封装思路:a)确定工具类中封装那些方法:方法的修饰符   返回值类型  都是什么。

                    对于工具类而言:修饰符是 public static  目的:便于类名直接调用

                                               返回值类型: 根据实际实现的功能而定

                                               方法名:做到见名知义

9、封装JDBCUtil例1如下 :

public class JDBCUtil {
	static{
		try {
			Class.forName("oracle.jdbc.OracleDriver");
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public static Connection getConnection(){
		Connection conn = null;
		try {
			conn = DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ORCL","hr","123");
		} catch (Exception e) {
			e.printStackTrace();
		}
		return conn;
	}
	
	public static void closeAll(PreparedStatement ps,Connection conn,ResultSet rs){
		try{
			if(rs != null){ // 避免空指针异常
				rs.close();
			}
			if(ps != null){
				ps.close();
			}
			if(conn != null){
				conn.close();
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}

10、对于9中的代码,我们如果更改数据库、用户名、密码,我们操作需要打开源代码进行更改,那么有没有一种方法,不用打开源代码就能更新成功呢?答案是 有。利用文件、配置文件等方式,我们通常用XXX.properties和XXX.xml,在本题中我们应该选用哪一种比较好呢?

        注:xxx.XML类型的配置文件          特点:以标签的形式保存信息;

               xxx.properties类型配置文件    特点:以key = value形式保存信息

以上特点:相比之下,我们选用XXX.properties,因为我们文件中保存的信息是key=value形式

优化如下:

      创建一个jdbc.properties配置文件,放在src根目录下,内容:

driverClassName=oracle.jdbc.OracleDriver
url=jdbc:oracle:thin:@127.0.0.1:1521:ORCL
username=hr
password=123

        完成JDBCUtil的优化如下:

public class JDBCUtil {
	public static Properties p = new Properties();
	static{
		InputStream ins = null;
		try {
			ins = JDBCUtil.class.getResourceAsStream("/jdbc.properties");
			p.load(ins);
			Class.forName(p.getProperty("driverClassName"));
		} catch (Exception e) {
			e.printStackTrace();
		}finally{
			try {
				ins.close();
			} catch (IOException e) {
				e.printStackTrace();
			}	
		}	
	}
	public static Connection getConnection(){
		Connection conn = null;
		try {
			conn = DriverManager.getConnection(p.getProperty("url"),p.getProperty("username"),p.getProperty("password"));
		} catch (Exception e) {
			e.printStackTrace();
		}
		return conn;
	}
	
	public static void closeAll(PreparedStatement ps,Connection conn,ResultSet rs){
		try{
			if(rs != null){ // 避免空指针异常
				rs.close();
			}
			if(ps != null){
				ps.close();
			}
			if(conn != null){
				conn.close();
			}
		}catch(Exception e){
			e.printStackTrace();
		}
	}
}