(上节)Spring+JDBC+Struts;实现图片上传;配置的属性默认dbc用单例模式,action一定要scope=“prototype”

web.xml的配置

<!--告诉前台要调用spring框架 -->
  <context-param>
  <para-name>contextConfigLocation</para-name>
  <!-- 注意寻找文件实际路径是在classes下,因为生成在那 -->
  <param-value>/WEB-INF/classes/applicationContext.xml</param-value>
  </context-param>
  <!-- 告诉spring要监听 -->
  <listener>
  <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
  </listener>
  

将项目部署,并启动服务器,如果看到启动时,提示加载了配置文件,就表示配置成功。


信息 : Initializing Spring root WebApplicationContext

准备工作做完,开始书写操作代码

数据库连接一般情况

《自己创建连接类,然后再applicationContext.xml中配置属性的值》

public class DataBaseConnection {

 

    private String dbdriver;

    private String dburl;

    private String username;

    private String password;

    private Connection conn; 

    public Connection getConnection() {

       try {

           if (conn == null || conn.isClosed()) {

              Class.forName(dbdriver);

              conn = DriverManager.getConnection(dburl, username, password);

           }

        } catch (Exception e) {

           e.printStackTrace();

       }

       return conn;

    } 

    public void close() {

       if (conn != null) {

           try {

              conn.close();

           } catch (Exception e) {

              e.printStackTrace();

           }

       }

    } 

    public void setDbdriver(String dbdriver) {

       this.dbdriver = dbdriver;

    } 

    public void setDburl(String dburl) {

       this.dburl = dburl;

    } 

    public void setUsername(String username) {

       this.username = username;

    }

 

    public void setPassword(String password) {

       this.password = password;

    } 

}

<bean id="dataBaseConnection"class="org.liky.dbc.DataBaseConnection">

       <property name="dbdriver"value="oracle.jdbc.driver.OracleDriver"></property>

       <property name="dburl"value="jdbc:oracle:thin:@localhost:1521:ORCL"></property>

       <property name="username"value="SUNXUN"></property>

       <property name="password"value="123"></property>

    </ bean >

《我们采用接下来的方式,直接调用spring提供连接配置,不用去getConnection,这样我们dao对数据的操作也必须要换成spring帮我们封装好的操作方法》数据库连接属性更适合放在xml中,便于维护,因为交付用户(不交源码),java代码是被编译成classes中

applicationContext.xml的配置,注意这里的id,name都是spring里对应的,不要改

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="oracle.jdbc.driver.OracleDriver"></property>
<property name="url" value="jdbc:oracle:thin:@localhost:1521:ORCL"></property>
<property name="username" value="SUNXUN"></property>
<property name="password" value="123"></property>
</bean>


dao层公共接口

package com.kane.dao;


import java.util.List;


/**
 * 公共接口
 * @author lenovo
 *
 * @param <K>key类型
 * @param <V>实体类型
 */
public interface IDAO <K,V>{
public void docreate(V v)throws Exception;
public void doremove(K id)throws Exception;
public void update(V v)throws Exception;
public List<V> findAll ()throws Exception;
public V findById(K id)throws Exception;
/**

* @param pageNo
* @param pageSize
* @param column对哪个列进行模糊查询
* @param keyword
* @return
* @throws Exception
*/
public List<V> findByPage(int pageNo,int pageSize,String column,String keyword)throws Exception;

public int getCount(String column,String keyword)throws Exception;
}


DAOIMPL

package com.kane.dao.Impl;


import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;


import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.support.JdbcDaoSupport;


import com.kane.dao.IProduct;
import com.kane.vo.Product;
/**
 * JdbcDaoSupport:因为用的spring提供的操作方法,虽说配置了,但是这里调用的方法需要继承
 * @author kane
 *RowMapper<Product>:为了将一行数据转换成Product对象
 */
