时间:2021-07-01 10:21:17 帮助过:4人阅读
1.简介
JDBC本身是java连接数据库的一个标准,是进行数据库连接的抽象层,由java编写的一组类和接口组成,接口的实现由各个数据库厂商来完成
各大数据库厂商对JDBC的API的接口提供实现,即驱动包。
二、JDBC操作
1.加载注册驱动 Class.forName(""); 2.获取数据库连接 Connection conn=DriverManager.getConnection(String url,String user,String password); 3.创建语句对象 Statement st=conn.creatStatement(); 4.执行sql语句 st.executeUpdate(String sql); 或者 ResultSet rs =st.executeQuery(String sql); 5.获取结果集 while(rs.next()){ rs.getObject(列名); } 或者 if(rs.next()){ rs.getObject(列名); } 6.释放资源
jdbc连接oracle、mysql等主流数据库的驱动类和url
----------------------------------------------------------- oracle driverClass:oracle.jdbc.driver.OracleDriver url:jdbc:oracle:thin:@127.0.0.1:1521:dbname ----------------------------------------------------------- mysql driverClass:com.mysql.jdbc.Driver url:jdbc:mysql://localhost:3306/mydbr。 ----------------------------------------------------------- DB2 driverClass:com.ibm.db2.jcc.DB2Driver url:jdbc:db2://127.0.0.1:50000/dbname ----------------------------------------------------------- syBase driverClass:com.sybase.jdbc.SybDriver url:jdbc:sybase:Tds:localhost:5007/dbname ----------------------------------------------------------- PostgreSQL driverClass:org.postgresql.Driver url:jdbc:postgresql://localhost/dbname ----------------------------------------------------------- Sql Server2000 driverClass:com.microsoft.jdbc.sqlserver.SQLServerDriver url:jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=dbname ----------------------------------------------------------- Sql Server2005 driverClass:com.microsoft.sqlserver.jdbc.SQLServerDriver url:jdbc:sqlserver://localhost:1433; DatabaseName=dbname -----------------------------------------------------------
三、DAO设计思想(不直接操作数据库,而是在数据库和业务层之间)
DAO的实现类实现数据库操作,
先将数据封装到domain中,在调用dao的方法,把domain作为参数传递过去
四、代码重构
1.数据库连接对象的操作重复,抽取到JDBCUtil工具类
2.注册驱动抽取到静态代码块中
3.释放资源抽取到JDBCUtil
4.将操作数据库相关字符串抽取到资源文件db.properties
提取到db.properties文件
driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql:///jdbcdemo username=root password=admin
JDBCUtil
public class JDBCUtil { private JDBCUtil(){} private static Properties p = new Properties(); static{ try { ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); InputStream in = classLoader.getResourceAsStream("db.properties"); p.load(in); Class.forName(p.getProperty("driverClassName")); } catch (Exception e) { e.printStackTrace(); } } public static Connection getConn(){ try { return DriverManager.getConnection(p.getProperty("url"), p.getProperty("username"), p.getProperty("password")); } catch (Exception e) { throw new RuntimeException("亲,获取数据库连接失败",e); } } public static void close(Connection conn,Statement st,ResultSet rs){ try { if (rs != null) { rs.close(); } } catch (Exception e2) { e2.printStackTrace(); } finally { try { if (st != null) { st.close(); } } catch (SQLException e1) { e1.printStackTrace(); } finally { try { if (conn != null) { conn.close(); } } catch (SQLException e2) { e2.printStackTrace(); } } } } }
五、预编译语句对象
Statement: 表示静态SQL语句对象.
PreparedStatement:Statement的子接口,表示预编译SQL语句对象. 通过占位符(?)来拼SQL.
1.创建预编译语句对象 PreparedStatement ps=conn.preparedStatement(sql); 2.设置占位符 ps.setString(1,""); 3.执行sql语句 int executeUpdate() ResultSet executeQuery()
六、Statement和PreparedStatement的区别:
1).PreparedStatement 代码的可读性和可维护性. (SQL模板,使用占位符表示参数) 2).PreparedStatement 能最大可能提高性能. MySQL不支持. 3).PreparedStatement 能保证安全性. 可以防止SQL注入: name='' or 1=1 or ''
七、事务(Transaction 简写为tx)
1.事务的ACID属性
1.原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。 (一荣俱荣,一损俱损) 2. 一致性(Consistency)事务必须使数据库从一个一致性状态变换到另外一个一致性状态。(数据不被破坏) 3. 隔离性(Isolation) 事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。 4. 持久性(Durability)持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响
2.如何在代码中去处理事务:
1.在JDBC中,事务是默认提交的. 必须先设置事务为手动提交. connection对象.setAutoCommit(false);//设置事务为手动提交. 2.手动的提交事务. connection对象.commit(); 3.若出现异常必须回滚事务: 不回滚事务,总余额依然是正确的. 若不回滚事务,不会释放数据库资源. connection对象.rollback();
3.JDBC获取自动生成的主键
如何在JDBC中保存数据的时候获取自动生成的主键呢?
----------------------------------------------------------------------
Statement: int executeUpdate(String sql,int autoGeneratedKeys):执行SQL: 参数:autoGeneratedKeys,是否需要返回自动生成的主键. 常量值:Statement.RETURN_GENERATED_KEYS ResultSet getGeneratedKeys():获取自动生成的主键 PreparedStatement: PreparedStatement prepareStatement(String sql, int autoGeneratedKeys) :创建PreparedStatement对象,并指定是否需要返回生成的主键. 参数的常量值:Statement.RETURN_GENERATED_KEYS
八、连接池(也叫数据源)(除了获取数据库连接不一样,其他操作和jdbc一样)
1.导入jar包
commons-dbcp-1.4.jar
commons-pool-1.5.6.jar
数据库驱动包
2.在Java中,连接池使用javax.sql.DataSource接口来表示连接池.
注意:DataSource仅仅只是一个接口,由各大服务器厂商来实现(Tomcat.JBoss).
常用的DataSource的实现:
DBCP: Spring推荐的
C3P0: Hibernate推荐的
3.获取连接池对象(DataSource)
方法1:手动配置连接池配置 DataSource ds=new BasicDataSource(); ds.setDriverClassNmae(""); ds.setUrl(""); ds.setUsername(""); ds.setPassword(""); 方式2:通过连接池工厂类创建连接池对象 DataSource ds= BasicDataSourceFactory.createDataSource(p);
DBCPUtil
public class DBCPUtil { private DBCPUtil(){} private static Properties p = new Properties(); private static DataSource dataSource=null; static{ try { ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); InputStream in = classLoader.getResourceAsStream("dbcp.properties"); p.load(in); //通过连接池工程类创建连接池对象 dataSource = BasicDataSourceFactory.createDataSource(p); } catch (Exception e) { e.printStackTrace(); } } public static Connection getConn(){ try { return dataSource.getConnection(); } catch (Exception e) { e.printStackTrace(); throw new RuntimeException("亲,获取数据库连接失败",e); } } public static void close(Connection conn,Statement st,ResultSet rs){ try { if (rs != null) { rs.close(); } } catch (Exception e2) { e2.printStackTrace(); } finally { try { if (st != null) { st.close(); } } catch (SQLException e1) { e1.printStackTrace(); } finally { try { if (conn != null) { conn.close(); } } catch (SQLException e2) { e2.printStackTrace(); } } } } }
4.获取数据库连接
DataSource对象.getConnection();
5.使用连接池的时候: 释放资源: Connection对象.close():
是把Connection放回给连接池,而不是和数据库断开.
jdbc
标签:JDBC