18、(知识篇)Spring使用JDBCTemplate/JDBCDaoSupport/具名参数

来源:互联网 发布:国内主机推荐 知乎 编辑:程序博客网 时间:2024/05/18 00:05

/**

* Spring JdbcTemplate/JdbcDaoSupport

*  建议使用JdbcTemplate,因为JdbcDaoSuport其实调用的还是jdbctemplate的方法

*  只是集成 JDBCDaoSupport 需要再次DI 它的DataSource或者jdbctemplate

*  步骤:

*  1、在spring的xml中,配置jdbctemplate,依赖于数据源,所以需要见一个数据源bean

*  <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource"ref="dataSource"></property></bean>

*  

*  2、通过注入的jdbctemplate做增删改查操作

*   2.1 增删改:jdbcTemplate.update(sql,args); (PS:批量增加使用 jdbcTemplate.update(sql,List<Object[]>);)

*   2.2 查找返回一个值 采用queryForObject(String sql, Class<?> requiredType) 例如返回几多条记录,会用到这个

*   2.3 查找返回一个对象  采用queryForObject(String sql, RowMapper<User> rowMapper) 需要传入RowMapper对象 new BeanPropertyRowMapper<>(Class<?>);

*   2.4 获取多个对象 采用query(String sql, RowMapper<Class<?>> rowMapper) 需要传入RowMapper对象 RowMapper<User> userMapper = new BeanPropertyRowMapper<>(User.class);

*  3、使用JdbcDaoSupport

3.1 使用类集成JdbcDaoSupport

*   3.2 需要额外注入datasource或者jdbctemplate,可以参考userdao2;

*  

*  4、额外知识(使用具名参数 NamedParameterJdbcTemplate)

*   4.1 NamedParameterJdbcTemplate 配置bean时需要用构造方法传入datasource

*   4.2 将我们平时用?问号的占位符 改成冒号 (:字段名) 的形式做占位符

*   4.3 用map 键值的形式传入参数(这个日后用bean来设置将非常方便) 

* @param args

*/


测试类:

package com.spring.test;import java.util.HashMap;import java.util.List;import java.util.Map;import org.springframework.context.ApplicationContext;import org.springframework.context.support.ClassPathXmlApplicationContext;import com.spring.dao.UserDao;import com.spring.dao.UserDao2;import com.spring.vo.User;public class Test {/** * Spring JdbcTemplate/JdbcDaoSupport *  建议使用JdbcTemplate,因为JdbcDaoSuport其实调用的还是jdbctemplate的方法 *  只是集成 JDBCDaoSupport 需要再次DI 它的DataSource或者jdbctemplate *  步骤: *  1、在spring的xml中,配置jdbctemplate,依赖于数据源,所以需要见一个数据源bean *  <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"></property> </bean> *   *  2、通过注入的jdbctemplate做增删改查操作 *   2.1 增删改:jdbcTemplate.update(sql,args); (PS:批量增加使用 jdbcTemplate.update(sql,List<Object[]>);) *   2.2 查找返回一个值 采用queryForObject(String sql, Class<?> requiredType) 例如返回几多条记录,会用到这个 *   2.3 查找返回一个对象  采用queryForObject(String sql, RowMapper<User> rowMapper) 需要传入RowMapper对象 new BeanPropertyRowMapper<>(Class<?>); *   2.4 获取多个对象 采用query(String sql, RowMapper<Class<?>> rowMapper) 需要传入RowMapper对象 RowMapper<User> userMapper = new BeanPropertyRowMapper<>(User.class); *  *  3、使用JdbcDaoSupport *  3.1 使用类集成JdbcDaoSupport *   3.2 需要额外注入datasource或者jdbctemplate,可以参考userdao2; *   *  4、额外知识(使用具名参数 NamedParameterJdbcTemplate) *   4.1 NamedParameterJdbcTemplate 配置bean时需要用构造方法传入datasource *   4.2 将我们平时用?问号的占位符 改成冒号 (:字段名) 的形式做占位符 *   4.3 用map 键值的形式传入参数(这个日后用bean来设置将非常方便)  * @param args */public static void main(String[] args) {ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");UserDao userDao = ctx.getBean(UserDao.class);UserDao2 userDao2 = ctx.getBean(UserDao2.class);//增加//int row = userDao.addUser(new User(0, "Flash", 2));//System.out.println("row == "+row);//修改int row = userDao.updateUser(new User(2, "Flash", 1));//返回一个列值long count = userDao.getUserCount();System.out.println("count == "+count);//查找一个对象User user = userDao.getUserById(1);System.out.println("user == "+user);//查找多个对象List<User> lists = userDao.getUsers();System.out.println("lists == "+lists);//======JdbcDaoSupport===========User user2 = userDao2.getUserById(2);System.out.println(user2);//==========NamedParameterJDBCTemplate=====================Map<String,Object> paramMap = new HashMap<>();paramMap.put("userId", 2);User user3 = userDao.getUserByNamedParameter(paramMap);System.out.println(user3);}}

dao类(使用template):

package com.spring.dao;import java.util.List;import java.util.Map;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jdbc.core.BeanPropertyRowMapper;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.jdbc.core.RowMapper;import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate;import org.springframework.stereotype.Repository;import com.spring.vo.User;@Repositorypublic class UserDao {@Autowiredprivate JdbcTemplate template;/** * 增加 * @param user * @return */public int addUser(User user){String sql = "insert into User(userName,sex) values(?,?)";return template.update(sql, user.getUserName(),user.getSex());}/** * 更新 * @param user * @return */public int updateUser(User user){String sql = " update User set userName = ? ,sex = ? where id = ? ";return template.update(sql, user.getUserName(),user.getSex(),user.getId());}/** *  查找返回一个值 * 采用queryForObject(String sql, Class<?> requiredType)  * @return */public long getUserCount(){String sql = " select count(1) from User ";return template.queryForObject(sql,long.class);}/** * 查找返回一个对象 * 采用queryForObject(String sql, RowMapper<User> rowMapper) * 需要传入RowMapper对象 * @param userId * @return */public User getUserById(int userId){String sql = " select * from User where id = ? ";RowMapper<User> userMapper = new BeanPropertyRowMapper<>(User.class);return template.queryForObject(sql, userMapper,userId);}/** * 获取多个对象 * 采用query(String sql, RowMapper<User> rowMapper)  * 需要传入RowMapper对象 * RowMapper<User> userMapper = new BeanPropertyRowMapper<>(User.class); * @return */public List<User> getUsers(){String sql = " select * from User ";RowMapper<User> userMapper = new BeanPropertyRowMapper<>(User.class);return template.query(sql, userMapper);}//==========使用具名参数========================@Autowiredprivate NamedParameterJdbcTemplate nameTemplate;public User getUserByNamedParameter(Map<String,Object> paramMap){String sql = " select * from User where id = :userId ";return nameTemplate.queryForObject(sql, paramMap, new BeanPropertyRowMapper<>(User.class));}}

package com.spring.dao;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.jdbc.core.BeanPropertyRowMapper;import org.springframework.jdbc.core.JdbcTemplate;import org.springframework.jdbc.core.support.JdbcDaoSupport;import org.springframework.stereotype.Repository;import com.spring.vo.User;@Repositorypublic class UserDao2 extends JdbcDaoSupport{@Autowiredpublic void setTemplate(JdbcTemplate template) {setJdbcTemplate(template);}public User getUserById(int userId){String sql = " select * from User where id = ? ";return getJdbcTemplate().queryForObject(sql, new BeanPropertyRowMapper<>(User.class), userId);}}

实体类:

package com.spring.vo;import org.springframework.stereotype.Component;@Componentpublic class User {private int id;private String userName;private int sex;public User() {super();// TODO Auto-generated constructor stub}public User(int id, String userName, int sex) {super();this.id = id;this.userName = userName;this.sex = sex;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getUserName() {return userName;}public void setUserName(String userName) {this.userName = userName;}public int getSex() {return sex;}public void setSex(int sex) {this.sex = sex;}@Overridepublic String toString() {return "User [id=" + id + ", userName=" + userName + ", sex=" + sex + "]";}}

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:util="http://www.springframework.org/schema/util"xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsdhttp://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.3.xsd"><context:component-scan base-package="com.spring"></context:component-scan><!-- 指定数据源配置properties --><context:property-placeholder location="classpath:db.properties"/><bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"><property name="driverClass" value="${driverClass}" ></property><property name="jdbcUrl" value="${url}" ></property><property name="user" value="${userName}" ></property><property name="password" value="${password}"></property></bean><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource" ref="dataSource"></property></bean><!-- 让sql支持具名参数 --><bean id="nameTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate"><constructor-arg name="dataSource" ref="dataSource" ></constructor-arg></bean></beans>

db.properties

driverClass=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/TestuserName=rootpassword=root


0 0