Spring入門詳細教程(四)

前言

本篇緊接着spring入門詳細教程(三),建議閱讀本篇前,先閱讀第一篇,第二篇以及第三篇。連接以下:html

Spring入門詳細教程(一) http://www.javashuo.com/article/p-zxflhlhl-bw.htmljava

Spring入門詳細教程(二) https://www.cnblogs.com/jichi/p/10176601.htmlmysql

Spring入門詳細教程(三) https://www.cnblogs.com/jichi/p/10177004.htmlspring

本篇主要講解spring的jdbcTemplate相關。sql

1、spring整合jdbc繼承jdbcdaosupport的方式

一、導入所需jar包。數據庫

除了以前介紹的spring的基礎包,還須要導入數據庫鏈接池包,jdbc驅動包,spring的jdbc包,spring的事務。express

二、書寫dao層代碼。apache

public class UserDaoImpl extends JdbcDaoSupport implements UserDao { @Override public void save(User u) { String sql = "insert into user values('1',?) "; super.getJdbcTemplate().update(sql, u.getName()); } @Override public void delete(Integer id) { String sql = "delete from user where id = ? "; super.getJdbcTemplate().update(sql,id); } @Override public void update(User u) { String sql = "update  user set name = ? where id=? "; super.getJdbcTemplate().update(sql, u.getName(),u.getId()); } @Override public User getById(Integer id) { String sql = "select * from user where id = ? "; return super.getJdbcTemplate().queryForObject(sql,new RowMapper<User>(){ @Override public User mapRow(ResultSet rs, int arg1) throws SQLException { User u = new User(); u.setId(rs.getInt("id")); u.setName(rs.getString("name")); return u; }}, id); } @Override public int getTotalCount() { String sql = "select count(*) from user  "; Integer count = super.getJdbcTemplate().queryForObject(sql, Integer.class); return count; } @Override public List<User> getAll() { String sql = "select * from user  "; List<User> list = super.getJdbcTemplate().query(sql, new RowMapper<User>(){ @Override public User mapRow(ResultSet rs, int arg1) throws SQLException { User u = new User(); u.setId(rs.getInt("id")); u.setName(rs.getString("name")); return u; }}); return list; } }

三、創建數據庫連接配置文件app

jdbc.jdbcUrl=jdbc:mysql:///spring
jdbc.driverClass=com.mysql.jdbc.Driver jdbc.user=root jdbc.password=1234

四、在spring容器中進行配置less

<!-- 指定spring讀取db.properties配置 -->
<context:property-placeholder location="classpath:db.properties"  />
<!-- 將鏈接池放入spring容器 -->
<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" >
    <property name="jdbcUrl" value="${jdbc.jdbcUrl}" ></property>
    <property name="driverClass" value="${jdbc.driverClass}" ></property>
    <property name="user" value="${jdbc.user}" ></property>
    <property name="password" value="${jdbc.password}" ></property>
</bean>
<!-- 將UserDao放入spring容器 -->
<bean name="userDao" class="com.jichi.jdbctemplate.UserDaoImpl" >
    <property name="dataSource" ref="dataSource" ></property>
</bean>

五、因爲userDaoImpl已經繼承了jdbcDaoSupport。jdbcDaoSupport中已經定義了jdbcTemplate,同時內置了setDataSource。能夠自動將鏈接池放入。源碼以下:

/* * Copyright 2002-2012 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */

