JDBC相关概念及使用步骤

一、相关概念

JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。

                                                                

二、常用接口及使用JDBC的步骤

  加载JDBC驱动程序 → 建立数据库连接Connection → 创建执行SQL的语句Statement → 处理执行结果ResultSet → 释放资源

1.Driver接口:注册驱动 (只做一次)

  Driver接口由数据库厂家提供,作为java开发人员,只需要使用Driver接口就可以了。在编程中要连接数据库,必须先装载特定厂商的数据库驱动程序,不同的数据库有不同的装载方法。

       方式一:Class.forName(“com.MySQL.jdbc.Driver”);
  推荐这种方式,不会对具体的驱动类产生依赖。
  方式二:DriverManager.registerDriver(com.mysql.jdbc.Driver);
  会造成DriverManager中产生两个一样的驱动,并会对具体的驱动类产生依赖。

2.Connection接口:建立连接

  Connection与特定数据库的连接(会话),在连接上下文中执行sql语句并返回结果。DriverManager.getConnection(url, user, password)方法建立在JDBC URL中定义的数据库Connection连接上。

  连接MySql数据库:Connection conn = DriverManager.getConnection("jdbc:mysql://host:port/database", "user", "password");

  URL用于标识数据库的位置,通过URL地址告诉JDBC程序连接哪个数据库,URL的写法为:

  

  其他参数如:?useSSL=falseuseUnicode=true&characterEncoding=utf8

  常用方法:

    • createStatement():创建向数据库发送sql的statement对象。
    • prepareStatement(sql) :创建向数据库发送预编译sql的PrepareSatement对象。
    • prepareCall(sql):创建执行存储过程的callableStatement对象。
    • setAutoCommit(boolean autoCommit):设置事务是否自动提交。
    • commit() :在链接上提交事务。
    • rollback() :在此链接上回滚事务。

备注:使用properties配置文件

1.在src底下声明一个文件 xxx.properties ,里面的内容吐下:
driverClass=com.mysql.jdbc.Driver 
url=jdbc:mysql://localhost/student 
name=root 
password=root

2.在工具类里面,使用静态代码块,读取属性:
	static String driverClass = null;
	static String url = null;
	static String username = null;
	static String password = null;
	
	static {
		try {
			//1.创建一个属性配置对象
			Properties properties = new Properties();
			//InputStream is = new FileInputStream("jdbc.properties");
                         //JDBCUtil为当前类名
			InputStream is = JDBCUtil.class.getClassLoader().getResourceAsStream("jdbc.properties");			
			//导入输入流
			properties.load(is);
			//读取属性			
			driverClass = properties.getProperty("driverClass");
			url = properties.getProperty("url");
			username = properties.getProperty("username");
			password = properties.getProperty("password");
		} catch (IOException e) {
			e.printStackTrace();
		}	
	}

3.Statement接口:创建执行SQL语句的statement

  用于执行静态SQL语句并返回它所生成结果的对象。

  三种Statement类:

    • Statement:由createStatement创建,用于发送简单的SQL语句(不带参数)。
    • PreparedStatement :继承自Statement接口,由preparedStatement创建,用于发送含有一个或多个参数的SQL语句。PreparedStatement对象比Statement对象的效率更高,并且可以防止SQL注入,所以我们一般都使用PreparedStatement。相比较以前的statement, 预先处理给定的sql语句,对其执行语法检查。 在sql语句里面使用 ? 占位符来替代后续要传递进来的变量。 后面进来的变量值,将会被看成是字符串,不会产生任何的关键字。
    • CallableStatement:继承自PreparedStatement接口,由方法prepareCall创建,用于调用存储过程。
String sql = "insert into user values(null,?,?)";
PreparedStatement ps = con.prepareStatement(sql);
ps.setString(1, username);
ps.setString(2,password);

 常用Statement方法:

    • execute(String sql):运行语句,返回是否有结果集
    • executeQuery(String sql):运行select语句,返回ResultSet结果集。
    • executeUpdate(String sql):运行insert/update/delete操作,返回更新的行数。
    • addBatch(String sql) :把多条sql语句放到一个批处理中。
    • executeBatch():向数据库发送一批sql语句执行。

