Spring与JDBC整合应用+一个Springjdbc与mvc结合的例子

Spring JDBC

Spring与JDBC整合应用

直接使用JDBC
a.增删改
获取Connection
获取Statement
设置SQL中?参数
执行SQL操作
释放Connection

b.查询
获取Connection
获取Statement
设置SQL中?参数
执行SQL操作获取Resulset结果
将Resultset结果封装成实体对象
释放Connection

在Spring中使用JDBC
a.提供了编写DAO的工具栏

JdbcTemplate
JdbcTemplet.update(“sql语句”,参数);

b.提供了AOP式事务管理(不需要再方法中追加事务提交和回滚)
c.提供了统一的异常处理

2.Spring整合JDBC步骤

a.搭建spring+jdbc开发环境

引入spring(ioc,aop,dao)开发包
添加src下的spring配置文件
数据库去掉

b.编写实体类(对应数据库)

package entity;

import java.io.Serializable;

public class Emp implements Serializable{

    private Integer id;
    private String name;
    private Double salary;
    private Integer age;
    //定义为封装类。在数据库中为null。封装类可以接受,但是int就不能了。


    public Integer getId() {
        return id;
    }
    public void setId(Integer id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Double getSalary() {
        return salary;
    }
    public void setSalary(Double salary) {
        this.salary = salary;
    }
    public Integer getAge() {
        return age;
    }
    public void setAge(Integer age) {
        this.age = age;
    }


}

c.编写DAO组件

package dao;

import javax.annotation.Resource;

import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Repository;

import entity.Emp;
@Repository//扫描Dao
public class EmpDao {
    @Resource
    private JdbcTemplate template;//注入

    //还可以继承 JdbcDaoSupport 来实现

    public void save(Emp emp){
        String sql ="insert into emp(name,salary,age) values(?,?,?)";

        Object[] params = {emp.getName(),emp.getSalary(),emp.getAge()};
        //存储给那个几个values的值.要是Object的。因为有很多不同的类型。
        template.update(sql, params);


    }

}

d.在applicationContext.xml中组件扫描EmpDao,注入JdbcTemplate

这里写图片描述

用到连接池就导入了dbcp各种jar

这里写图片描述

dbcp给JdbcTemplate注入。

<!-- 扫描DAO -->
<context:component-scan base-package="dao"></context:component-scan>
<!-- 定义JdbcTemlate -->
<bean id="template" class="org.springframework.jdbc.core.JdbcTemplate">

<!-- 注入连接信息 dataSource//数据源,连接池  常用的: dbcp,c3p0,proxool -->

<property name="dataSource" ref="dbcp"></property>
</bean>

<!-- 定义dbcp连接池 -->
<bean id="dbcp" class="org.apache.commons.dbcp.BasicDataSource">
<property name="username" value="root"></property>
<property name="password" value="root"></property>
<property name="driverClassName" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql:///jsd1507db"></property>
<!-- 写3个///就可以代替location:3306就是说连接本地数据库 -->
</bean>

emplate在DAO中定义并利用注解注入。配置中的template又利用dbcp连接池注入信息。
创建一个Emp对象,然后利用dao的save方法存进去一个对象。
注意注入!我就遇到了错误。没有给template注入没写@Resource报空指针异常,检测发现template对象为空。
这里写图片描述
运行后

这里写图片描述

编写DAO对增删改查方法

比如写一个查询

public List<Emp> findAll(){

        String sql ="select * from emp";
        EmpRowMapper rowMapper = new EmpRowMapper();
        List<Emp> list =template.query(sql, rowMapper);
        //要单独对rowMapper写一个组件

        return list;
    }

注意要写RowMapper组件 就要写一个类实现 RowMapper接口
这个组件的作用就是把查询出来的记录封装成实体对象
EmpRowMapper

package entity;
/**
 * 将Emp记录封装成Emp对象
 * @author Recar
 */
import java.sql.ResultSet;
import java.sql.SQLException;

import org.springframework.jdbc.core.RowMapper;

public class EmpRowMapper implements RowMapper<Emp>{