package org.springframework.jdbc.core.support; import java.sql.Connection; import javax.sql.DataSource; import org.springframework.dao.support.DaoSupport; import org.springframework.jdbc.CannotGetJdbcConnectionException; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.datasource.DataSourceUtils; import org.springframework.jdbc.support.SQLExceptionTranslator; /** * Convenient super class for JDBC-based data access objects. * * <p>Requires a {@link javax.sql.DataSource} to be set, providing a * {@link org.springframework.jdbc.core.JdbcTemplate} based on it to * subclasses through the {@link #getJdbcTemplate()} method. * * <p>This base class is mainly intended for JdbcTemplate usage but can * also be used when working with a Connection directly or when using * {@code org.springframework.jdbc.object} operation objects. * * @author Juergen Hoeller * @since 28.07.2003 * @see #setDataSource * @see #getJdbcTemplate * @see org.springframework.jdbc.core.JdbcTemplate */
public abstract class JdbcDaoSupport extends DaoSupport { private JdbcTemplate jdbcTemplate; /** * Set the JDBC DataSource to be used by this DAO. */
    public final void setDataSource(DataSource dataSource) { if (this.jdbcTemplate == null || dataSource != this.jdbcTemplate.getDataSource()) { this.jdbcTemplate = createJdbcTemplate(dataSource); initTemplateConfig(); } } /** * Create a JdbcTemplate for the given DataSource. * Only invoked if populating the DAO with a DataSource reference! * <p>Can be overridden in subclasses to provide a JdbcTemplate instance * with different configuration, or a custom JdbcTemplate subclass. * @param dataSource the JDBC DataSource to create a JdbcTemplate for * @return the new JdbcTemplate instance * @see #setDataSource */
    protected JdbcTemplate createJdbcTemplate(DataSource dataSource) { return new JdbcTemplate(dataSource); } /** * Return the JDBC DataSource used by this DAO. */
    public final DataSource getDataSource() { return (this.jdbcTemplate != null ? this.jdbcTemplate.getDataSource() : null); } /** * Set the JdbcTemplate for this DAO explicitly, * as an alternative to specifying a DataSource. */
    public final void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; initTemplateConfig(); } /** * Return the JdbcTemplate for this DAO, * pre-initialized with the DataSource or set explicitly. */
    public final JdbcTemplate getJdbcTemplate() { return this.jdbcTemplate; } /** * Initialize the template-based configuration of this DAO. * Called after a new JdbcTemplate has been set, either directly * or through a DataSource. * <p>This implementation is empty. Subclasses may override this * to configure further objects based on the JdbcTemplate. * @see #getJdbcTemplate() */
    protected void initTemplateConfig() { } @Override protected void checkDaoConfig() { if (this.jdbcTemplate == null) { throw new IllegalArgumentException("'dataSource' or 'jdbcTemplate' is required"); } } /** * Return the SQLExceptionTranslator of this DAO's JdbcTemplate, * for translating SQLExceptions in custom JDBC access code. * @see org.springframework.jdbc.core.JdbcTemplate#getExceptionTranslator() */
    protected final SQLExceptionTranslator getExceptionTranslator() { return getJdbcTemplate().getExceptionTranslator(); } /** * Get a JDBC Connection, either from the current transaction or a new one. * @return the JDBC Connection * @throws CannotGetJdbcConnectionException if the attempt to get a Connection failed * @see org.springframework.jdbc.datasource.DataSourceUtils#getConnection(javax.sql.DataSource) */
    protected final Connection getConnection() throws CannotGetJdbcConnectionException { return DataSourceUtils.getConnection(getDataSource()); } /** * Close the given JDBC Connection, created via this DAO's DataSource, * if it isn't bound to the thread. * @param con Connection to close * @see org.springframework.jdbc.datasource.DataSourceUtils#releaseConnection */
    protected final void releaseConnection(Connection con) { DataSourceUtils.releaseConnection(con, getDataSource()); } }

六、編寫測試類

 @Test public void fun2() throws Exception{ User u = new User(); u.setName("tom"); ud.save(u); }

七、執行成功

2、spring整合jdbctemplate

一、導入所需jar包。

除了以前介紹的spring的基礎包,還須要導入數據庫鏈接池包,jdbc驅動包,spring的jdbc包,spring的事務。

二、配置jdbctemplate

<!-- 指定spring讀取db.properties配置 -->
<context:property-placeholder location="classpath:db.properties"  />
<!-- 1.將鏈接池放入spring容器 -->
<bean name="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" >
    <property name="jdbcUrl" value="${jdbc.jdbcUrl}" ></property>
    <property name="driverClass" value="${jdbc.driverClass}" ></property>
    <property name="user" value="${jdbc.user}" ></property>
    <property name="password" value="${jdbc.password}" ></property>
