博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring对 JDBC 的支持,JdbcTemplate类的使用
阅读量:5330 次
发布时间:2019-06-14

本文共 6002 字,大约阅读时间需要 20 分钟。

导包:spring框架的包 和 连接数据库连接池的c3p0包 连接mysql数据库的包;

在src目录下建立jdbc.properties文件:存放连接数据库的属性值

jdbc.user=rootjdbc.password=lxn123jdbc.driverClass=com.mysql.jdbc.Driverjdbc.jdbcUrl=jdbc:mysql:///spring1 jdbc.initPoolSize=5 jdbc.maxPoolSize=10

 

在src目录下建立spring bean configuration file的xml文件:applicationContext.xml

  <!-- 配置namedParameterJdbcTemplate,该对象可以使用具名参数, 其没有无参数的构造器, 所以必须为其构造器指定参数 -->

  <bean id="namedParameterJdbcTemplate"
    class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
    <constructor-arg ref="dataSource"></constructor-arg>
  </bean>

 

建立test类中可能用到的Employee,Department类,这里,只有属性,set,get,tostring等方法就。。。

Employee类的属性:

private Integer id;private String lastName;private String email; private Department department;

Department类的属性:

private Integer id;private String name;

 

建立类:EmployeeDao,基于注解的查询方法

package com.atguigu.spring.jdbc;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.stereotype.Component; @Component//基本注解 public class EmployeeDao { @Autowired public JdbcTemplate jdbcTemplate; public Employee get(Integer id){ String sql="select id,last_name,email from tables where id=?"; RowMapper
rowMapper=new BeanPropertyRowMapper<>(Employee.class); Employee employee=jdbcTemplate.queryForObject(sql, rowMapper, id); return employee; } }

 

建立一个JUtil Test测试类:JDBCTest

package com.atguigu.spring.jdbc;import static org.junit.Assert.*;import java.util.List; import java.sql.SQLException; import java.util.ArrayList; import javax.sql.DataSource; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.jdbc.core.BeanPropertyRowMapper; //测试类 import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; public class JDBCTest { private ApplicationContext ctx=null; private JdbcTemplate jdbcTemplate; private EmployeeDao employeeDao; private NamedParameterJdbcTemplate namedParameterJdbcTemplate; { ctx=new ClassPathXmlApplicationContext("applicationContext.xml"); jdbcTemplate=(JdbcTemplate) ctx.getBean("jdbcTemplate"); employeeDao=ctx.getBean(EmployeeDao.class);      namedParameterJdbcTemplate=ctx.getBean(NamedParameterJdbcTemplate.class); }   

  @Test

  /**
   * 使用具名参数时, 可以使用 update(String sql, SqlParameterSource paramSource) 方法进行更新操作
  * 1. SQL 语句中的参数名和类的属性一致!即上边employee中属性一致
  * 2. 使用 SqlParameterSource 的 BeanPropertySqlParameterSource 实现类作为参数.
  */
  public void testNamedParameterJdbcTemplate2(){
    String sql="insert into tables(last_name,email,dept_id) values(:lastName,:email,:deptId)";
    Employee employee=new Employee();
    employee.setLastName("panpan");
    employee.setEmail("@panpan");
    employee.setDeptId(4);
    SqlParameterSource paramSource=new BeanPropertySqlParameterSource(employee);
    namedParameterJdbcTemplate.update(sql, paramSource);
  }

     

   //可以为参数起名字

   //好处: 若有多个参数, 则不用再去对应位置, 直接对应参数名, 便于维护
  //缺点: 较为麻烦.
  public void testNamedParameterJdbcTemplate(){
    String sql="insert into tables(last_name,email,dept_id) values(:la,:em,:de)";
    Map<String, Object> paramMap=new HashMap<String, Object>();
    paramMap.put("la", "fsd");
    paramMap.put("em", "@ji");
    paramMap.put("de", 3);
    namedParameterJdbcTemplate.update(sql, paramMap);
  }

