大纲 :
- 主要讲解 Java 连接数据库的几种方式 : 原生JDBC , Properties 配置文件 , xml 配置文件 , DBUtils , Hibernate , Mybatis , Spring 管理数据库连接以及事务
- 还有数据库连接池 C3P0 , DBCP
JDBC
//1.注册驱动 Class.forName("com.mysql.jdbc.Driver"); //2.获取数据库的连接对象 String url = "jdbc:mysql://localhost:3306/demo1"; String user = "root"; String password = "root"; Connection con = DriverManager.getConnection(url , user , password); //3.获取执行者对象 Statement statement = con.createStatement(); String sql2 = "SELECT * FROM zhangwu GROUP BY zname DESC"; PreparedStatement pstat = con.prepareStatement(sql2);
//4.执行sql语句 //通过执行者对象调用方法执行sql语句 //执行增删改 statement.executeUpdate("INSERT INTO users ( uname , uaddress) VALUE ( 'chenyun33' , 'fff')");
//执行查询 , 返回一个结果集 ResultSet rs = statement.executeQuery("SELECT * FROM users"); ResultSet prs = pstat.executeQuery();
//5.处理结果 while(rs.next()){ System.out.println(rs.getString("uid")+" "+rs.getString("uname")+" "+rs.getString("uaddress")); } //6.释放资源 rs.close(); statement.close(); con.close();
properties 配置文件方式 :
private static Connection con; //properties 方式 static { try { InputStream in = JDBCUtils.class.getClassLoader().getResourceAsStream("mysql.properties"); Properties ps = new Properties(); ps.load(in);
String driver = ps.getProperty("driver"); String url = ps.getProperty("url"); String name = ps.getProperty("name"); String pw = ps.getProperty("password"); Class.forName(driver); con = DriverManager.getConnection(url, name, pw); } catch (Exception ex) { throw new RuntimeException(ex + "数据库连接异常"); } }
Xml 配置文件 :
static { try { SAXReader reader = new SAXReader(); Document document = reader.read("mysql.xml"); Element rootElement = document.getRootElement(); String driver = rootElement.elementText("driver"); String url = rootElement.elementText("url"); String user = rootElement.elementText("username"); String password = rootElement.elementText("password"); Class.forName(driver); con = DriverManager.getConnection(url, user, password); } catch (Exception ex) { throw new RuntimeException(ex + "数据库连接异常"); } }
数据库连接池
数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
DBCP连接池 :
public class JDBCUtils { //连接池对象 private static BasicDataSource ds = new BasicDataSource(); static{ //设置连接池属性 ds.setDriverClassName("com.mysql.jdbc.Driver"); ds.setUrl("jdbc:mysql://127.0.0.1:3306/gjp"); ds.setUsername("root"); ds.setPassword("root"); } private JDBCUtils() { } //多态 .. 向上转型 ,返回一个DataSource对象 (BasicDataSource implements DataSource) //为什么要转型 ? 因为QueryRunner 有一个构造方法能接收DataSource对象 //QueryRunner 是DBUtils的核心类 //DBUtils 是JDBC简化开发工具包 //JDBC 是数据库驱动器 public static DataSource getDataSource(){ return ds; } }
C3P0 连接池 :
- xml 文件形式 , 放在src目录下
- 文件名 : c3p0-config.xml
<?xml version="1.0" encoding="UTF-8"?> <c3p0-config> <default-config> <property name="driverClass">com.mysql.jdbc.Driver</property> <property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/stdb</property> <property name="user">root</property> <property name="password">root</property> <property name="initialPoolSize">5</property> <property name="maxPoolSize">20</property> </default-config> </c3p0-config>
//创建连接池 private static final ComboPooledDataSource cpds = new ComboPooledDataSource(); //返回连接 public static Connection getConnection(){ Connection conn = null; try { conn = cpds.getConnection(); } catch (SQLException e) { e.printStackTrace(); } return conn; } //返回数据源(连接池) public static DataSource getDataSource(){ return cpds; } //释放资源 .......
DBUils
- JBDC 的简化开发工具包
- DBUtils 是 java 编程中的数据库操作实用工具,小巧简单实用。
- DBUtils 封装了对JDBC的操作,简化了JDBC操作,可以少写代码
三个核心类 :
- QueryRunner : 提供执行 sql 语句的 API.
- DBUtils : 一个工具类 , 定义了关闭资源与事务处理的方法
- ResultSetHandler : 接口 , 用于定义select操作后,怎样封装结果集
- 主要使用以下八大结果集
Hibernate
src 下创建核心配置文件 : hibernate.cfg.xml
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd";> <hibernate-configuration> <session-factory> <!-- 配置关于数据库连接的四个项 driverClass url username password --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql:///hibernatetest</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">root</property> <!--使用c3p0 设置连接提供者 --> <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> <!-- c3p0连接池的配置 --> <property name="hibernate.c3p0.max_size">20</property> <!-- 最大连接池 --> <property name="hibernate.c3p0.min_size">5</property> <!-- 最小连接数 --> <property name="hibernate.c3p0.timeout">120</property> <!-- 超时 --> <property name="hibernate.c3p0.idle_test_period">3000</property> <!-- 空闲连接 -->
<!-- 可以将向数据库发送的sql显示出来 --> <property name="hibernate.show_sql">true</property> <!-- 格式化sql --> <property name="hibernate.format_sql">true</property> <!-- hibernate的方言 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 自动创建表 --> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 用于设置事务提交方式 --> <property name="hibernate.connection.autocommit">false</property> <!-- 配置hibernate的映射文件所在位置 --> <mapping resource="cn/tone/domain/Customer.hbm.xml" /> </session-factory> </hibernate-configuration>
Mybatis
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- 配置属性 先加载内部属性,再加载外部属性,如果有同名属性会覆盖。 --> <properties resource="db.properties"> <property name="jdbc.driver" value="com.mysql.jdbc.Driver"/> <property name="jdbc.url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8"/> </properties>
<!-- 和spring整合后 environments配置将废除--> <environments default="development"> <environment id="development"> <!-- 使用jdbc事务管理--> <transactionManager type="JDBC" /> <!-- 数据库连接池--> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </dataSource> </environment> </environments> </configuration>
Spring 管理数据库连接
<!-- 加载properties文件 -->
<context:property-placeholder location="classpath:db.properties" />
<!-- 数据库连接 -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}" />
<property name="jdbcUrl" value="${jdbc.url}" />
<property name="user" value="${jdbc.user}" />
<property name="password" value="${jdbc.password}" />
</bean>
Spring 管理数据库连接 , 管理事务等 , 还有整合 JPA , 等会儿整理