一、SpringMvc学习笔记
1、使用SpringMvc时需在web.xml文件中添加配置

<servlet>
<servlet-name>springMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet> <servlet-mapping>
<servlet-name>springMVC</servlet-name>
<url-pattern>*.do</url-pattern>
</servlet-mapping>

2、SpringMvc配置文件:spring-mvc.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:p="http://www.springframework.org/schema/p"
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.controller"/>
<-- 视图解析器-->
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
</beans>

3、controller配置:@Controller(注解形式)

@Controller
public class HelloWorldController { @RequestMapping("/helloWorld")
public String helloWorld(Model model){
model.addAttribute("message", "问候SpringMvc他大爷");
return "helloWorld"; //直接返回 /WEB-INF/jsp/helloWorld.jsp
}
}

4、防止乱码:在web.xml文件中加入

<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/</url-pattern>
</filter-mapping>

5、<mvc:annotation-driven />   <!-- 加入注解驱动 -->

<!-- 使用注解的包,包括子集 -->
<context:component-scan base-package="com.controller"/>
<context:component-scan base-package="com.model"/>

6、ModelAndView详解:

@RequestMapping("/list")
public ModelAndView list(){
ModelAndView mav=new ModelAndView();
mav.addObject("studentList", studentList);
mav.setViewName("student/list");
return mav;
} @RequestMapping("/preSave")
public ModelAndView preSave(@RequestParam(value="id",required=false) String id){
ModelAndView mav=new ModelAndView();
if (id != null) {
mav.addObject("student", studentList.get(Integer.parseInt(id)-1));
mav.setViewName("student/update");
}else {
mav.setViewName("student/add");
}
return mav;
} @RequestMapping("/save")
public String save(Student student){
if (student.getId() != 0) {
Student s = studentList.get(student.getId()-1);
s.setName(student.getName());
s.setAge(student.getAge());
}else {
studentList.add(student);
}
return "redirect:/student/list.do";//重定向
} @RequestMapping("/delete")
public String delete(@RequestParam(value="id",required=false) int id){
studentList.remove(id-1);
return "redirect:/student/list.do";//重定向
}

7、

@RequestMapping("/login")
public String login(HttpServletRequest request,HttpServletResponse response){
System.out.println("---------登录验证--------");
String userName = request.getParameter("userName");
String password = request.getParameter("password");
Cookie cookie = new Cookie("user", userName+"-"+password); User currentUser = new User(userName, password); cookie.setMaxAge(1*60*60*24*7);
response.addCookie(cookie); HttpSession session = request.getSession();
session.setAttribute("currentUser", currentUser); return "redirect:/main.jsp";
} @RequestMapping("/login2")
public String login2(HttpServletRequest request){
System.out.println("---------登录验证--------");
return "redirect:/main.jsp";
} @RequestMapping("/login3")
public String login3(HttpSession session){
System.out.println("---------登录验证--------"); session.setAttribute("currentUser", ""); return "redirect:/main.jsp";
} //直接返回user对象的ajax形式信息
@RequestMapping("/ajax")
public @ResponseBody User ajax(){
User user = new User("张三", "admin");
return user;
} @RequestMapping("/list")
public String list(Model model){
return "article/list";
} //restful风格的url
//请求地址形式为:
//<a href="${pageContext.request.contextPath}/article/details/1" target="_blank">文章一</a>
//<a href="${pageContext.request.contextPath}/article/details/2" target="_blank">文章二</a> @RequestMapping("/details/{id}")
public ModelAndView details(@PathVariable("id") int id){
ModelAndView mav=new ModelAndView();
if(id==1){
mav.addObject("article", new Article("文章一","文章一的内容"));
}else if(id==2){
mav.addObject("article", new Article("文章二","文章二的内容"));
}
mav.setViewName("article/details");
return mav;
}

8、SpringMvc配置支持文件上传:

