数据库
四、数据库
如何通过JDBC访问数据库
通过JDBC访问数据库一般有如下几个步骤:
(1)加载JDBC驱动器,将数据库的JDBC驱动加载到classpath中,在基于JavaEE的Web应用开发过程中,通常要把目标数据库产品的JDBC驱动复制到WEB-INF/lib下。
(2)加载JDBC驱动,并将其注册到DriverManager中。一般使用反射Class.forName(String driveName)。
(3)建立数据库连接,取得Connection对象。其中,url表示连接数据库的字符串,username表示连接数据库的用户名,passwd表示连接数据库的密码。
(4)建立Statement对象或是PreparedStatement对象。
(5)执行SQL语句。
(6)访问结果集ResultSet对象。
(7)依次将ResultSet、Statement、PreparedStatement、Connection对象关闭,释放掉所占用资源,例如rs.close(),con.close()等。
JDBC处理事务采用什么方法?
只有当事务中的所有操作都正常执行完了,整个事务才会被提交给数据库。
Class.forName的作用是什么?
答:就是把类加载到JVM中,它会返回一个与带有给定字符串名的类或接口相关联的Class对象,并且JVM会加载这个类,同时JVM会执行该类的静态代码段。
JDBC与Hibernate有什么区别? Hibernate冬眠
Hibernate是JDBC的封装,采用配置文件的形式将数据库的连接参数写到XML文件中,至于对数据库的访问还是通过JDBC来完成的。
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernate可以自动生成SQL语句,自动执行,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。
通过JDBC访问数据库的访问方式:
创建mysql数据库的驱动类
import com.mysql.cj.jdbc.Driver; import java.sql.Connection; import java.util.Properties; public class Connection_Jar02 { public static void main(String[] args) { new Connection_Jar(); } public Connection_Jar02() { connection_mysql(); } String url = "jdbc:mysql://localhost:3306/blog?useSSL=false&serverTimezone=UTC"; String userName = "root"; String userPd= "123456"; Driver driver; Connection connection; public void connection_mysql(){ try { driver = new com.mysql.cj.jdbc.Driver(); System.out.println("加载成功!"); //获取一个处理配置文件的对象 Properties pro = new Properties(); //传入用户名和密码 pro.setProperty("user",userName); pro.setProperty("password",userPd); //用mysql驱动获取一个连接对象 Connection connection = driver.connect(url,pro); if(connection!=null){ System.out.println("连接数据库启动成功!"); connection.close(); pro.clear(); } } catch (Exception e) { System.out.println("加载失败!"); } } }
利用反射机制获取驱动的类
import java.sql.Connection; import java.sql.DriverManager; public class Connection_Jar { public static void main(String[] args) { new Connection_Jar(); } public Connection_Jar() { connection_mysql(); } String JDBC_Driver = "com.mysql.cj.jdbc.Driver";//5.1.30版本 String url = "jdbc:mysql://localhost:3306/blog?useSSL=false&serverTimezone=UTC"; String userName = "root"; String userPd= "123456"; Connection connection; public void connection_mysql(){ try { Class.forName(JDBC_Driver);//启动驱动 System.out.println("加载成功!"); connection = DriverManager.getConnection(url,userName,userPd); if(connection!=null){ System.out.println("连接数据库启动成功!"); } } catch (Exception e) { System.out.println("加载失败!"); } } }
用加载properties文件的形式来实现
连接数据库的配置参数【db.properties】
driver=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/blog?useUnicode=true&characterEncoding=utf8&useSSL=false username=root password=123456
代码实现:
import org.junit.Test; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; public class MyConnection { /* * 数据参数 * */ private static String driver; private static String url; private static String username; private static String password; // 静态语句块 static { try { // getResourceAsStream("db.properties") 获取资源 //MyConnection.class.### 本类路径下的文件 InputStream is = MyConnection.class.getClassLoader().getResourceAsStream("db.properties"); Properties properties = new Properties(); properties.load(is); driver = properties.getProperty("driver"); url = properties.getProperty("url"); username = properties.getProperty("username"); password = properties.getProperty("password"); // 驱动只加载一次 Class.forName(driver); System.out.println("驱动加载成功"); } catch (Exception e) { e.printStackTrace(); } } @Test // 获取连接的方法 public void getConnection() throws SQLException { Connection conn = DriverManager.getConnection(url, username, password); if(conn!=null){ System.out.println("连接数据库启动成功"); } } // 释放连接资源的方法,运用到sql语句 public static void release(Connection conn, Statement st, ResultSet rs) { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if (st != null) { try { st.close(); } catch (SQLException e) { e.printStackTrace(); } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
C3P0连接池
c3po参数配置文件
<?xml version="1.0" encoding="UTF-8"?> <c3p0-config><!--c3p0-config文件名--> <named-config name="testc3p0"> <!--ComboPooledData连接--> <!-- 指定连接数据源的基本属性 --> <property name="user">root</property> <property name="password">123456</property> <property name="driverClass">com.mysql.cj.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://localhost:3306/blog?useUnicode=true&characterEncoding=UTF-8</property> <!-- 若数据库中连接数不足时, 一次向数据库服务器申请多少个连接 --> <property name="acquireIncrement">5</property> <!-- 初始化数据库连接池时连接的数量 --> <property name="initialPoolSize">5</property> <!-- 数据库连接池中的最小的数据库连接数 --> <property name="minPoolSize">5</property> <!-- 数据库连接池中的最大的数据库连接数 --> <property name="maxPoolSize">10</property> </named-config> </c3p0-config>
代码实现:
import com.mchange.v2.c3p0.ComboPooledDataSource; import javax.sql.DataSource; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class MyConnection { private static final DataSource dataSource; static{ //<named-config name="testc3p0"> //ComboPooledData连接数据库名,导入文件配置 dataSource = new ComboPooledDataSource("testc3p0"); } public static Connection getConnection(){ Connection connection = null; try { connection = dataSource.getConnection(); } catch (SQLException e) { e.printStackTrace(); } return connection; } public static void release(Connection connection, Statement statement, ResultSet resultSet){ try { if(connection!=null){ connection.close(); } if(statement!=null){ statement.close(); } if(resultSet!=null){ resultSet.close(); } } catch (SQLException e) { e.printStackTrace(); } } }