public class ProductImpl extends JdbcDaoSupport implements IProduct,RowMapper<Product> {


public void docreate(Product v) throws Exception {
String sql="INSERT INTO Product VALUES(emp_sequence.nextVal,?,?,?,?,?,?,?)";
//super.getConnection();不推荐使用,spring不帮我们关闭连接
super.getJdbcTemplate().update(sql,v.getName(),v.getDescription(),v.getBaseprice(),v.getWriter()
,v.getPublish(),v.getPages(),v.getImages());
}


public void doremove(String id) throws Exception {
// TODO Auto-generated method stub


}


public List<Product> findAll() throws Exception {
// TODO Auto-generated method stub
return null;
}


public Product findById(String id) throws Exception {
// TODO Auto-generated method stub
return null;
}


public List<Product> findByPage(int pageNo, int pageSize, String column,
String keyword) throws Exception {
String sql="SELECT * FROM (SELECT productid,name,description,baseprice,writer,publish,pages,images ROWNUM rn FROM Product WHERE "+column
+" LIKE ? AND ROWNUM<=?) temp WHERE temp.rn>?";
List<Product> allList=super.getJdbcTemplate().query(sql, this,"%"+keyword+"%",pageNo*pageSize,(pageNo-1)*pageSize);
return allList;
}


public int getCount(String column, String keyword) throws Exception {
String sql="SELECT COUNT(*) FROM Product WHERE "+column
+" LIKE ?";
int count=super.getJdbcTemplate().queryForInt(sql, this,"%"+keyword+"%");
return count;
}


public void update(Product v) throws Exception {
// TODO Auto-generated method stub


}


public Product mapRow(ResultSet rs, int arg1) throws SQLException {
Product product=new Product();
product.setProductid(rs.getString("productid"));
product.setName(rs.getString("name"));
product.setBaseprice(rs.getDouble("baseprice"));
product.setDescription(rs.getString("description"));
product.setWriter(rs.getString("writer"));
product.setPublish(rs.getString("publish"));
product.setPages(rs.getInt("pages"));
product.setImages(rs.getString("pages"));
//这里第二个参数设置哪些行返回对象,我们都返回对象,所以不用设置
return product;
}


}

IOC:控制反转机制,主要用于代替工厂类

AOP:面向切面:不修改原代码,为项目加入或删除功能。过滤器,在前后台之间竖直插入;Spring AOP主要实现动态代理
代理类基本负责预处理和关连接

serviceImpl

package com.kane.service.Impl;


import java.util.HashMap;
import java.util.Map;


import com.kane.dao.IProduct;
import com.kane.service.IProductService;
import com.kane.vo.Product;
/**
 * 这里我们要用到面向切面的技术,动态代理,实现统一的预处理和关闭连接
 * @author kane
 *
 */
public class ProductServiceImpl implements IProductService {
//因为spring机制帮忙关闭连接,所以代码量减少了,但是配置不减
private IProduct productdao;//这里工厂类用IOC配置取代

public IProduct getProductdao() {
return productdao;
}


public void setProductdao(IProduct productdao) {
this.productdao = productdao;
}


public void delete(String id) throws Exception {
productdao.doremove(id);
}


public Map<String, Object> findAll(int pageNo, int pageSize, String column,
String keyword) throws Exception {
Map<String,Object> map=new HashMap<String, Object>();
map.put("allProduct",productdao.findByPage(pageNo, pageSize, column, keyword));
map.put("allCount", productdao.getCount(column, keyword));
return map;
}


public Product findById(String id) throws Exception {
// TODO Auto-generated method stub
return null;
}


public void insert(Product product) throws Exception {
productdao.docreate(product);
}


public void update(Product product) throws Exception {
productdao.update(product);
}


}

在进行测试页面前,当然少不了测试类


package com.kane.pro;


import static org.junit.Assert.*;


import java.util.List;
import java.util.Map;


import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;


import com.kane.service.IProductService;
import com.kane.vo.Product;


public class test {
//配置文件中读取,不用工厂类
private IProductService productServiceImpl;

//每个方法都要调用的初始方法
@Before
public void init() {
ApplicationContext ctx = new ClassPathXmlApplicationContext(
"applicationContext.xml");
productServiceImpl = (IProductService) ctx.getBean("productServiceImpl");
}

@Test
public void testDelete() {
fail("Not yet implemented");
}


@Test
public void testFindAll() throws Exception {
Map<String,Object> map=productServiceImpl.findAll(1,3,"name","精通");
List<Product> list=(List<Product>)map.get("allProduct");
System.out.println(list.get(0).getName());
}


@Test
public void testFindById() {

}


@Test
public void testInsert() {
fail("Not yet implemented");
}


@Test
public void testUpdate() {
fail("Not yet implemented");
}

}








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值