Spring中使用JdbcTemplate訪問數據庫

Spring JDBC是Spring所提供的持久層技術,它的主要目的降低JDBC API的使用難度,以一種更直接、更簡潔的方式使用JDBC API。

Spring JDBC中,僅僅需要做那些和業務相關的DML操作的事兒而將獲取資源、Statement創建、釋放資源以及異常處理等繁雜乏味的工作交給Spring JDBC.

1. 導包 

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jdbc</artifactId>
    <version>5.0.8.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-tx</artifactId>
    <version>5.0.8.RELEASE</version>
</dependency>

2. 核心配置文件 applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd
		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.3.xsd">
	
	<!-- 使用註解驅動 自動註冊bean  -->
	<context:component-scan base-package="cn.jq.springdemo"></context:component-scan>
	<!-- 導入資源屬性文件 -->
	<context:property-placeholder location="classpath:jdbc.properties"/>
	<!-- c3p0 連接池 -->
	<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
		<!-- 類似EL表達式取資源文件的值 -->
		<property name="driverClass" value="${jdbc.driverClass}"></property>
		<property name="jdbcUrl" value="${jdbc.url}"></property>
		<property name="user" value="${jdbc.user}"></property>
		<property name="password" value="${jdbc.password}"></property>
		<property name="initialPoolSize" value="${c3p0.initialPoolSize}"></property>
		<property name="acquireIncrement" value="${c3p0.acquireIncrement}"></property>
		<property name="maxPoolSize" value="${c3p0.maxPoolSize}"></property>
		<property name="minPoolSize" value="${c3p0.minPoolSize}"></property>
		<property name="maxStatements" value="${c3p0.maxStatements}"></property>
		<property name="maxStatementsPerConnection" value="${c3p0.maxStatementsPerConnection}"></property>
	</bean>

	<!-- 配置spring的jdbcTemplate -->
	<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
		<property name="dataSource" ref="dataSource"></property>
	</bean>
	
</beans>

 

3. 測試類

jdbcTemplate對象的調用方法查看

 1) 增刪改 都使用 update 方法

        @Test
	public void test() throws SQLException {
		// 1.初始化ioc容器(裝對象的容器)
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
	
		//2. 獲取jdbcTemplate對象
		JdbcTemplate jdbcTemplate = (JdbcTemplate) context.getBean("jdbcTemplate");
		//增刪改
		String sql = "insert into t_user(username,password) values(?,?)";
		jdbcTemplate.update(sql, "lisi","lisi123");

		String sql2 = "update t_user set password=? where id=?";
		jdbcTemplate.update(sql2, "123456",3);

		String sql3 = "delete from t_user where id=3";
		jdbcTemplate.update(sql3);

}

2) 查詢一條數據, 返回值爲對應對象的集合

        @Test
	public void test() throws SQLException {
		// 1.初始化ioc容器(裝對象的容器)
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
	
		//2. 獲取jdbcTemplate對象
		JdbcTemplate jdbcTemplate = (JdbcTemplate) context.getBean("jdbcTemplate");
				
		String sql = "select * from t_user where id=?";
		RowMapper<User> rowMapper = new BeanPropertyRowMapper<>(User.class);
		User user = jdbcTemplate.queryForObject(sql, rowMapper,1);
		System.out.println(user);
}

3)查詢多條數據,返回值爲map的集合

        @Test
	public void test() throws SQLException {
		// 1.初始化ioc容器(裝對象的容器)
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
	
		//2. 獲取jdbcTemplate對象
		JdbcTemplate jdbcTemplate = (JdbcTemplate) context.getBean("jdbcTemplate");
		
		//查詢多條數據, 
		String sql = "select * from t_user where id>?";
		RowMapper<User> rowMapper = new BeanPropertyRowMapper<>(User.class);
		//List<User> userlist = jdbcTemplate.query(sql,rowMapper,0); //自動映射成對象List集合
		List<Map<String, Object>> userlist = jdbcTemplate.queryForList(sql,0);//自動映射成多個Map對象
		System.out.println(userlist);//[{id=1, username=admin, password=admin123}, {id=2, username=lisi, password=lisi123}]

		//自動映射成單個Map對象, 多個會報錯
		String sql2 = "select * from t_user where id=?";
		Map<String, Object> usermap = jdbcTemplate.queryForMap(sql2,1);
		System.out.println(usermap);//{id=1, username=admin, password=admin123}
)

4) 查詢一個值,如:某列的一個值,總條數

	@Test
	public void test() throws SQLException {
		// 1.初始化ioc容器(裝對象的容器)
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
	
		//2. 獲取jdbcTemplate對象
		JdbcTemplate jdbcTemplate = (JdbcTemplate) context.getBean("jdbcTemplate");
		
		//查詢一個值,如:某列的一個值,總條數
		String sql = "select count(id) from t_user";
		Long count = jdbcTemplate.queryForObject(sql, Long.class); //返回值類型的大CLass
		System.out.println(count);  //2
	}

 

二, 項目中使用

Dao 類中 注入 jdbcTemplate, 或者寫一個util類 提供static方法,通過類名.方法名訪問,

@Repository("userDao")
public class UserDaoImpl implements UserDao{
	@Autowired
	private JdbcTemplate jdbcTemplate;

	public User getUser(int id) {
		String sql = "select * from t_user where id=?";
		RowMapper<User> rowMapper = new BeanPropertyRowMapper<>(User.class);
		User user = jdbcTemplate.queryForObject(sql, rowMapper,id);
		return user;
	}
}

測試類 訪問DAO類

	@Test
	public void test() throws SQLException {
		// 1.初始化ioc容器(裝對象的容器)
		ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
	
		UserDao userDao = (UserDao) context.getBean("userDao");
		User user = userDao.getUser(1);
		System.out.println(user);//User [id=1, username=admin, password=admin123]
	}

 

參考文章: https://blog.csdn.net/yangshangwei/article/details/78119011?locationNum=1&fps=1

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章