上一章:[Spring+SpringMVC+Mybatis]框架學習筆記(二):Spring-IOC-DI
下一章:[Spring+SpringMVC+Mybatis]框架學習筆記(四):Spring實現AOPhtml
利用springJdbcTemplate實現一個表的簡單的增刪改查。java
事先建表:mysql
CREATE DATABASE STUDENT; USE STUDENT; CREATE TABLE STUDENT( ID INT PRIMARY KEY AUTO_INCREMENT, NAME VARCHAR(20) NOT NULL, AGE INT NOT NULL, SEX TINYINT(1) UNSIGNED DEFAULT 0 NOT NULL )AUTO_INCREMENT = 100000; INSERT INTO STUDENT(NAME,AGE,SEX) VALUES("STEVEN",31,1); INSERT INTO STUDENT(NAME,AGE) VALUES("LUCY",28);
注入數據庫鏈接的四要素(數據庫類型、地址、用戶名、密碼):spring
package com.steven.spring.sysmgr.entity; import java.io.Serializable; /** * 實體類 * @author chenyang * */ public class Student implements Serializable{ /** * */ private static final long serialVersionUID = -3587920774423955014L; public Student(){ } private int id; private String name; private int age; private int sex; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public int getSex() { return sex; } public void setSex(int sex) { this.sex = sex; } }
1)DAO接口:sql
package com.steven.spring.sysmgr.dao; import java.util.List; import java.util.Map; import com.steven.spring.sysmgr.entity.Student; public interface IStudentDao { public boolean addStudent(Student student); public boolean delStudent(Integer studentId); public boolean updateStudent(Student student); public List<Map<String, Object>> getStudentMap(); public List<Student> getStudentList(); }
2)DAO接口的實現:數據庫
package com.steven.spring.sysmgr.dao.impl; import java.sql.ResultSet; import java.sql.SQLException; import java.util.List; import java.util.Map; import org.springframework.jdbc.core.JdbcTemplate; import org.springframework.jdbc.core.RowMapper; import com.steven.spring.sysmgr.dao.IStudentDao; import com.steven.spring.sysmgr.entity.Student; public class StudentDao implements IStudentDao{ private JdbcTemplate jdbcTemplate; public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } @Override public boolean addStudent(Student student) { boolean flag = false; String addSql = "INSERT INTO STUDENT(NAME,AGE,SEX) VALUES(?,?,?)"; int rows = this.jdbcTemplate.update(addSql, student.getName(), student.getAge(), student.getSex()); if(rows > 0){ flag = true; } return flag; } @Override public boolean delStudent(Integer studentId) { boolean flag = false; String delSql = "DELETE FROM STUDENT WHERE ID = ?"; int rows = this.jdbcTemplate.update(delSql, studentId); if(rows > 0){ flag = true; } return flag; } @Override public boolean updateStudent(Student student) { boolean flag = false; String updateSql = "UPDATE STUDENT SET NAME=?, AGE=?, SEX=? WHERE ID=? "; int rows = this.jdbcTemplate.update(updateSql, student.getName(), student.getAge(), student.getSex(), student.getId()); if(rows > 0){ flag = true; } return flag; } @Override public List<Map<String, Object>> getStudentMap() { return this.jdbcTemplate.queryForList("SELECT ID,NAME,AGE,SEX FROM STUDENT"); } @Override public List<Student> getStudentList() { String querySql = "SELECT ID, NAME, AGE, SEX FROM STUDENT"; //第1種方式:用接口的匿名內部類來實現,優勢:能夠根據需求作二次改造 /*return this.jdbcTemplate.query(querySql, new RowMapper<Student>(){ @Override public Student mapRow(ResultSet rs, int rowNum) throws SQLException { Student student = new Student(); student.setId(rs.getInt("ID")); student.setName(rs.getString("NAME")); student.setAge(rs.getInt("AGE")); student.setSex(rs.getInt("SEX")); return student; } });*/ //第2種方式:直接將行結果集映射到實體類中,優勢:簡便 return this.jdbcTemplate.query(querySql, new BeanPropertyRowMapper<Student>(Student.class)); } }
1)服務類接口:apache
package com.steven.spring.sysmgr.service; import java.util.List; import java.util.Map; import com.steven.spring.sysmgr.entity.Student; public interface IStudentService { public boolean addStudent(Student student); public boolean delStudent(Integer studentId); public boolean updateStudent(Student student); public List<Map<String, Object>> getStudentMap(); public List<Student> getStudentList(); }
2)服務類接口的實現,它依賴於IStudentDao:app
package com.steven.spring.sysmgr.service.impl; import java.util.List; import java.util.Map; import com.steven.spring.sysmgr.dao.IStudentDao; import com.steven.spring.sysmgr.entity.Student; import com.steven.spring.sysmgr.service.IStudentService; public class StudentService implements IStudentService{ private IStudentDao studentDao; public void setStudentDao(IStudentDao studentDao) { this.studentDao = studentDao; } @Override public boolean addStudent(Student student) { // TODO Auto-generated method stub return this.studentDao.addStudent(student); } @Override public boolean delStudent(Integer studentId) { // TODO Auto-generated method stub return this.studentDao.delStudent(studentId); } @Override public boolean updateStudent(Student student) { // TODO Auto-generated method stub return this.studentDao.updateStudent(student); } @Override public List<Map<String, Object>> getStudentMap() { // TODO Auto-generated method stub return this.studentDao.getStudentMap(); } @Override public List<Student> getStudentList() { // TODO Auto-generated method stub return this.studentDao.getStudentList(); } }
spring-IOC的配置文件applicationContext.xml:利用SpringIOC實現服務類和DAO類的依賴框架
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 註冊服務類,並描述依賴關係 --> <bean id="studentService" class="com.steven.spring.sysmgr.service.impl.StudentService"> <property name="studentDao" ref="studentDao"/> </bean> <!-- 註冊DAO類 --> <bean id="studentDao" class="com.steven.spring.sysmgr.dao.impl.StudentDao"> <property name="jdbcTemplate" ref="jdbcTemplate"/> </bean> <!-- 註冊springJdbc查詢模板,模板依賴於數據源 --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 註冊spring自帶的管理數據庫鏈接的數據源 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://127.0.0.1:3306/student"/> <property name="username" value="root"/> <property name="password" value="123"/> </bean> </beans>
package com.steven.spring.sysmgr.test; import org.junit.Before; import org.junit.Test; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import com.steven.spring.sysmgr.entity.Student; import com.steven.spring.sysmgr.service.IStudentService; public class SpringJdbcTest { private ApplicationContext ac; @Before public void init(){ ac = new ClassPathXmlApplicationContext("applicationContext.xml"); } //模擬增長功能 @Test public void testAddStudent(){ IStudentService studentService = (IStudentService) ac.getBean("studentService"); Student student = new Student(); student.setName("Jacky"); student.setAge(35); student.setSex(1); System.out.println(studentService.addStudent(student)); } //模擬刪除功能 @Test public void testDelStudent(){ IStudentService studentService = (IStudentService) ac.getBean("studentService"); int delStudentId = 100000; System.out.println(studentService.delStudent(delStudentId)); } //模擬更改功能 @Test public void testUpdateStudent(){ IStudentService studentService = (IStudentService) ac.getBean("studentService"); Student student = new Student(); student.setId(100001); student.setName("Lily"); student.setAge(26); student.setSex(0); System.out.println(studentService.updateStudent(student)); } //模擬查詢功能,返回List<Student> @Test public void testGetStudentList(){ IStudentService studentService = (IStudentService) ac.getBean("studentService"); System.out.println(studentService.getStudentList()); } //模擬查詢功能,返回List<Map<String, object>> @Test public void testGetStudentMap(){ IStudentService studentService = (IStudentService) ac.getBean("studentService"); System.out.println(studentService.getStudentMap()); } }
一、在服務層接口實現類(@Service(...))和Dao層接口實現類(@Repository(...))中分別加入註解表示符,並聲明依賴關係(@Autowired)ide
1)DAO的實現類
package com.steven.spring.sysmgr.dao.impl; 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.stereotype.Repository; import com.steven.spring.sysmgr.dao.IStudentDao; import com.steven.spring.sysmgr.entity.Student; @Repository("studentDao") public class StudentDao implements IStudentDao{ @Autowired private JdbcTemplate jdbcTemplate; public void setJdbcTemplate(JdbcTemplate jdbcTemplate) { this.jdbcTemplate = jdbcTemplate; } @Override public boolean addStudent(Student student) { boolean flag = false; String addSql = "INSERT INTO STUDENT(NAME,AGE,SEX) VALUES(?,?,?)"; int rows = this.jdbcTemplate.update(addSql, student.getName(), student.getAge(), student.getSex()); if(rows > 0){ flag = true; } return flag; } @Override public boolean delStudent(Integer studentId) { boolean flag = false; String delSql = "DELETE FROM STUDENT WHERE ID = ?"; int rows = this.jdbcTemplate.update(delSql, studentId); if(rows > 0){ flag = true; } return flag; } @Override public boolean updateStudent(Student student) { boolean flag = false; String updateSql = "UPDATE STUDENT SET NAME=?, AGE=?, SEX=? WHERE ID=? "; int rows = this.jdbcTemplate.update(updateSql, student.getName(), student.getAge(), student.getSex(), student.getId()); if(rows > 0){ flag = true; } return flag; } @Override public List<Map<String, Object>> getStudentMap() { return this.jdbcTemplate.queryForList("SELECT ID,NAME,AGE,SEX FROM STUDENT"); } @Override public List<Student> getStudentList() { String querySql = "SELECT ID, NAME, AGE, SEX FROM STUDENT"; //第1種方式:用接口的匿名內部類來實現,優勢:能夠根據需求作二次改造 /*return this.jdbcTemplate.query(querySql, new RowMapper<Student>(){ @Override public Student mapRow(ResultSet rs, int rowNum) throws SQLException { Student student = new Student(); student.setId(rs.getInt("ID")); student.setName(rs.getString("NAME")); student.setAge(rs.getInt("AGE")); student.setSex(rs.getInt("SEX")); return student; } });*/ //第2種方式:直接將行結果集映射到實體類中,優勢:簡便 return this.jdbcTemplate.query(querySql, new BeanPropertyRowMapper<Student>(Student.class)); } }
2)服務層的實現類
package com.steven.spring.sysmgr.service.impl; import java.util.List; import java.util.Map; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.steven.spring.sysmgr.dao.IStudentDao; import com.steven.spring.sysmgr.entity.Student; import com.steven.spring.sysmgr.service.IStudentService; @Service("studentService") public class StudentService implements IStudentService{ @Autowired private IStudentDao studentDao; public void setStudentDao(IStudentDao studentDao) { this.studentDao = studentDao; } @Override public boolean addStudent(Student student) { // TODO Auto-generated method stub return this.studentDao.addStudent(student); } @Override public boolean delStudent(Integer studentId) { // TODO Auto-generated method stub return this.studentDao.delStudent(studentId); } @Override public boolean updateStudent(Student student) { // TODO Auto-generated method stub return this.studentDao.updateStudent(student); } @Override public List<Map<String, Object>> getStudentMap() { // TODO Auto-generated method stub return this.studentDao.getStudentMap(); } @Override public List<Student> getStudentList() { // TODO Auto-generated method stub return this.studentDao.getStudentList(); } }
二、在配置文件中進行加入約束和掃描包
<?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" xsi:schemaLocation=" http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <!-- 掃描包 --> <context:component-scan base-package="com.steven.spring.sysmgr"></context:component-scan> <!-- 註冊springJdbc查詢模板,模板依賴於數據源 --> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 註冊spring自帶的管理數據庫鏈接的數據源 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://127.0.0.1:3306/student"/> <property name="username" value="root"/> <property name="password" value="123"/> </bean> </beans>
在Dao接口實現裏,不用引入JdbcTemplate的接口,而是繼承JdbcDaoSupport。由於JdbcDaoSupport類引入了JdbcTemlate。
使用這種方式時,能夠不用注入jdbcTemplate,即dao實現類直接依賴於dataSource。由於在類JdbcDaoSupport中會實例化JdbcTemplate。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 註冊服務類,並描述依賴關係 --> <bean id="studentService" class="com.steven.spring.sysmgr.service.impl.StudentService"> <property name="studentDao" ref="studentDao"/> </bean> <!-- 註冊DAO類: 當Dao實現類繼承了JdbcDaoSupport,能夠直接注入dataSource--> <bean id="studentDao" class="com.steven.spring.sysmgr.dao.impl.StudentDao"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 註冊spring自帶的管理數據庫鏈接的數據源 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://127.0.0.1:3306/student"/> <property name="username" value="root"/> <property name="password" value="123"/> </bean> </beans>
一、在src根目錄下新建一個配置文件jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://127.0.0.1:3306/student jdbc.user=root jdbc.password=123
二、讓spring加載配置文件
1)加載properties配置文件內容
方式1:
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location" value="classpath:jdbc.properties"/> </bean>
方式2:
首先在xml配置文件中引入context頭文件標籤。
<context:property-placeholder location="classpath:jdbc.properties"/>
2)將dataSource的bean標籤更改成:
<!-- 註冊spring自帶的管理數據庫鏈接的數據源 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.user}"/> <property name="password" value="${jdbc.password}"/> </bean>
1)引入c3p0數據鏈接池的jar包:c3p0-0.9.0.jar
2)xml配置文件數據源鏈接部分改成(注意不一樣點):
<!-- 註冊c3p0數據源鏈接池 --> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> <property name="driverClass" value="${jdbc.driver}"/> <property name="jdbcUrl" value="${jdbc.url}"/> <property name="user" value="${jdbc.user}"/> <property name="password" value="${jdbc.password}"/> </bean>
1)引入dbcp數據源鏈接池(Apache公司)須要的jar包
commons-dbcp-1.4.jar
commons-pool-1.6.jar
2)xml配置文件數據源鏈接部分改成(注意不一樣點):
<!-- 註冊dbcp數據源鏈接池 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"> <property name="driverClassName" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.user}"/> <property name="password" value="${jdbc.password}"/> </bean>
上一章:[Spring+SpringMVC+Mybatis]框架學習筆記(二):Spring-IOC-DI
下一章:[Spring+SpringMVC+Mybatis]框架學習筆記(四):Spring實現AOP