</bean>
<!-- 2.將JDBCTemplate放入spring容器 -->
<bean name="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" >
    <property name="dataSource" ref="dataSource" ></property>
</bean>
<!-- 3.將UserDao放入spring容器 -->
<bean name="userDao" class="com.jichi.jdbctemplate.UserDaoImpl" >
    <property name="jdbcTemplate" ref="jdbcTemplate" ></property>
</bean>

三、書寫dao層代碼

public class UserDaoImpl  implements UserDao { @Resource private JdbcTemplate jdbcTemplate; @Override public void save(User u) { String sql = "insert into user values('1',?) "; jdbcTemplate.update(sql, u.getName()); } @Override public void delete(Integer id) { String sql = "delete from user where id = ? "; jdbcTemplate.update(sql,id); } @Override public void update(User u) { String sql = "update  user set name = ? where id=? "; jdbcTemplate.update(sql, u.getName(),u.getId()); } @Override public User getById(Integer id) { String sql = "select * from user where id = ? "; return jdbcTemplate.queryForObject(sql,new RowMapper<User>(){ @Override public User mapRow(ResultSet rs, int arg1) throws SQLException { User u = new User(); u.setId(rs.getInt("id")); u.setName(rs.getString("name")); return u; }}, id); } @Override public int getTotalCount() { String sql = "select count(*) from user  "; Integer count = jdbcTemplate.queryForObject(sql, Integer.class); return count; } @Override public List<User> getAll() { String sql = "select * from user  "; List<User> list = jdbcTemplate.query(sql, new RowMapper<User>(){ @Override public User mapRow(ResultSet rs, int arg1) throws SQLException { User u = new User(); u.setId(rs.getInt("id")); u.setName(rs.getString("name")); return u; }}); return list; } }

四、書寫測試方法

 @Test public void fun2() throws Exception{ User u = new User(); u.setName("tom"); ud.save(u); }

3、spring中jdbctemplate的相關方法

一、update

用來執行insert,update,delete語句。

 @Override public void save(User u) { String sql = "insert into user values('1',?) "; jdbcTemplate.update(sql, u.getName()); } @Override public void delete(Integer id) { String sql = "delete from user where id = ? "; jdbcTemplate.update(sql,id); } @Override public void update(User u) { String sql = "update  user set name = ? where id=? "; jdbcTemplate.update(sql, u.getName(),u.getId()); }

二、查詢某一具體類

 @Override public int getTotalCount() { String sql = "select count(*) from user  "; Integer count = jdbcTemplate.queryForObject(sql, Integer.class); return count; }

三、將查詢的數據封入實體類(單個對象,實現rowmapper接口)

 @Override public User getById(Integer id) { String sql = "select * from user where id = ? "; return jdbcTemplate.queryForObject(sql,new RowMapper<User>(){ @Override public User mapRow(ResultSet rs, int arg1) throws SQLException { User u = new User(); u.setId(rs.getInt("id")); u.setName(rs.getString("name")); return u; }}, id); }

四、將查詢的數據封入實體類(list對象,實現rowmapper接口)

 @Override public List<User> getAll() { String sql = "select * from user  "; List<User> list = jdbcTemplate.query(sql, new RowMapper<User>(){ @Override public User mapRow(ResultSet rs, int arg1) throws SQLException { User u = new User(); u.setId(rs.getInt("id")); u.setName(rs.getString("name")); return u; }}); return list; }

五、根據數據庫查出的字段與實體類字段名自動對應

 @Override public List<User> getAll() { String sql = "select * from user  "; List<User> list = jdbcTemplate.query(sql,new BeanPropertyRowMapper<>(User.class)); return list; }

 

原文出處:https://www.cnblogs.com/jichi/p/10211475.html

相關文章
相關標籤/搜索