spring使用JdbcTemplate和jdbcDaosupport及具名参数使用
關于jdbctemplate:
個人感覺比Java鏈接mysql那一套方便好維護多了,只需在配置文件維護即可
需要的包:
com.springsource.net.sf.cglib-2.2.0.jar
com.springsource.org.aopalliance-1.0.0.jar
com.springsource.org.aspectj.weaver-1.6.8.RELEASE.jar
commons-logging-1.1.3.jar
mysql-connector-java-5.1.7-bin.jar
spring-aop-4.0.0.RELEASE.jar
spring-aspects-4.0.0.RELEASE.jar
spring-beans-4.0.0.RELEASE.jar
spring-context-4.0.0.RELEASE.jar
spring-core-4.0.0.RELEASE.jar
spring-expression-4.0.0.RELEASE.jar
spring-jdbc-4.0.0.RELEASE.jar
spring-orm-4.0.0.RELEASE.jar
spring-tx-4.0.0.RELEASE.jar
spring-web-4.0.0.RELEASE.jar
spring-webmvc-4.0.0.RELEASE.jar
具體步驟:
配置外部資源文件(db.properties)
配置mysal數據源
配置jdbctemplate
bean.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:jdbc="http://www.springframework.org/schema/jdbc"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.1.xsdhttp://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-4.1.xsd"><!-- 裝配自導掃描的包 --><context:component-scan base-package="com.spring.bean.jdbc"></context:component-scan><!-- 加載外部資源文件 --><context:property-placeholder location="classpath:db.properties"/><!-- 配置MySQL數據源 --><bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"><property name="driverClassName" value="${db.driverClassName}"></property><property name="url" value="${db.url}"></property><property name="username" value="${db.username}"></property><property name="password" value="${db.password}"></property> </bean><!--配置jdbcTemplate模板 --><bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"><property name="dataSource"><ref bean="dataSource"/></property></bean><!-- 配置namedParameterJdbcTemplate ,具名參數 --><bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate"><constructor-arg ref="dataSource"></constructor-arg></bean></beans>外部資源文件
db.driverClassName=com.mysql.jdbc.Driver db.url=jdbc:mysql://localhost:3306/students db.username=root db.password=root實體students
package com.spring.bean.jdbc;/*** 學生實體類* @author Administrator**/ public class Students {private Integer Id;private String name;private String sex;private int age;private String tel;public Integer getId() {return Id;}public void setId(Integer id) {Id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getSex() {return sex;}public void setSex(String sex) {this.sex = sex;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String getTel() {return tel;}public void setTel(String tel) {this.tel = tel;}@Overridepublic String toString() {return "Students [Id=" + Id + ", name=" + name + ", sex=" + sex+ ", age=" + age + ", tel=" + tel + "]";}}實體course
package com.spring.bean.jdbc;public class Course {private Integer id;private String coursename;private String coursenameid;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}public String getCoursename() {return coursename;}public void setCoursename(String coursename) {this.coursename = coursename;}public String getCoursenameid() {return coursenameid;}public void setCoursenameid(String coursenameid) {this.coursenameid = coursenameid;}@Overridepublic String toString() {return "Course [id=" + id + ", coursename=" + coursename+ ", coursenameid=" + coursenameid + "]";} }jdbctemplate
package com.spring.bean.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.Repository; @Repository public class StudentsDao {@Autowiredprivate JdbcTemplate jdbcTemplate;public Students getStudent(String sql, Integer id) {RowMapper<Students> rowMapper = new BeanPropertyRowMapper<Students>(Students.class);Students students = jdbcTemplate.queryForObject(sql, rowMapper, id);return students;} }jdbcDaosupport
package com.spring.bean.jdbc;import javax.sql.DataSource;import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.support.JdbcDaoSupport; import org.springframework.stereotype.Repository; @Repository public class CourseDao extends JdbcDaoSupport {/**此處必須加入dataSource或jdbcTemplate要么報錯如下* Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: 'dataSource' or 'jdbcTemplate' is required* 如不加jdbcTemplate。要用dataSource* name只能重新加入dataSource,為什么我用了setDataSource22為DataSource賦值* 因在JdbcDaoSupport類中為final關鍵字修飾,不可重寫* @param dataSource*/@Autowiredpublic void setDataSource22(DataSource dataSource) {setDataSource(dataSource);}/*** 獲取課程* @param sql* @param id* @return*/public Course getCourse(String sql,int id){RowMapper<Course> rowMapper = new BeanPropertyRowMapper<Course>(Course.class);Course course = getJdbcTemplate().queryForObject(sql, rowMapper,id);return course;} }測試類具體見注釋
package com.spring.bean.jdbc;import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import org.springframework.dao.DataAccessException; import org.springframework.jdbc.core.BeanPropertyRowMapper; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import org.springframework.jdbc.core.namedparam.BeanPropertySqlParameterSource; import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate; import org.springframework.jdbc.core.namedparam.SqlParameterSource;public class MainTest {private ApplicationContext ctx=null;private StudentsDao studentsDao;private JdbcTemplate jdbcTemplate;private NamedParameterJdbcTemplate namedParameterJdbcTemplate;private CourseDao courseDao;{ctx=new ClassPathXmlApplicationContext("bean.xml");jdbcTemplate=(JdbcTemplate) ctx.getBean("jdbcTemplate");studentsDao=(StudentsDao) ctx.getBean("studentsDao");namedParameterJdbcTemplate=(NamedParameterJdbcTemplate)ctx.getBean("namedParameterJdbcTemplate");courseDao=(CourseDao) ctx.getBean("courseDao");}/**
*更新某一條操作
*/@Testpublic void getCourse(){String sql="SELECT * from course WHERE id=?";Course course = courseDao.getCourse(sql,1);System.out.println(course);}/*** 使用具名參數操作數據庫(可以為字段起名)* 優點就是:當字段較多,不用考慮字段的順序,效率高,即key,value的形式* 缺點:麻煩代碼量多*/@Testpublic void testnamedParameterJdbcTemplate(){String sql="INSERT INTO students ( name, sex, age, tel) VALUES (:n, :s, :a, :t)";Map<String, Object> paramMap=new HashMap<String,Object >();paramMap.put("n", "rongrong");paramMap.put("s", "man");paramMap.put("a", "25");paramMap.put("t", "18612396984");namedParameterJdbcTemplate.update(sql, paramMap);}/*** 使用具名參數操作數據庫* 使用update(String sql, SqlParameterSource paramSource)方法傳入實體參數* 要求:sql的字段名稱與對象屬性名稱一致* SqlParameterSource paramSource*/@Testpublic void testnamedParameterJdbc(){String sql="INSERT INTO course (coursename, coursenameid) VALUES (:coursename, :coursenameid);";Course course = new Course();course.setCoursenameid("As-1001");course.setCoursename("java");SqlParameterSource paramSource = new BeanPropertySqlParameterSource(course);namedParameterJdbcTemplate.update(sql, paramSource);}/*** 修改數據庫某條屬性*/@Testpublic void testUpdate(){String sql="UPDATE students SET `name`=? WHERE id=? ";jdbcTemplate.update(sql, "lucy",1);}/*** 批量更新數據* List<Object[]>此處為對象數組* 必須為對象數組,插入一條數據如:{"MT-1","man",17,"13706063546"}* 如為多條數據,那么必須為對象數組*/@Testpublic void testBatchUpdate(){String sql="INSERT INTO students ( name, sex, age, tel) VALUES (?, ?, ?, ?)";List<Object[]> batchArgs=new ArrayList<Object[]>();batchArgs.add(new Object[]{"MT-1","man",17,"13706063546"});batchArgs.add(new Object[]{"MT-2","man",18,"13706063547"});batchArgs.add(new Object[]{"MT-3","man",19,"13706063548"});batchArgs.add(new Object[]{"MT-4","man",20,"13706063549"});jdbcTemplate.batchUpdate(sql, batchArgs);}/*** 查詢返回一個實體對象集合* 注意調用的不是 queryForList 方法*/@Testpublic void testQueryForList(){String sql="SELECT id,name, sex, age, tel FROM students";RowMapper<Students> rowMapper = new BeanPropertyRowMapper<Students>(Students.class);List<Students> students = jdbcTemplate.query(sql, rowMapper); // 不是 queryForList 方法 // List<Students> students = jdbcTemplate.queryForList(sql, Students.class); System.out.println(students);}/*** 從數據庫中獲取一條記錄, 實際得到對應的一個對象* 注意不是調用 queryForObject(String sql, Class<T> requiredType, Object... args) 方法!* 而需要調用 queryForObject(String sql, RowMapper<T> rowMapper, Object... args) * 1. 其中的 RowMapper 指定如何去映射結果集的行, 常用的實現類為 BeanPropertyRowMapper* 2. 使用 SQL 中列的別名完成列名和類的屬性名的映射. 例如 name, sex, age, tel * 3. 不支持級聯屬性. JdbcTemplate 到底是一個 JDBC 的小工具, 而不是 ORM 框架*/@Testpublic void testQueryForObject(){String sql="SELECT id,name, sex, age, tel FROM students WHERE id=?";RowMapper<Students> rowMapper = new BeanPropertyRowMapper<Students>(Students.class);Students students = jdbcTemplate.queryForObject(sql, rowMapper,1);System.out.println(students);}/*** 獲取單個列的值, 或做統計查詢* 使用 queryForObject(String sql, Class<Long> requiredType) * 其中:requiredType為Integer.class可以達到統計查詢的效果* 使用 int queryForInt(String sql) throws DataAccessException,可實現*/@Testpublic void testQueryForINt(){String sql="SELECT count(id) FROM students "; // RowMapper<Students> rowMapper = new BeanPropertyRowMapper<Students>(Students.class);int long1 = jdbcTemplate.queryForInt(sql); // Integer long1 = jdbcTemplate.queryForObject(sql, Integer.class); // 不是 queryForList 方法 // List<Students> students = jdbcTemplate.queryForList(sql, Students.class); System.out.println(long1);}/*** 根據用戶id,返回用戶對象*/@Testpublic void getStudents(){String sql="SELECT id,name, sex, age, tel FROM students WHERE id=?";System.out.println(studentsDao.getStudent(sql, 4));}}
?
轉載于:https://www.cnblogs.com/longronglang/p/6271001.html
總結
以上是生活随笔為你收集整理的spring使用JdbcTemplate和jdbcDaosupport及具名参数使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 8421码到5421码的转换_8421码
- 下一篇: 21天学通C语言-学习笔记(11)