<!-- 支持文件上传 -->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="utf-8" />
<property name="maxUploadSize" value="10485760" /><!-- maxsize 10M -->
</bean> <!-- SpringMvc特殊处理,防止静态图片资源被拦截,将其映射到/resources/**路径 -->
<mvc:resources location="/images/" mapping="/images/**"></mvc:resources>
<mvc:resources location="/css/" mapping="/css/**"></mvc:resources> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8"/>
<!-- 指定所上传文件的总大小不能超过200KB。注意maxUploadSize属性的限制不是针对单个文件,而是所有文件的容量之和 -->
<property name="maxUploadSize" value="20000000"/>
</bean>

前台页面:
1、单文件上传
前台页面配置:

<form action="upLoad.do" method="post" enctype="multipart/form-data">
<table>
<tr>
<th colspan="2">上传文件</th>
</tr>
<tr>
<td>文件一</td>
<td>
<input type="file" name="file"/>
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="上传文件"/>
</td>
</tr>
</table>
</form>

后台controller:

@RequestMapping("/upload")
public String uploadFile(@RequestParam("file1") MultipartFile file1,HttpServletRequest request)throws Exception{
String filePath=request.getServletContext().getRealPath("/");
System.out.println(filePath);
file1.transferTo(new File(filePath+"upload/"+file1.getOriginalFilename()));
return "redirect:success.html";
}

2、多文件上传
前台页面:

<form action="upLoadPic2.do" method="post" enctype="multipart/form-data">
<table>
<tr>
<th colspan="2">上传文件</th>
</tr>
<tr>
<td>文件一</td>
<td>
<input type="file" name="file"/>
</td>
</tr>
<tr>
<td>文件二</td>
<td>
<input type="file" name="file"/>
</td>
</tr>
<tr>
<td colspan="2">
<input type="submit" value="上传文件"/>
</td>
</tr>
</table>
</form>

后台controller:

@RequestMapping("/upLoadPic2")
public String uploadFiles(@RequestParam("file") MultipartFile[] files,HttpServletRequest request)throws Exception{
String filePath=request.getServletContext().getRealPath("/");
System.out.println(filePath);
for(MultipartFile file:files){
file.transferTo(new File(filePath+"upload/"+file.getOriginalFilename()));
}
return "redirect:success.html";
}

二、Spring学习笔记
1、bean配置

<bean id="zhangsan" class="com.service.ZhangSan"></bean>
<bean id="lisi" class="com.service.LiSi"></bean>
<bean id="javaWork" class="com.service.JavaWork">
<property name="tester" ref="zhangsan"></property>
</bean>

2、获取ApplicationContext对象:

ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml");
HelloWorld helloWorld = (HelloWorld) context.getBean("helloWorld");

3、bean的注入方法:
属性注入、构造注入(通过类型、索引、联合使用类型和索引)、非静态工厂注入、工厂注入、泛型依赖注入

<bean id="people" class="com.entity.People"></bean>

   <bean id="people2" class="com.entity.People">
<!-- 属性注入 -->
<property name="id" value="1"></property>
<property name="name" value="张三"></property>
<property name="age" value="20"></property>
</bean> <bean id="people3" class="com.entity.People">
<!-- 构造注入,通过类型 -->
<constructor-arg type="int" value="2"></constructor-arg>
<constructor-arg type="String" value="李四"></constructor-arg>
<constructor-arg type="int" value="22"></constructor-arg>
</bean> <bean id="people4" class="com.entity.People">
<!-- 构造注入,通过索引 -->
<constructor-arg index="0" value="3"></constructor-arg>
<constructor-arg index="1" value="王五"></constructor-arg>
<constructor-arg index="2" value="24"></constructor-arg>
</bean> <bean id="people5" class="com.entity.People">
<!-- 构造注入,联合使用 -->
<constructor-arg index="0" type="int" value="4"></constructor-arg>
<constructor-arg index="1" type="String" value="赵六"></constructor-arg>
<constructor-arg index="2" type="int" value="21"></constructor-arg>
</bean> <!-- 非静态工厂注入 -->
<bean id="peopleFactory" class="com.factory.PeopleFactory"></bean>
<bean id="people6" factory-bean="peopleFactory" factory-method="createPeople"></bean> <!-- 静态工厂注入 -->
<bean id="people7" class="com.factory.PeopleFactory2" factory-method="createPeople"></bean>

<!-- 泛型依赖注入,后边讲 -->

public class PeopleFactory {
public People createPeople(){
People people = new People();
people.setId(6);
people.setAge(29);
people.setName("李伟");
return people;
}
} public class PeopleFactory2 {
public static People createPeople(){
People people = new People();
people.setId(5);
people.setAge(23);
people.setName("刘锡");
return people;
}
}

4、各种类型注入(包括集合属性)

<bean id="people1" class="com.entity.People">
<!-- 基本属性注入 -->
<property name="id" value="1"></property>
<property name="name" value="张三"></property>
<property name="age" value="20"></property>
</bean> <bean id="people2" class="com.entity.People">
<!-- bean注入 -->
<property name="id" value="1"></property>
<property name="name" value="张三"></property>
<property name="age" value="20"></property>
<property name="dog" ref="dog"></property>
</bean>
<bean id="dog" class="com.entity.Dog">
<property name="name" value="jack"></property>
</bean> <bean id="people3" class="com.entity.People">
<!-- 内部bean注入 -->
<property name="id" value="1"></property>
<property name="name" value="张三"></property>
<property name="age" value="20"></property>
<property name="dog">
<bean class="com.entity.Dog">
<property name="name" value="tom"></property>
</bean>
</property>
</bean> <bean id="people4" class="com.entity.People">
<!-- null值,即没有dog属性 -->
<property name="id" value="1"></property>
<property name="name" value="张三"></property>
<property name="age" value="20"></property>
<property name="dog">
<null></null>
</property>
</bean> <!-- <bean id="people5" class="com.entity.People">
级联属性,dog必须先new
<property name="id" value="1"></property>
<property name="name" value="张三"></property>
<property name="age" value="20"></property>
<property name="dog.name" value="jerry"></property>
</bean> --> <bean id="people6" class="com.entity.People">
<!-- list集合注入 -->
<property name="id" value="1"></property>
<property name="name" value="张三"></property>
<property name="age" value="20"></property>
<property name="dog" ref="dog"></property>
<property name="hobbies">
<list>
<value>唱歌</value>
<value>跳舞</value>
</list>
</property>
</bean> <bean id="people7" class="com.entity.People">
<!-- set集合注入 -->
<property name="id" value="1"></property>
<property name="name" value="张三"></property>
<property name="age" value="20"></property>
<property name="dog" ref="dog"></property>
<property name="hobbies">
<list>
<value>唱歌</value>
<value>跳舞</value>
</list>
</property>
<property name="loves">
<set>
<value>唱歌2</value>
<value>跳舞2</value>
</set>
</property>
</bean> <bean id="people8" class="com.entity.People">
<!-- map集合注入 -->
<property name="id" value="1"></property>
<property name="name" value="张三"></property>
<property name="age" value="20"></property>
<property name="dog" ref="dog"></property>
<property name="hobbies">
<list>
<value>唱歌</value>
<value>跳舞</value>
</list>
</property>
<property name="loves">
<set>
<value>唱歌2</value>
<value>跳舞2</value>
</set>
</property>
<property name="works">
<map>
<entry>
<key><value>上午</value></key>
<value>写代码</value>
</entry>
<entry>
<key><value>中午</value></key>
<value>喝茶</value>
</entry>
<entry>
<key><value>下午</value></key>
<value>睡觉</value>
</entry>
</map>
</property>
</bean> <bean id="people9" class="com.entity.People">
<!-- properties属性注入 -->
<property name="id" value="1"></property>
<property name="name" value="张三"></property>
<property name="age" value="20"></property>
<property name="dog" ref="dog"></property>
<property name="hobbies">
<list>
<value>唱歌</value>
<value>跳舞</value>
</list>
</property>
<property name="loves">
<set>
<value>唱歌2</value>
<value>跳舞2</value>
</set>
</property>
<property name="works">
<map>
<entry>
<key><value>上午</value></key>
<value>写代码</value>
</entry>
<entry>
<key><value>中午</value></key>
<value>喝茶</value>
</entry>
<entry>
<key><value>下午</value></key>
<value>睡觉</value>
</entry>
</map>
</property>
<property name="address">
<props>
<prop key="address1">address1</prop>
<prop key="address2">address2</prop>
</props>
</property>
</bean>

People类主体:

private int id;
private String name;
private int age;
private Dog dog;
private List<String> hobbies = new ArrayList<String>();
private Set<String> loves = new HashSet<String>();
private Map<String, String> works = new HashMap<String, String>();
private Properties address = new Properties(); //测试类主体
private ApplicationContext ac; @Before
public void setUp() throws Exception {
ac = new ClassPathXmlApplicationContext("beans.xml");
} /*注入基本类型值*/
@Test
public void test() {
ac = new ClassPathXmlApplicationContext("beans.xml");
People people1 = (People) ac.getBean("people1");
System.out.println(people1);
} /*注入bean*/
@Test
public void test2() {
ac = new ClassPathXmlApplicationContext("beans.xml");
People people2 = (People) ac.getBean("people2");
System.out.println(people2);
} /*注入内部bean*/
@Test
public void test3() {
ac = new ClassPathXmlApplicationContext("beans.xml");
People people3 = (People) ac.getBean("people3");
System.out.println(people3);
} /*注入null*/
@Test
public void test4() {
ac = new ClassPathXmlApplicationContext("beans.xml");
People people4 = (People) ac.getBean("people4");
System.out.println(people4);
} /*级联属性*/
@Test
public void test5() {
ac = new ClassPathXmlApplicationContext("beans.xml");
People people5 = (People) ac.getBean("people5");
System.out.println(people5);
} /*注入list集合*/
@Test
public void test6() {
ac = new ClassPathXmlApplicationContext("beans.xml");
People people6 = (People) ac.getBean("people6");
System.out.println(people6);
} /*注入set集合*/
@Test
public void test7() {
ac = new ClassPathXmlApplicationContext("beans.xml");
People people7 = (People) ac.getBean("people7");
System.out.println(people7);
} /*注入map集合*/
@Test
public void test8() {
ac = new ClassPathXmlApplicationContext("beans.xml");
People people8 = (People) ac.getBean("people8");
System.out.println(people8);
} /*注入properties属性*/
@Test
public void test9() {
ac = new ClassPathXmlApplicationContext("beans.xml");
People people9 = (People) ac.getBean("people9");
System.out.println(people9);
} 5、自动注入:
default-autowire="byType"><!-- 自动注入,byName、byType -->
<!--
byName时,根据people中的dog属性去寻找beans.xml中匹配的dog对象注入
byType时,根据type类型自动注入,如果beans.xml中有两个dog对象,则报错
constructor,和byType类似,在people中生成单独dog的构造方法即可
-->

