JDBC最初始的使用
- 配置文件书写参数
文件名:jdbc.properties 路径:IDEA中resources下 内容: jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql:///travel jdbc.username=root jdbc.password=root initialSize=5 maxActive=10 maxWait=3000
- 提取utils
import java.io.IOException; import java.io.InputStream; import java.sql.*; import java.util.Properties; public class JDBCUtils1 { private static String driver; private static String url; private static String username; private static String password; static { //读取资源文件,获取参数 Properties pro = new Properties(); //用类加载的方式,将文件转为输入流 InputStream is = JDBCUtils.class.getClassLoader().getResourceAsStream("jdbc.properties"); try { //加载文件 pro.load(is); //给属性赋值 driver = pro.getProperty("jdbc.driver"); url=pro.getProperty("jdbc.url"); username=pro.getProperty("jdbc.username"); password=pro.getProperty("jdbc.password"); //注册驱动 Class.forName(driver); } catch (IOException e) { e.printStackTrace(); } catch (ClassNotFoundException e) { e.printStackTrace(); } } /** * 获取数据库连接 * @return */ public static Connection getConnection() throws SQLException { return DriverManager.getConnection(url,username,password); } /** * 关闭资源,包含结果集 */ public static void close(ResultSet rs, Statement st,Connection conn) { 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(); } } } /** * 关闭资源,不包含结果集 */ public static void close(Statement st,Connection conn){ close(null,st,conn); } }
- 测试方法
@Test public void test1(){ Connection conn = null; PreparedStatement pstmt=null; ResultSet rs = null; User user = null; try { conn = JDBCUtils1.getConnection(); String sql = "select * from tab_user where uid=?"; //预编译sql语句 pstmt = conn.prepareStatement(sql); //给占位符赋值 pstmt.setInt(1,10); user = new User(); //执行sql语句,获得结果集 rs = pstmt.executeQuery(); while(rs.next()){ user.setName(rs.getString("username")); user.setUid(rs.getInt("uid")); user.setEmail(rs.getString("email")); } System.out.println(user); } catch (SQLException e) { e.printStackTrace(); }finally { JDBCUtils1.close(rs,pstmt,conn); } }
由于频繁的申请和释放数据库连接资源,影响数据库性能,所以引用数据库连接池技术
- 配置文件书写参数
文件名:druid.properties 路径:IDEA中resources下 内容: driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql:///travel username=root password=root initialSize=5 maxActive=10 maxWait=3000
- 提取utils
import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.io.InputStream; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; public class MyJDBCUtils { //数据库连接池对象(数据源) private static DataSource ds; static { InputStream is = MyJDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"); Properties pro = new Properties(); try { pro.load(is); //使用工厂方法,获取数据源 ds = DruidDataSourceFactory.createDataSource(pro); } catch (Exception e) { e.printStackTrace(); } } /** * 获取连接 * @return * @throws SQLException */ public static Connection getConnection() throws SQLException { return ds.getConnection(); } /** * 关闭方法 * @param statement * @param conn */ public static void close(Statement statement,Connection conn){ close(null,statement,conn); } /** * 关闭连接方法 * @param rs * @param statement * @param conn * @throws SQLException */ public static void close(ResultSet rs,Statement statement,Connection conn) { if(rs!=null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if(statement!=null){ try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } } if(conn!=null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } /** * 获取数据源 */ public static DataSource getDataSource(){ return ds; } }
- 测试方法
/** * 由于频繁申请和关闭资源,影响数据库效率,所以改用连接池 使用druid连接池 */ @Test public void test2(){ Connection conn = null; PreparedStatement pstmt=null; ResultSet rs = null; User user = null; try { conn = MyJDBCUtils.getConnection(); String sql = "select * from tab_user where uid=?"; pstmt = conn.prepareStatement(sql); user = new User(); pstmt.setInt(1,10); rs=pstmt.executeQuery(); while(rs.next()){ user.setName(rs.getString("username")); user.setUid(rs.getInt("uid")); user.setEmail(rs.getString("email")); } System.out.println(user); } catch (SQLException e) { e.printStackTrace(); }finally { MyJDBCUtils.close(rs,pstmt,conn); } }
我们会发现,在提取了工具类之后,dao层代码依旧繁重,其原因在于对结果集的封装处理过于繁琐,这里我使用spring的JdbcTemplate
- 配置文件书写参数(同上一例子)
文件名:druid.properties 路径:IDEA中resources下 内容: driverClassName=com.mysql.jdbc.Driver url=jdbc:mysql:///travel username=root password=root initialSize=5 maxActive=10 maxWait=3000
提取utils(同上一例子)
import com.alibaba.druid.pool.DruidDataSourceFactory; import javax.sql.DataSource; import java.io.InputStream; import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import java.util.Properties; public class MyJDBCUtils { //数据库连接池对象(数据源) private static DataSource ds; static { InputStream is = MyJDBCUtils.class.getClassLoader().getResourceAsStream("druid.properties"); Properties pro = new Properties(); try { pro.load(is); //使用工厂方法,获取数据源 ds = DruidDataSourceFactory.createDataSource(pro); } catch (Exception e) { e.printStackTrace(); } } /** * 获取连接 * @return * @throws SQLException */ public static Connection getConnection() throws SQLException { return ds.getConnection(); } /** * 关闭方法 * @param statement * @param conn */ public static void close(Statement statement,Connection conn){ close(null,statement,conn); } /** * 关闭连接方法 * @param rs * @param statement * @param conn * @throws SQLException */ public static void close(ResultSet rs,Statement statement,Connection conn) { if(rs!=null){ try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } } if(statement!=null){ try { statement.close(); } catch (SQLException e) { e.printStackTrace(); } } if(conn!=null){ try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } /** * 获取数据源 */ public static DataSource getDataSource(){ return ds; } }
- 测试方法
/** * 使用JDBCTemplete简化数据封装 */ @Test public void test3(){ JdbcTemplate template = new JdbcTemplate(MyJDBCUtils.getDataSource()); User user = null; try { String sql = "select * from tab_user where uid=?"; user = template.queryForObject(sql,new BeanPropertyRowMapper<User>(User.class),10); }catch (Exception e){ } System.out.println(user); }