@Test    //对基于注解的方法测试    public void testEmployeeDao(){ System.out.println(employeeDao.get(1)); } //获取单个列的值, 或做统计查询 //使用 queryForObject(String sql, Class
requiredType) public void testQueryForObject2(){ String sql="select count(id) from tables"; long count=jdbcTemplate.queryForObject(sql, Long.class); System.out.println(count); } //查到实体类的集合 //注意调用的不是 queryForList 方法 public void testQueryForList(){ String sql="select id,last_name,email from tables where id>?"; RowMapper
rowMapper=new BeanPropertyRowMapper<>(Employee.class); List
employees=jdbcTemplate.query(sql, rowMapper, 1); System.out.println(employees); } /** * 从数据库中获取一条记录, 实际得到对应的一个对象 * 注意不是调用 queryForObject(String sql, Class
requiredType, Object... args) 方法! * 而需要调用 queryForObject(String sql, RowMapper
rowMapper, Object... args) * 1. 其中的 RowMapper 指定如何去映射结果集的行, 常用的实现类为 BeanPropertyRowMapper * 2. 使用 SQL 中列的别名完成列名和类的属性名的映射. 例如 last_name lastName * 3. 不支持级联属性. JdbcTemplate 到底是一个 JDBC 的小工具, 而不是 ORM 框架 */ public void testQueryForObject(){ String sql="select id,last_name lastName,email,dept_id as \"department.id\" from tables where id=?"; RowMapper
rowMapper=new BeanPropertyRowMapper<>(Employee.class); Employee employee=jdbcTemplate.queryForObject(sql, rowMapper,1); System.out.println(employee); } //执行批量更新: 批量的 INSERT, UPDATE, DELETE //最后一个参数是 Object[] 的 List 类型: 因为修改一条记录需要一个 Object 的数组, //那么多条不就需要多个 Object 的数组 public void testBatchUpdate(){ String sql="insert into tables(last_name,email,dept_id) values(?,?,?)"; List
batchArgs=new ArrayList<>(); batchArgs.add(new Object[]{"AAA","testa",5}); batchArgs.add(new Object[]{"BBB","JIJK",6}); batchArgs.add(new Object[]{"CCC","panpN",3}); batchArgs.add(new Object[]{"DDD","jfids",2}); batchArgs.add(new Object[]{"EEE","tfsd",4}); jdbcTemplate.batchUpdate(sql,batchArgs); } //执行 INSERT, UPDATE, DELETE,只修改sql语句,即可 public void testUpdate(){ String sql="update tables set last_name=? where id=?"; jdbcTemplate.update(sql, "权", "1"); } //测试数据库连接池是否连接成功 public void testDataSource() throws SQLException { DataSource dataSource=ctx.getBean(DataSource.class); System.out.println(dataSource.getConnection()); } }

 

 

转载于:https://www.cnblogs.com/xijin-wu/p/6211889.html

你可能感兴趣的文章
图像处理基础(4):高斯滤波器详解
查看>>
Palindromes&nbsp;_easy&nbsp;version
查看>>
Mac上使用brew安装nvm来支持多版本的Nodejs
查看>>
vuejs数据双向绑定原理(get & set)
查看>>
LAMP、LNMP实战之四搭建mysql(持续更新)
查看>>
iOS 开发者必知的 75 个工具(译文)
查看>>
rabbitmq
查看>>
原型学习
查看>>
编程数学-中括号
查看>>
缓存-System.Web.Caching.Cache
查看>>
关于迭代器
查看>>
c++命名空间
查看>>
Excel文件按照指定模板导入数据(用jxl.jar包)
查看>>
Hive基本操作与案例
查看>>
React的使用与JSX的转换
查看>>
HDU 5056 Boring count
查看>>
HDU 6134 Battlestation Operational(莫比乌斯反演)
查看>>
Android开发规范——命名
查看>>
ssdb binlog机制 存疑
查看>>
Vue 2.0 组件库总结
查看>>