6、设置bean实例为多例:

<bean id="people1" class="com.entity.People">
<!-- bean注入 -->
<property name="id" value="1"></property>
<property name="name" value="张三"></property>
<property name="age" value="20"></property>
<!-- <property name="dog" ref="dog"></property> -->
<!-- 虽然引用的dog为prototype多例,但是每次一个新的people生成的dog均为同一条dog,即注入之后已经固定死,不能动态改变 --> <lookup-method name="getDog" bean="dog"/>
<!-- 加入lookup配置之后,每个people生成的dog都是多例的 -->
</bean>
<bean id="dog" class="com.entity.Dog" scope="prototype"><!-- prototype,设置bean为多例 -->
<property name="name" value="jack"></property>
</bean> public abstract Dog getDog();//让srping去动态实现dog的多例

7、Spring中的方法替换:

<bean id="people1" class="com.entity.People">
<!-- bean注入 -->
<property name="id" value="1"></property>
<property name="name" value="张三"></property>
<property name="age" value="20"></property>
<replaced-method name="getDog" replacer="people2"></replaced-method>
<!-- 方法替换:将people里面的getDog方法替换为people2中的实现的方法 -->
</bean> <bean id="people2" class="com.entity.People2"></bean>

People实体类:

public class People {
private int id;
private String name;
private int age;
private Dog dog;//byName时,自动注入beans中名称为dog的属性 public int getId() {
return id;
} public Dog getDog(){
Dog dog = new Dog();
dog.setName("jack");
return dog;
} public void setDog(Dog dog) {
this.dog = dog;
}
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;
} People2实体类,实现接口org.springframework.beans.factory.support.MethodReplacerMethodReplacer
public class People2 implements MethodReplacer{
@Override
public Object reimplement(Object arg0, Method arg1, Object[] arg2)
throws Throwable {
Dog dog = new Dog();
dog.setName("tom");
return dog;
}
}