    public Emp mapRow(ResultSet arg0, int arg1) throws SQLException {

        Emp emp = new Emp();
        emp.setId(arg0.getInt("id"));
        emp.setName(arg0.getString("name"));
        emp.setSalary(arg0.getDouble("salary"));
        emp.setAge(arg0.getInt("age"));
        return emp;
    }
}

这里写图片描述

单行查询:

//多行查询用query()方法
    //单行查询用到queryForObject()方法
    public Emp findById(int id){
        String sql = "select * from emp "+"where id=?";

        Object[] params={id};//这个是参数就是sql语句中的?
        EmpRowMapper rowMapper = new EmpRowMapper();
        Emp emp = template.queryForObject(sql, params, rowMapper);
        //还是要用到了RowMapper
        return emp;

    }


        Emp emp =empdao.findById(21);
        System.out.println(emp.getName());

要注意!开始我传入的id是1.但是我的数据库中并没有id=1
的数据。然后报错:Incorrect result size: expected 1, actual 0
突然想到。。。。我没有id=1的啊。写上等于21即实际存在的。不然要写个异常。如果是0个会报错。
这里写图片描述

如果想执行 select count(*) from emp 的语句,返回的是一行。就是数字的话可以用template.queryForInt();方法。然后拿个去接收。

案例:写一个资费列表:

创建表cost

create table cost(
 cost_id  int  primary key,
 name     varchar(50)  not null,
 base_duration  long,
 base_cost  double,
 unit_cost double,
 status    char(1),
 descr     varchar(100),
 creatime  date,
 startime date,
 cost_type  char(1)
 );

增加数据:

insert into cost values(2,'计时收费',null,null,0.5,0,'0.5元每小时',DEFAULT,DEFAULT,null);

写一个实体类来存数据

Cost

package entity;

import java.io.Serializable;
import java.util.Date;

public class Cost implements Serializable {

    private Integer cost_id;//资费ID
    private String name;//资费名
    private Long base_duratio;//基本时长
    private Double base_cost;//基本费用
    private Double unit_cost;//单位费用
    private String status;//状态
    private String descr;//描述
    private Date creatime;//创建时间
    private Date startime;//启用时间
    private String cost_type;//资费类型
    public Integer getCost_id() {
        return cost_id;
    }
    public void setCost_id(Integer cost_id) {
        this.cost_id = cost_id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Long getBase_duratio() {
        return base_duratio;
    }
    public void setBase_duratio(Long base_duratio) {
        this.base_duratio = base_duratio;
    }
    public Double getBase_cost() {
        return base_cost;
    }
    public void setBase_cost(Double base_cost) {
        this.base_cost = base_cost;
    }
    public Double getUnit_cost() {
        return unit_cost;
    }
    public void setUnit_cost(Double unit_cost) {
        this.unit_cost = unit_cost;
    }
    public String getStatus() {
        return status;
    }
    public void setStatus(String status) {
        this.status = status;
    }
    public String getDescr() {
        return descr;
    }
    public void setDescr(String descr) {
        this.descr = descr;
    }
    public Date getCreatime() {
        return creatime;
    }
    public void setCreatime(Date creatime) {
        this.creatime = creatime;
    }
    public Date getStartime() {
        return startime;
    }
    public void setStartime(Date startime) {
        this.startime = startime;
    }
    public String getCost_type() {
        return cost_type;
    }
    public void setCost_type(String cost_type) {
        this.cost_type = cost_type;
    }
}

CostRowMapper

package entity;

import java.io.Serializable;
import java.util.Date;


public class Cost implements Serializable {

