ssi=spring3+struts2+ibatis2

先上图:三个框架将项目清晰地分成不同层级(不理解为很么是还用这么老的框架,人家都springboot了,我这还得往后学!!!)
在这里插入图片描述 SSI整合(Struts2.x+Spring3.x+iBatis2.x)示例
标签: ibatis spring 存储过程 struts2 ssi

本篇介绍iBatis2.x、Spring3.1.2、Struts2.3.4的集成
Struts: MVC,控制层
ibatis: ORM
Spring: 业务逻辑,整合

如果需要源代码,请留下您的邮箱地址,我会尽快给您回复。

1、相关的jar文件
iBatis2.3.4: iBatis核心包
ibatis-2.3.4.726.jar
Spring3.1.2-required: Spring核心包
org.springframework.asm-3.1.2.RELEASE.jar
org.springframework.beans-3.1.2.RELEASE.jar
org.springframework.context-3.1.2.RELEASE.jar
org.springframework.core-3.1.2.RELEASE.jar
org.springframework.expression-3.1.2.RELEASE.jar
Spring3.1.2-dao:Spring和其他框架整合数据访问相关包
org.springframework.jdbc-3.1.2.RELEASE.jar
org.springframework.orm-3.1.2.RELEASE.jar
org.springframework.transaction-3.1.2.RELEASE.jar
Spring3.1.2-aop:Spring AOP功能相关包
aopalliance-1.0.jar
aspectjweaver-1.6.10.jar
cglib-nodep-2.1_3.jar
org.springframework.aop-3.1.2.RELEASE.jar
common-logging1.1:Spring默认使用日志包
commons-logging-1.1.1.jar
Struts2.3.4-required: Struts核心包
commons-fileupload-1.2.2.jar
commons-io-2.0.1.jar
commons-lang3-3.1.jar
freemarker-2.3.19.jar
javassist-3.11.0.GA.jar
ognl-3.0.5.jar
struts2-core-2.3.4.1.jar
xwork-core-2.3.4.1.jar
Struts2.3.4-spring-plugin: 与Spring整合需要的包
struts2-spring-plugin-2.3.4.1.jar

2、配置Struts2
struts2的配置相对简单,在首先在web.xml配置struts2的过滤器StrutsPrepareAndExecuteFilter