8、bean的作用范围:prototype多例,request即每次请求创建一个新的bean,session,global session,
        application,singleton单例 ,request

<bean id="abstractPeople" class="com.entity.People" abstract="true" scope="prototype" >
<property name="className" value="高三五班"></property>
<property name="age" value="19"></property>
</bean> <!-- bean之间的继承 ,加入depends-on属性后,则优先寻找authority的bean并初始化-->
<bean id="zhangsan" parent="abstractPeople" depends-on="authority">
<property name="id" value="1"></property>
<property name="name" value="张三"></property>
</bean>
<!-- bean继承并覆盖父bean属性值age -->
<bean id="lisi" parent="abstractPeople">
<property name="id" value="1"></property>
<property name="name" value="张三"></property>
<property name="age" value="20"></property>
</bean> <bean id="authority" class="com.authority.Authority"></bean>

Authority实体类:

public class Authority {
public Authority() {
System.out.println("获取权限");
}
}

9、Spring AOP

public class StudentServiceImpl implements StudentService {
@Override
public void addStudent(String name) {
//未使用aop的话,只会增加代码耦合度
System.out.println("开始添加学生:"+name);
System.out.println("添加学生:"+name);
System.out.println("完成学生"+name+"添加");
}
}

AOP配置:

<bean id="studentService" class="com.service.impl.StudentServiceImpl"></bean>
<!-- aspect的定义 -->
<bean id="studentServiceAspect" class="com.advice.StudentServiceAspect"></bean>
<aop:config>
<aop:aspect id="studentServiceAspect" ref="studentServiceAspect">
<!-- *代表任意,第一个*代表返回值,第二个代表类名,第三个代表方法名,括号..代表方法参数任意 -->
<aop:pointcut expression="execution(* com.service.*.*(..))" id="businessService"/>
<aop:before method="doBefore" pointcut-ref="businessService"/>
<aop:after method="doAfter" pointcut-ref="businessService"/>
<aop:around method="doAround" pointcut-ref="businessService"/>
<aop:after-returning method="doAfterReturning" pointcut-ref="businessService"/>
<aop:after-throwing method="doAfterThrowing" pointcut-ref="businessService" throwing="ex"/>
</aop:aspect>
</aop:config>

StudentServiceAspect实体类:

public class StudentServiceAspect {
//前置通知
public void doBefore(JoinPoint jp){
System.out.println("类名:"+jp.getTarget().getClass().getName());
System.out.println("方法名:"+jp.getSignature().getName());
System.out.println("开始添加学生:"+jp.getArgs()[0]);
}
//后置通知
public void doAfter(JoinPoint jp){
System.out.println("类名:"+jp.getTarget().getClass().getName());
System.out.println("方法名:"+jp.getSignature().getName());
System.out.println("学生添加完成:"+jp.getArgs()[0]);
}
//环绕通知
public Object doAround(ProceedingJoinPoint pjp) throws Throwable{
System.out.println("添加学生前");
Object retVal = pjp.proceed();//代表方法执行,如果配置了环绕通知,则不必在配置前后置通知,
//retVal即为所执行的方法的返回值
System.out.println(retVal);
System.out.println("添加学生后");
return retVal;
} //返回通知,方法return之前调用
public void doAfterReturning(JoinPoint jp) throws Throwable{
System.out.println("返回通知");
} //异常通知,方法return之前调用
public void doAfterThrowing(JoinPoint jp,Throwable ex) throws Throwable{
System.out.println("异常通知");
System.out.println("异常信息:"+ex.getMessage());
}
}

