本篇緊接着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
一、導入所需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); }
七、執行成功
一、導入所需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); }
一、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