4.ResultSet接口:处理执行结果(ResultSet)

  ResultSet提供检索不同类型字段的方法,常用的有:

    • getString(int index)、getString(String columnName):获得在数据库里是varchar、char等类型的数据对象。
    • getFloat(int index)、getFloat(String columnName):获得在数据库里是Float类型的数据对象。
    • getDate(int index)、getDate(String columnName):获得在数据库里是Date类型的数据。
    • getBoolean(int index)、getBoolean(String columnName):获得在数据库里是Boolean类型的数据。
    • getObject(int index)、getObject(String columnName):获取在数据库里任意类型的数据。

  ResultSet还提供了对结果集进行滚动的方法:

    • next():移动到下一行
    • Previous():移动到前一行
    • absolute(int row):移动到指定行
    • beforeFirst():移动resultSet的最前面。
    • afterLast() :移动到resultSet的最后面。
    int result = ps.executeUpdate();		
    if(result>0) {		
	    System.out.println("插入成功");
	}else {			
		System.out.println("插入失败");
	}

5.释放资源

使用后依次关闭对象及连接:ResultSet → Statement → Connection

    public static void release(Connection con,Statement st, ResultSet rs) {
		closeRs(rs);
		closeSt(st);
		closeCon(con);
	}
	
	private static void closeRs(ResultSet rs) {
		try {
			if(rs!=null) {
				rs.close();
			}
		}catch(SQLException e) {
			e.printStackTrace();
		}finally {
			rs = null;
		}
	}
	
	private static void closeSt(Statement St) {
		try {
			if(St!=null) {
				St.close();
			}
		}catch(SQLException e) {
			e.printStackTrace();
		}finally {
			St = null;
		}
	}
	
	private static void closeCon(Connection Con) {
		try {
			if(Con!=null) {
				Con.close();
			}
		}catch(SQLException e) {
			e.printStackTrace();
		}finally {
			Con = null;
		}
	}

三、数据库的CRUD sql

1.insert

INSERT INTO t_stu VALUES (NULL,'wangqiang2',28);

        // 1. 获取连接对象
		conn = JDBCUtil.getConn();
		// 2. 根据连接对象,得到statement
		st = conn.createStatement();
		
		//3. 执行添加
		String sql = "insert into t_stu values(null , 'aobama' , 59)";
		//影响的行数, ,如果大于0 表明操作成功。 否则失败
		int result = st.executeUpdate(sql);
		
		if(result >0 ){
			System.out.println("添加成功");
		}else{
			System.out.println("添加失败");
		}

2.delete

DELETE FROM t_stu WHERE id = 6

        // 1. 获取连接对象
		conn = JDBCUtil.getConn();
		// 2. 根据连接对象,得到statement
		st = conn.createStatement();
		
		//3. 执行添加
		String sql = "delete from t_stu where name='aobama'";
		//影响的行数, ,如果大于0 表明操作成功。 否则失败
		int result = st.executeUpdate(sql);
		
		if(result >0 ){
			System.out.println("删除成功");
		}else{
			System.out.println("删除失败");
		}

3.query

SELECT * FROM t_stu

        // 1. 获取连接对象
		conn = JDBCUtil.getConn();
		// 2. 根据连接对象,得到statement
		st = conn.createStatement();

		// 3. 执行sql语句,返回ResultSet
		String sql = "select * from t_stu";
		rs = st.executeQuery(sql);

		// 4. 遍历结果集
		while (rs.next()) {
			String name = rs.getString("name");
			int age = rs.getInt("age");

			System.out.println(name + "   " + age);
		}

4.update

UPDATE t_stu SET age = 38 WHERE id = 1;

        // 1. 获取连接对象
		conn = JDBCUtil.getConn();
		// 2. 根据连接对象,得到statement
		st = conn.createStatement();
		
		//3. 执行添加
		String sql = "update t_stu set age = 26 where name ='qyq'";
		//影响的行数, ,如果大于0 表明操作成功。 否则失败
		int result = st.executeUpdate(sql);
		
		if(result >0 ){
			System.out.println("更新成功");
		}else{
			System.out.println("更新失败");
		}

使用单元测试,测试代码

  • 定义一个类, TestXXX , 里面定义方法 testXXX.
  • 添加junit的支持。

        右键工程 --- bulid path Configure add Library --- Junit --- Junit4

  • 在方法的上面加上注解 , 其实就是一个标记。

        @Test

        public void testQuery() { ... }

  • 光标选中方法名字,然后右键执行单元测试。 或者是打开outline视图, 然后选择方法右键执行。

猜你喜欢

转载自blog.csdn.net/qq_38635681/article/details/84879489
今日推荐