10、Spring JDBC的支持
1)JdbcTemplate使用:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean> <context:property-placeholder location="jdbc.properties"/> <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean> <bean id="studentDao" class="dao.impl.StudentDaoImpl">
<property name="jdbcTemplate" ref="jdbcTemplate"></property>
</bean> <bean id="studentService" class="service.impl.StudentServiceImpl">
<property name="studentDao" ref="studentDao"></property>
</bean>

jdbc.properties文件:

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/db_spring
jdbc.username=root
jdbc.password=123

StudentDaoImpl类实体:

public class StudentDaoImpl implements StudentDao{

private JdbcTemplate jdbcTemplate;

public void setJdbcTemplate(JdbcTemplate jdbcTemplate) {
this.jdbcTemplate = jdbcTemplate;
} @Override
public int addStudent(Student student) {
String sql="insert into t_student values(null,?,?)";
Object []params=new Object[]{student.getName(),student.getAge()};
return jdbcTemplate.update(sql,params);
} @Override
public int updateStudent(Student student) {
String sql="update t_student set name=?,age=? where id=?";
Object []params=new Object[]{student.getName(),student.getAge(),student.getId()};
return jdbcTemplate.update(sql,params);
} @Override
public int deleteStudent(int id) {
String sql="delete from t_student where id=?";
Object []params=new Object[]{id};
return jdbcTemplate.update(sql,params);
} @Override
public List<Student> findStudents() {
String sql="select * from t_student";
final List<Student> studentList=new ArrayList<Student>();
jdbcTemplate.query(sql, new RowCallbackHandler(){ @Override
public void processRow(ResultSet rs) throws SQLException {
Student student=new Student();
student.setId(rs.getInt("id"));
student.setName(rs.getString("name"));
student.setAge(rs.getInt("age"));
studentList.add(student);
} });
return studentList;
}
}

2)JdbcDaoSupport使用

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean> <context:property-placeholder location="jdbc.properties"/> <bean id="studentDao" class="dao.impl.StudentDaoImpl">
<property name="dataSource" ref="dataSource"></property>
</bean> <bean id="studentService" class="service.impl.StudentServiceImpl">
<property name="studentDao" ref="studentDao"></property>
</bean>

StudentDaoImpl实体类:

public class StudentDaoImpl extends JdbcDaoSupport implements StudentDao{
//extends之后 只需为id=studentDao的bean添加dataSource即可 @Override
public int addStudent(Student student) {
String sql="insert into t_student values(null,?,?)";
Object []params=new Object[]{student.getName(),student.getAge()};
return this.getJdbcTemplate().update(sql,params);
} @Override
public int updateStudent(Student student) {
String sql="update t_student set name=?,age=? where id=?";
Object []params=new Object[]{student.getName(),student.getAge(),student.getId()};
return this.getJdbcTemplate().update(sql,params);
} @Override
public int deleteStudent(int id) {
String sql="delete from t_student where id=?";
Object []params=new Object[]{id};
return this.getJdbcTemplate().update(sql,params);
} @Override
public List<Student> findStudents() {
String sql="select * from t_student";
final List<Student> studentList=new ArrayList<Student>();
this.getJdbcTemplate().query(sql, new RowCallbackHandler(){ @Override
public void processRow(ResultSet rs) throws SQLException {
Student student=new Student();
student.setId(rs.getInt("id"));
student.setName(rs.getString("name"));
student.setAge(rs.getInt("age"));
studentList.add(student);
} });
return studentList;
}
}

3)使用namedParameterJdbcTemplate

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean> <context:property-placeholder location="jdbc.properties"/> <bean id="studentDao" class="dao.impl.StudentDaoImpl">
<property name="namedParameterJdbcTemplate" ref="namedParameterJdbcTemplate"></property>
</bean>
<bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
<constructor-arg ref="dataSource"></constructor-arg>
</bean> <bean id="studentService" class="service.impl.StudentServiceImpl">
<property name="studentDao" ref="studentDao"></property>
</bean>

StudentDaoImpl实体类:

public class StudentDaoImpl implements StudentDao{

private NamedParameterJdbcTemplate namedParameterJdbcTemplate;

public NamedParameterJdbcTemplate getNamedParameterJdbcTemplate() {
return namedParameterJdbcTemplate;
} public void setNamedParameterJdbcTemplate(
NamedParameterJdbcTemplate namedParameterJdbcTemplate) {
this.namedParameterJdbcTemplate = namedParameterJdbcTemplate;
} @Override
public int addStudent(Student student) {
String sql="insert into t_student values(null,:name,:age)";
MapSqlParameterSource mps = new MapSqlParameterSource();
mps.addValue("name", student.getName());
mps.addValue("age", student.getAge());
return namedParameterJdbcTemplate.update(sql, mps);
} @Override
public int updateStudent(Student student) {
String sql="update t_student set name=:name,age=:age where id=:id";
MapSqlParameterSource mps = new MapSqlParameterSource();
mps.addValue("name", student.getName());
mps.addValue("age", student.getAge());
mps.addValue("id", student.getId());
return namedParameterJdbcTemplate.update(sql,mps);
} @Override
public int deleteStudent(int id) {
MapSqlParameterSource mps = new MapSqlParameterSource();
String sql="delete from t_student where id=:id";
mps.addValue("id", id);
return namedParameterJdbcTemplate.update(sql,mps);
} @Override
public List<Student> findStudents() {
String sql="select * from t_student";
final List<Student> studentList=new ArrayList<Student>();
namedParameterJdbcTemplate.query(sql, new RowCallbackHandler(){ @Override
public void processRow(ResultSet rs) throws SQLException {
Student student=new Student();
student.setId(rs.getInt("id"));
student.setName(rs.getString("name"));
student.setAge(rs.getInt("age"));
studentList.add(student);
} });
return studentList;
}
}

测试类:

public class T {

private ApplicationContext ac;

@Before
public void setUp() throws Exception {
ac=new ClassPathXmlApplicationContext("beans.xml");
} @Test
public void addStudent() {
StudentService studentService=(StudentService)ac.getBean("studentService");
int addNums=studentService.addStudent(new Student("王五", 1));
if(addNums==1){
System.out.println("添加成功");
}
} @Test
public void updateStudent() {
StudentService studentService=(StudentService)ac.getBean("studentService");
int updateNums=studentService.updateStudent(new Student(6,"王五2", 2));
if(updateNums==1){
System.out.println("更新成功");
}
} @Test
public void deleteStudent() {
StudentService studentService=(StudentService)ac.getBean("studentService");
int deleteNums=studentService.deleteStudent(6);
if(deleteNums==1){
System.out.println("删除成功");
}
} @Test
public void findStudents() {
StudentService studentService=(StudentService)ac.getBean("studentService");
List<Student> studentList=studentService.findStudents();
for(Student student:studentList){
System.out.println(student);
}
}
}

11、Spring 事务管理器

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean> <!-- jdbc事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 事务管理模板 -->
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager"></property>
</bean> <context:property-placeholder location="jdbc.properties"/> <bean id="bankDao" class="dao.impl.BankDaoImpl">
<property name="namedParameterJdbcTemplate" ref="namedParameterJdbcTemplate"></property>
</bean>
<bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
<constructor-arg ref="dataSource"></constructor-arg>
</bean> <bean id="bankService" class="service.impl.BankServiceImpl">
<property name="bankDao" ref="bankDao"></property>
<property name="transactionTemplate" ref="transactionTemplate"></property>
</bean>

BankDaoImpl实体类:

public class BankDaoImpl implements BankDao {

private NamedParameterJdbcTemplate namedParameterJdbcTemplate;

public NamedParameterJdbcTemplate getNamedParameterJdbcTemplate() {
return namedParameterJdbcTemplate;
} public void setNamedParameterJdbcTemplate(
NamedParameterJdbcTemplate namedParameterJdbcTemplate) {
this.namedParameterJdbcTemplate = namedParameterJdbcTemplate;
} @Override
public void inMoney(int money, int userId) {
String sql = "update t_count set count = count + :money where userId = :userId";
MapSqlParameterSource mps = new MapSqlParameterSource();
mps.addValue("money", money);
mps.addValue("userId", userId);
namedParameterJdbcTemplate.update(sql, mps);
} @Override
public void outMoney(int money, int userId) {
String sql = "update t_count set count = count - :money where userId = :userId";
MapSqlParameterSource mps = new MapSqlParameterSource();
mps.addValue("money", money);
mps.addValue("userId", userId);
namedParameterJdbcTemplate.update(sql, mps);
}
}

BankServiceImpl实体类:

public class BankServiceImpl implements BankService{

private BankDao bankDao;
private TransactionTemplate transactionTemplate;
/*要使用TransactionTemplate,需要加jdbc事务管理器*/ /*编程式事务管理*/
@Override
public void transferAccounts(final int count,final int userIdA,final int userIdB) {
transactionTemplate.execute(new TransactionCallbackWithoutResult() { @Override
protected void doInTransactionWithoutResult(TransactionStatus status) {
bankDao.outMoney(count, userIdA);
bankDao.inMoney(count, userIdB);
}
});
}
public void setBankDao(BankDao bankDao) {
this.bankDao = bankDao;
}
public TransactionTemplate getTransactionTemplate() {
return transactionTemplate;
}
public void setTransactionTemplate(TransactionTemplate transactionTemplate) {
this.transactionTemplate = transactionTemplate;
}
}
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean> <!-- jdbc事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置事务通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*"/><!-- 所有方法 -->
</tx:attributes>
</tx:advice>
<!-- 配置事务切面 -->
<aop:config>
<!-- 配置切点 -->
<aop:pointcut expression="execution(* com.service.*.*(..))" id="serviceMethod"/>
<!-- 配置事务通知 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod"/>
</aop:config>
<!-- 事务管理模板 -->
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager"></property>
</bean> <context:property-placeholder location="jdbc.properties"/> <bean id="bankDao" class="dao.impl.BankDaoImpl">
<property name="namedParameterJdbcTemplate" ref="namedParameterJdbcTemplate"></property>
</bean>
<bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
<constructor-arg ref="dataSource"></constructor-arg>
</bean> <bean id="bankService" class="service.impl.BankServiceImpl">
<property name="bankDao" ref="bankDao"></property>
<property name="transactionTemplate" ref="transactionTemplate"></property>
</bean>
public class BankDaoImpl implements BankDao {

private NamedParameterJdbcTemplate namedParameterJdbcTemplate;

public NamedParameterJdbcTemplate getNamedParameterJdbcTemplate() {
return namedParameterJdbcTemplate;
} public void setNamedParameterJdbcTemplate(
NamedParameterJdbcTemplate namedParameterJdbcTemplate) {
this.namedParameterJdbcTemplate = namedParameterJdbcTemplate;
} @Override
public void inMoney(int money, int userId) {
String sql = "update t_count2 set count = count + :money where userId = :userId";
MapSqlParameterSource mps = new MapSqlParameterSource();
mps.addValue("money", money);
mps.addValue("userId", userId);
namedParameterJdbcTemplate.update(sql, mps);
} @Override
public void outMoney(int money, int userId) {
String sql = "update t_count set count = count - :money where userId = :userId";
MapSqlParameterSource mps = new MapSqlParameterSource();
mps.addValue("money", money);
mps.addValue("userId", userId);
namedParameterJdbcTemplate.update(sql, mps);
}
} public class BankServiceImpl implements BankService{ private BankDao bankDao;
@Override
public void transferAccounts(final int count,final int userIdA,final int userIdB) {
bankDao.outMoney(count, userIdA);
bankDao.inMoney(count, userIdB);
}
public void setBankDao(BankDao bankDao) {
this.bankDao = bankDao;
}
}
<!-- jdbc事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 事务管理模板 -->
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager"></property>
</bean> <!-- 事务管理注解驱动 -->
<tx:annotation-driven transaction-manager="transactionManager"/> <context:property-placeholder location="jdbc.properties"/> <bean id="bankDao" class="dao.impl.BankDaoImpl">
<property name="namedParameterJdbcTemplate" ref="namedParameterJdbcTemplate"></property>
</bean>
<bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
<constructor-arg ref="dataSource"></constructor-arg>
</bean> <bean id="bankService" class="service.impl.BankServiceImpl">
<property name="bankDao" ref="bankDao"></property>
<property name="transactionTemplate" ref="transactionTemplate"></property>
</bean> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean> <!-- jdbc事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 配置事务通知 -->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- <tx:method name="*"/>所有方法配置事务通知,适应于service较多情况下 -->
<!-- 配置事务传播特性 -->
<tx:method name="insert*" propagation="REQUIRED" />
<tx:method name="update*" propagation="REQUIRED" />
<tx:method name="edit*" propagation="REQUIRED" />
<tx:method name="save*" propagation="REQUIRED" />
<tx:method name="add*" propagation="REQUIRED" />
<tx:method name="new*" propagation="REQUIRED" />
<tx:method name="set*" propagation="REQUIRED" />
<tx:method name="remove*" propagation="REQUIRED" />
<tx:method name="delete*" propagation="REQUIRED" />
<tx:method name="change*" propagation="REQUIRED" />
<tx:method name="get*" propagation="REQUIRED" read-only="true" />
<tx:method name="find*" propagation="REQUIRED" read-only="true" />
<tx:method name="load*" propagation="REQUIRED" read-only="true" />
<tx:method name="*" propagation="REQUIRED" read-only="true" />
</tx:attributes>
</tx:advice>
<!-- 配置事务切面 -->
<aop:config>
<!-- 配置切点 -->
<aop:pointcut expression="execution(* com.service.*.*(..))" id="serviceMethod"/>
<!-- 配置事务通知 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="serviceMethod"/>
</aop:config>
<!-- 事务管理模板 -->
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager"></property>
</bean> <context:property-placeholder location="jdbc.properties"/> <bean id="bankDao" class="dao.impl.BankDaoImpl">
<property name="namedParameterJdbcTemplate" ref="namedParameterJdbcTemplate"></property>
</bean>
<bean id="namedParameterJdbcTemplate" class="org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate">
<constructor-arg ref="dataSource"></constructor-arg>
</bean> <bean id="bankService" class="service.impl.BankServiceImpl">
<property name="bankDao" ref="bankDao"></property>
<property name="transactionTemplate" ref="transactionTemplate"></property>
</bean>

