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");
}
}
、