struts2 org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter struts2 /*

然后在classpath下面编写struts2的配置文件:struts.xml

<?xml version="1.0" encoding="UTF-8"?>

3、整合Spring和Struts
所谓的Spring和Struts进行整合,其实就是让Spring来管理Struts的Action创建,需要导入struts2-spring-plugin-2.3.4.1.jar
在struts-plugin.xml中有下面两句:

其实就是换了一个对象工厂,原来是XWork的工厂,现在是Spring的

导入struts对spring的插件包之后,在web.xml中配置Spring的监听器ContextLoaderListener

contextConfigLocation classpath:applicationContext-procedure.xml org.springframework.web.context.ContextLoaderListener

编写spring的配置文件

<?xml version="1.0" encoding="UTF-8"?>

扫描二维码关注公众号,回复: 5968279 查看本文章

<context:annotation-config />
<context:component-scan base-package=“edu.zhku.cian.dao.impl” />

4、接下来整合iBatis和Spring
(1)、创建实体类User
public class User{
private Long id;
private String name;
private String password;
private Date regDay;
// …getter and setter
}

(2)、创建DAO接口——IUserDao
public interface IUserDao {
public void save(User user);
public void delete(User user);
public void update(User user);
public User get(Long id);
public List queryAll();
public List queryByName(String name);
}

(3)、创建数据库
create database test;

4、创建表和存储过程,一下均为手写的代码,可以自己在mySQL客户端软件上面进行创建
use test;

alter table t_woman drop foreign key FK_MID;
alter table t_woman drop foreign key FK_HID;
alter table t_man drop foreign key FK_PID;
alter table t_man drop foreign key FK_WID;

drop table if exists t_user;
drop table if exists t_man;
drop table if exists t_wonman;

– 显示存储过程、函数
show procedure status;
show function status;

– 删除函数和存储过程
drop procedure if exists proc_usercount;
drop procedure if exists proc_get_user_byid;
drop procedure if exists proc_paging_user;
drop procedure if exists proc_condiction_paging;

– 创建表
create table t_user(
id int auto_increment primary key,
name varchar(30) not null,
password varchar(30) default “111111”,
regDay datetime
);

create table t_man(
id int auto_increment primary key,
name varchar(30) not null,
parentId int,
wifeId int
);

create table t_woman(
id int auto_increment primary key,
name varchar(30) not null,
motherId int,
husbandId int
);

alter table t_man add constraint FK_PID foreign key (parentId) references t_man(id);
alter table t_woman add constraint FK_MID foreign key (motherId) references t_woman(id);

alter table t_man add constraint FK_WID foreign key (wifeId) references t_woman(id);
alter table t_woman add constraint FK_HID foreign key (husbandId) references t_man(id);

– 创建存储过程
drop procedure proc_usercount;
delimiter //
create procedure proc_usercount(
out userCount int
)
begin
select count(*) into userCount from t_user;
end
//
delimiter ;

– 根据ID查询User的存储过程设计
drop procedure proc_get_user_byid;
delimiter //
create procedure proc_get_user_byid(
IN uid int – 指定一个输入参数,默认不写就是IN
)
begin
select * from t_user where id=uid;
end
//
delimiter ;

– 1,一个支持分页查询的存储过程,没有查询参数
drop procedure proc_paging_user;
delimiter //
create procedure proc_paging_user(
IN pageIndex int,
IN pageSize int,
out totalRecord int
)
begin
declare pstmt varchar(2000);
select count(*) into totalRecord from t_user;
– 组装SQL语句
set @sql = concat(‘select * from t_user limit ‘, (pageIndex-1)*pageSize ,’,’, pageSize);
– 得到prepare pstmt
prepare pstmt from @sql;
– 执行select
execute pstmt;
deallcate prepare pstmt;
– ////以下方式编译不能通过!
– select * from testproc limit (i_pageIndex-1)*i_pageSize,i_pageSize; – 语句2
end
//
delimiter ;

– 创建一个带条件的分页查询
drop procedure if exists proc_condiction_paging;
delimiter //
create procedure proc_condiction_paging(
IN tableName varchar(100), – 表名
IN whereSql varchar(500), – 条件查询语句
IN pageIndex int, – 当前第几页
IN pageSize int, – 每页多少条记录
OUT totalRecord int – 总的记录数目
)
begin
declare pstmt varchar(700);
set @count_stmt = concat('select count(*) into @TOTAL from ‘,tableName,’ ', whereSql);

prepare total_stmt from @count_stmt;
execute total_stmt;
deallocate prepare total_stmt;
set totalRecord = @TOTAL;

set @sql = concat('select * from ‘,tableName,’ ‘,whereSql,’ limit ',(pageIndex-1)*pageSize, ‘,’ , pageSize);
– 计算总条数作为输出参数
prepare pstmt from @sql;
execute pstmt;
deallocate prepare pstmt;
end
//
delimiter ;

– 创建一个存储过程,删除用户,参数为用户的id
drop procedure if exists proc_delete_user_byid;
delimiter //
create procedure proc_delete_user_byid (
IN uid int
)
begin
delete from t_user where id=uid;
end
//
delimiter ;

– 创建存储过程,通过指定的用户名获取用户
drop procedure if exists proc_get_user_byname;
delimiter //
create procedure proc_get_user_byname(
IN uname varchar(30)
)
begin
select * from t_user where name like concat(’%’,uname,’%’);
end
//
delimiter ;

(4)、编写ibatis的配置文件:sqlMapConfig.xml

<?xml version="1.0" encoding="UTF-8" ?>

(5)、配置数据库连接的相关信息db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=admin

(6)、配置Spring的配置文件applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>

<context:annotation-config />
<context:component-scan base-package=“edu.zhku.cian.dao.impl” />

<context:property-placeholder location=“classpath:db.properties”/>

(7)、编写IUserDao的实现类:UserDaoSpringIbatisProcedureImpl.java
package edu.zhku.cian.dao.impl;

import java.sql.SQLException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.transaction.annotation.Transactional;

import com.ibatis.sqlmap.client.SqlMapClient;
import com.ibatis.sqlmap.client.SqlMapSession;

import edu.zhku.cian.dao.IUserDao;
import edu.zhku.cian.domain.User;

@SuppressWarnings(“unchecked”)
@Transactional
public class UserDaoSpringIbatisProcedureImpl implements IUserDao {

private SqlMapClient sqlMapClient;

// 通过Spring创建并注入
public void setSqlMapClient(SqlMapClient sqlMapClient) {
this.sqlMapClient = sqlMapClient;
}

protected SqlMapSession getSession() {
return this.sqlMapClient.openSession();
}

@Override
public void save(User user) {
SqlMapSession session = this.getSession();
try {
Object obj = session.insert(“insertUser”, user);
System.out.println("return object: " + obj);
} catch (SQLException e) {
e.printStackTrace();
} finally {
session.close();
}
}

@Override
public void delete(User user) {
SqlMapSession session = this.getSession();
try {
// 以下这个方法返回的是影响的行数
session.delete(“deleteUserByProcedure”, user.getId());
} catch (SQLException e) {
e.printStackTrace();
} finally {
session.close();
}
}

@Override
public void update(User user) {
SqlMapSession session = this.getSession();
try {
// 以下这个方法返回的是影响的行数
session.update(“updateUser”, user);
} catch (SQLException e) {
e.printStackTrace();
} finally {
session.close();
}
}

@Override
public User get(Long id) {
SqlMapSession session = this.getSession();
try {
return (User) session.queryForObject(“queryByIdProcedure”, id);
} catch (SQLException e) {
e.printStackTrace();
} finally {
session.close();
}
return null;
}

@Override
public List queryAll() {
SqlMapSession session = this.getSession();
try {
return session.queryForList(“selectAllUser”);
} catch (SQLException e) {
e.printStackTrace();
} finally {
session.close();
}
return null;
}

@Override
public List queryByName(String name) {
SqlMapSession session = this.getSession();
try {
Map<String, Object> map = new HashMap<String, Object>();
map.put(“pageIndex”, 1);
map.put(“pageSize”, 10);
map.put(“totalRecord”, null);

List users = session.queryForList(“userPaging”, map);
System.out.println(“共有: " + (Integer)map.get(“totalRecord”) + " 条记录”);
return users;
} catch (SQLException e) {
e.printStackTrace();
} finally {
session.close();
}
return null;
}
}

(8)、在applicationContext.xml添加对上一步骤的userDao声明


(9)、进行测试
package edu.zhku.cian.dao.impl;

import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertNull;

import java.util.List;

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

import edu.zhku.cian.dao.IUserDao;
import edu.zhku.cian.domain.User;

public class UserDaoSpringIbatisProcedureImplTest {
private ApplicationContext acx = null;
private IUserDao userDao = null;

@Before
public void ready() {
acx = new ClassPathXmlApplicationContext(“applicationContext-procedure.xml”);
assertNotNull(acx);
userDao = acx.getBean(IUserDao.class);
assertNotNull(userDao);
}

@Test
public void testDelete() {
User user = userDao.get(3L);
assertNotNull(user);
System.out.println(user);

userDao.delete(user);

user = userDao.get(3L);
assertNull(user);
}

@Test
public void testGetByIdProcedure() {
User user = userDao.get(8L);
assertNotNull(user);
System.out.println(user);
}

@Test
public void testGetByNameProcedure() {
List users = userDao.queryByName(“free”);
assertNotNull(users);
for (User user : users) {
System.out.println(user);
}
}

}

5、UserAction的编写和配置

UserAction.java

package edu.zhku.cian.web;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;

import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;

import edu.zhku.cian.dao.IUserDao;
import edu.zhku.cian.domain.User;

@Controller
@Scope(“prototype”)
public class UserAction extends ActionSupport {
private static final long serialVersionUID = 1L;

@Resource
private IUserDao userDao;

public String list() {
List userList = userDao.queryAll();
ActionContext.getContext().put(“userList”, userList);
return “list”;
}
}

UserAction的配置

在struts.xml中进行配置


/WEB-INF/user/list.jsp

6、测试
现在部署项目,在浏览器中输入http://localhost:8080/user/user_list
看看结果吧!

猜你喜欢

转载自blog.csdn.net/weixin_43671743/article/details/89373076
今日推荐