JDBC六個步驟
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
//1. 加載驅動
Class.forName("com.mysql.jdbc.Driver");
//2. 獲取連接
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC", "root", "123456");
//3. 創建PreparedStatement 【設置參數】
ps = conn.prepareStatement("select * from user");
//4. 執行sql ==》executeXxx()
rs = ps.executeQuery();
//5. 遍歷結果集
while(rs.next()) {
System.out.println(rs.getString(2)); // 數據庫第2列數據
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
}finally {
//6. 關閉連接
try {
rs.close();
ps.close();
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
數據庫連接池
問題1:頻繁的建立連接釋放連接,造成資源的浪費。數據庫連接池,用來解決建立與釋放連接的問題。
但是數據庫連接池有dbcp連接池,c3p0連接池,druid連接池,不可能為每一個連接池實現一種連接方式。所以使用DataSource實現隔離解耦。
public static ComboPooledDataSource dataSource = new ComboPooledDataSource();
// 通過C3p0 配置數據源 DataSource,以后想要使用其它的連接池,只需改動如何獲取DataSource,不需要改動連接。
public static void dataSource(){
try {
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/qianfeng?serverTimezone=UTC");
dataSource.setUser("root");
dataSource.setPassword("123456");
dataSource.setInitialPoolSize(3);
dataSource.setMaxPoolSize(10);
dataSource.setMinPoolSize(3);
dataSource.setAcquireIncrement(3);
} catch (PropertyVetoException e) {
e.printStackTrace();
}
}
// 通過數據源,獲取連接 Connection
public static Connection conn() {
Connection conn = null;
dataSource();
try {
conn = dataSource.getConnection();
//Unknown system variable 'tx_isolation' : 可能原因是數據庫版本太高,mysql-connector-java版本太低
//conn.setTransactionIsolation(Connection.TRANSACTION_REPEATABLE_READ);
} catch (SQLException e) {
e.printStackTrace();
}
return conn;
}
在Mybatis中,配置druid數據源
<environments default="development-mysql">
<environment id="development-mysql">
<transactionManager type="JDBC"/>
<dataSource type="com.config.DruidDataSourceFactory">
<property name="url" value="${jdbc.jdbcUrl}"/>
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
Mybatis
關鍵技術點 SqlSession:執行Sql
String resource = "conf/mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
//2. SqlSessionFactoryBuilder
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//1. 構建SqlSessionFactory
SqlSessionFactory factory = builder.build(inputStream);
//3. 構建session
SqlSession session = factory.openSession();
/** 第一種方式:以前原生的方式 */
//Student s = session.selectOne("com.shang.mybatis.mapper.StudentMapper.queryStudentById", 1);
//System.out.println(s);
/** 第二種方式:演變出來的*/
StudentMapper mapper = session.getMapper(StudentMapper.class); // mapperProxyFactory ==> mapper的代理對象
Student s = mapper.queryStudentById(1);
System.out.println(s);
MyBatis是如何封裝JDBC的呢?