    private Integer cost_id;//资费ID
    private String name;//资费名
    private Long base_duratio;//基本时长
    private Double base_cost;//基本费用
    private Double unit_cost;//单位费用
    private String status;//状态
    private String descr;//描述
    private Date creatime;//创建时间
    private Date startime;//启用时间
    private String cost_type;//资费类型
    public Integer getCost_id() {
        return cost_id;
    }
    public void setCost_id(Integer cost_id) {
        this.cost_id = cost_id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public Long getBase_duratio() {
        return base_duratio;
    }
    public void setBase_duratio(Long base_duratio) {
        this.base_duratio = base_duratio;
    }
    public Double getBase_cost() {
        return base_cost;
    }
    public void setBase_cost(Double base_cost) {
        this.base_cost = base_cost;
    }
    public Double getUnit_cost() {
        return unit_cost;
    }
    public void setUnit_cost(Double unit_cost) {
        this.unit_cost = unit_cost;
    }
    public String getStatus() {
        return status;
    }
    public void setStatus(String status) {
        this.status = status;
    }
    public String getDescr() {
        return descr;
    }
    public void setDescr(String descr) {
        this.descr = descr;
    }
    public Date getCreatime() {
        return creatime;
    }
    public void setCreatime(Date creatime) {
        this.creatime = creatime;
    }
    public Date getStartime() {
        return startime;
    }
    public void setStartime(Date startime) {
        this.startime = startime;
    }
    public String getCost_type() {
        return cost_type;
    }
    public void setCost_type(String cost_type) {
        this.cost_type = cost_type;
    }


}

测试方法:

public static void main(String[] args){

        String conf = "applicationContext.xml";
        ApplicationContext ac = new ClassPathXmlApplicationContext(conf);

        CostDao costdao = ac.getBean("costDao",CostDao.class);

        List<Cost> list = costdao.findAll();
        for(Cost cost:list){
            System.out.println(cost.getName());
        }

    }

要注意每个方法的返回值。很多的默认的或者我自己先写了个null
要记得改回来。

这里写图片描述

把springjdbc与mvc整合在一起

在之前的基础上增加一个Controller
利用注解~

ListController

package Controller;

import java.util.List;

import javax.servlet.http.HttpServletRequest;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import dao.CostDao;
import entity.Cost;

@Controller
public class ListController  {
    @RequestMapping("/list.do")
    public String list(HttpServletRequest request){
        String conf = "applicationContext.xml";
        ApplicationContext ac = new ClassPathXmlApplicationContext(conf);

        CostDao costdao = ac.getBean("costDao",CostDao.class);

        List<Cost> list = costdao.findAll();
        request.setAttribute("list", list);

        return "list";
    }

}

然后写了一个list.jsp(利用jstl)

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
  <head>
    <base href="<%=basePath%>">

    <title>spring mvc+jsbc</title>

    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">    
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
    <!--
    <link rel="stylesheet" type="text/css" href="styles.css">
    -->

  </head>

  <body>
  <%@page import="entity.*" %>
 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<table width="800" border="1">
<tr>
<td>资费ID</td>
<td>资费名</td>
<td>基本时长</td>
<td>基本时长</td>
<td>单位费用</td>
<td>状态</td>
<td>描述</td>
<td>创建时间</td>
<td>启用时间</td>
<td>资费类型</td>
</tr>


<c:forEach  items="${list}" var="cost">
<tr>
<td>${cost.cost_id}</td>
<td>${cost.name}</td>
<td>${cost.base_duratio}</td>
<td>${cost.base_cost}</td>
<td>${cost.unit_cost}</td>
<td>${cost.status}</td>
<td>${cost.descr}</td>
<td>${cost.creatime}</td>
<td>${cost.startime}</td>
<td>${cost.cost_type}</td>
</tr>
</c:forEach>

</table>

  </body>
</html>

在Spring配置中增加配置也就是对handlermapping和Controller还有viewResolver进行配置

<mvc:annotation-driven></mvc:annotation-driven>
    <!-- 等价于handlermapping和handleradapter两个bean。其实还有其他的 -->

    <!-- 开启扫描controller -->
    <context:component-scan base-package="Controller"></context:component-scan>
    <!-- 配置viewResolver -->

    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/"></property>
    <property name="suffix" value=".jsp"></property>

    </bean>

还要在web.xml配置中配置 请求时请求到 DispatcherServlet这个servlet的还要配置其初始化配置

<servlet>
  <servlet-name>springwebmvc</servlet-name>
  <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
  <!-- 指明配置文件 -->
  <init-param>
    <param-name>contextConfigLocation</param-name>  
    <param-value>classpath:applicationContext.xml</param-value>  
</init-param>
<!-- <load-on-startup>1</load-on-startup>   -->
  </servlet>
  <servlet-mapping>
  <servlet-name>springwebmvc</servlet-name>
  <url-pattern>*.do</url-pattern>
  </servlet-mapping>

并没有写拦截器。结合登陆应该会更好。

这里写图片描述

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值