简单描述下spring访问数据库的方式
1.java原生的访问数据库的方式
public Connection getConnection() throws ClassNotFoundException,
SQLException {
// 加载MySQL的JDBC的驱动
Class.forName("com.mysql.jdbc.Driver");
String url = "jdbc:mysql://127.0.0.1:3306/test";
String username = "root";
String password = "123456";
// 创建与MySQL数据库的连接类的实例
Connection conn = DriverManager.getConnection(url, username, password);
System.out.println("Database connection established");
return conn;
}
public void query() throws Exception {
Connection conn = getConnection();
try {
// 用conn创建Statement对象类实例
Statement sql_statement = conn.createStatement();
// 执行查询,用ResultSet类的对象,返回查询的结果
String query = "select * from person";
ResultSet result = sql_statement.executeQuery(query);
// 处理结果
while (result.next()) {
int id = result.getInt("id");
String name = result.getString("name");
String age = result.getString("age");
System.out.println("id: " + id + " name: " + name + " age: " + age);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (conn != null) {
// 关闭连接
try {
conn.close();
System.out.println("Database connection terminated");
} catch (Exception e) { /* ignore close errors */
}
}
}
}
缺点:
1、数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响 数据库性能。
设想:使用数据库连接池管理数据库连接。
2、将sql语句硬编码到java代码中,如果sql 语句修改,需要重新编译java代码,不利于系统维护。
设想:将sql语句配置在xml配置文件中,即使sql变化,不需要对java代码进行重新编译。
3、向preparedStatement中设置参数,对占位符号位置和设置参数值,硬编码在java代码中,不利于系统维护。
设想:将sql语句及占位符号和参数全部配置在xml中。
4、从resutSet中遍历结果集数据时,存在硬编码,将获取表的字段进行硬编码,,不利于系统维护。
设想:将查询的结果集,自动映射成java对象。
2.JdbcTemplate访问
2.1 非配置文件方式
public void demo(){
DriverManagerDataSource dataSource=new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql:///spring");
dataSource.setUsername("root");
dataSource.setPassword("");
//DataSource设置好参数后可以通过getConnection()得到连接,就如上面原生方式访问一样
JdbcTemplate jdbcTemplate=new JdbcTemplate(dataSource);
jdbcTemplate.execute("create table temp(id int primary key,name varchar(32))");
}
这是spring 封装的jdbcTemplate,对上面方法1中的操作进行的封装。DataSource设置好参数后可以通过getConnection()得到连接,就如上面原生方式访问一样
2.2 配置文件方式
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:p="http://www.springframework.org/schema/p"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!--数据源的配置 -->
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql:///spring"></property>
<property name="username" value="root"></property>
<property name="password" value=""></property>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
<bean id="userDao" class="com.curd.spring.impl.UserDAOImpl">
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean>
</beans>
它为我们提供了JdbcDaoSupport支持类,所有DAO继承这个类,就会自动获得JdbcTemplate(前提是注入DataSource)。
上面xml文件中定义的UserDAOImpl类就继承了这个JdbcDaoSupport,所以UserDAOImpl会获得jdbcTemplate,然后在类中使用
this.getJdbcTemplate()方法来获取JdbcTemplate进行使用
3.spring和mybatis整合方式
3.1 mybatis访问数据库的方式
3.1.1 只使用xml,不使用dao接口
3.1.2使用dao接口
3.1.3 整合的方式
通过dao接口方式我们可以知道,UserMapper userMapper=sqlSession.getMapper(UserMapper.class)可以得到一个代理类,通过这个代理类来访问数据库获得数据,所以我们可以将sqlSession交给spring,让spring 获得所有的DAO代理对象,这样就可以通过容器来获得代理对象了。
具体操作方式如下:
<!--主要就是配置了如下:sqlSessionFactory和mapper扫描-->
<!-- sqlSessinFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 加载mybatis的全局配置文件 -->
<property name="configLocation" value="classpath:SqlMapConfig.xml" />
<!-- 数据库连接池 -->
<property name="dataSource" ref="dataSource" />
</bean>
<!-- mapper扫描器 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!-- 扫描包路径,如果需要扫描多个包,中间使用半角逗号隔开 -->
<property name="basePackage" value="cn.itcast.mybatis.mapper"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
将sqlSessionFactory配置给spring,再配置一个mapper扫描器,这个扫描器的作用就是将所有的DAO代理类扫描到spring容器中