spring mvc随笔的更多相关文章

  1. Spring MVC随笔记录

    根据https://blog.csdn.net/abc997995674/article/details/80353410整理 @ModelAttribute 可以用在方法.方法参数上,也可以和@re ...

  2. Spring Web MVC 随笔

    1.ContextLoaderListener 对于使用Spring的Web应用,无需手动创建Spring容器,而是通过配置文件声明式地创建Spring容器.可以直接在web.xml文件中配置创建Sp ...

  3. Maven+Spring MVC Spring Mybatis配置

    环境: Eclipse Neon JDK1.8.0 Tomcat8.0 先决条件: Eclipse先用maven向导创建web工程.参见本站之前随笔. 本机安装完成mysql5:新建用户xuxy03设 ...

  4. Spring MVC 学习总结(六)——Spring+Spring MVC+MyBatis框架集成

    与SSH(Struts/Spring/Hibernate/)一样,Spring+SpringMVC+MyBatis也有一个简称SSM,Spring实现业务对象管理,Spring MVC负责请求的转发和 ...

  5. Spring MVC基础

    1.Web MVC基础 MVC的本质是表现层模式,我们以视图模型为中心,将视图和控制器分离出来.就如同分层模式一样,我们以业务逻辑为中心,把表现层和数据访问层代码分离出来是一样的方法.框架只能在技术层 ...

  6. Spring+Spring MVC+MyBatis

    Spring+Spring MVC+MyBatis 目录 一.新建一个基于Maven的Web项目 二.创建数据库与表 三.添加依赖包 四.新建POJO实体层 五.新建MyBatis SQL映射层 六. ...

  7. Spring MVC 基础

    Spring MVC 基础 1.Web MVC基础 MVC的本质是表现层模式,我们以视图模型为中心,将视图和控制器分离出来.就如同分层模式一样,我们以业务逻辑为中心,把表现层和数据访问层代码分离出来是 ...

  8. Spring+Spring MVC+MyBatis框架集成

    目录 一.新建一个基于Maven的Web项目 二.创建数据库与表 三.添加依赖包 四.新建POJO实体层 五.新建MyBatis SQL映射层 六.JUnit测试数据访问 七.完成Spring整合My ...

  9. IDEA 通过Maven创建Spring MVC项目搭建

    概述 本篇随笔主要记录内容如下: 1.通过Maven创建基于Spring Framework类库的MVC项目,免去了繁琐的XML配置: 2.在Idea里面配置Tomcat的测试启动项: Maven创建 ...

随机推荐

  1. uC/OS-II 函数之任务相关函数

    获得更多资料欢迎进入我的网站或者 csdn或者博客园 对于有热心的小伙伴在微博上私信我,说我的uC/OS-II 一些函数简介篇幅有些过于长应该分开介绍.应小伙伴的要求,特此将文章分开进行讲解.上文主要 ...

  2. iOS中的自由桥接

    [摘抄自<iOS 6编程实战>] 与Objective-C库不同,我们在Objective-C中使用标准C语言和Core Foundation类库(CF*方法)不会遵循那些命名约定.这意味 ...

  3. dbproxy-id生成器

    id生成器使用的是snowflake, 需要执行 snowflake_init(region_id, worker_id); 而region_id和worker_id是在配置文件中配置的 networ ...

  4. c++11 perfect forwarding

    完美转发是c++11 引入右值引用之后,在template 中的延伸. 顾名思义,完美转发是将参数不改变属性的条件下,转发给下一个函数. 因为普通函数的参数一旦具名,始终都是lvalue. 如果把rv ...

  5. 2016级算法第一次练习赛-D.AlvinZH的儿时回忆——跳房子

    864 AlvinZH的儿时回忆----跳房子 题目链接:https://buaacoding.cn/problem/864/index 思路 这是一道简单题,但是同样有人想复杂了,DP?大模拟?. ...

  6. 题目1010:A + B(字符串拆分)

    问题来源 http://ac.jobdu.com/problem.php?pid=1010 问题描述 给我们一行标准的字符串,整行读入之后,把它拆开转换成数字进行计算. 问题分析 首先考虑一个问题:如 ...

  7. rm: cannot remove `xxx’: Operation not permitted问题的处理方案

    第一步:22.txt lsattr 22.txt 查看文件属性 看到的情况 -----a------- 第二步:去除a的属性 chattr -a 22.txt 第三步:在此执行删除 rm 22.txt

  8. 网络基础 01_OSI网际互联

    1 通信概述 网络是用物理链路将各个孤立的工作站或主机相连在一起,组成数据链路,从而达到资源共享和通信的目的. 通信是人与人之间通过某种媒体进行的信息交流与传递. 网络通信是通过网络将各个孤立的设备进 ...

  9. 移动端遇到的常见JS与CSS问题及解决方法

    由于笔者的水平有限,虽说都是笔者遇到过使用过的,但文中可能也会出现一些问题或不严谨的地方,望各位指出,不胜感激! 一. css部分 body如果设置height:100%;overflow:hidde ...

  10. [LnOI2019]加特林轮盘赌

    Luogu5249 轮流开枪打一个环上的人 , 每次\(p\)的概率打死 , \(p\)始终相同 , 从第\(1\)个人开始 , 求第\(k\)个人成为唯一幸存者的概率 \(19.3.30\) 官方题 ...