一. SSM框架的整合
SSM 框架, 指的是 Spring+SpringMVC+MyBatis 框架。
其中, Spring的知识可以 参考老蝴蝶以前的文章,Spring的"两个蝴蝶飞,你好"的简单开发(一)
MyBatis也可以参考老蝴蝶以前的文章: MyBatis的简单了解(一)
SSM的整合,是在以前的基础之上,进行整合的,不对以前的知识进行讲解。
SSM的整合,也是跟以前SSH的整合一样,两两整合。 但SpringMVC是Spring框架的一部分,所以SpringMVC与Spring框架不需要整合。
所以,直接 Spring与MyBatis进行整合即可。
整合SSM 实现 REST 风格的CRUD操作。
二. SSM框架整合的详细步骤
二.一 新建一个动态的Web项目,名称为SSM, 选择2.5版本的
二.二 在src下创建包,在SSM项目下创建 config 的源文件夹
src 下创建的包分别为 : com.yjl.pojo, com.yjl.mapper, com.yjl.service, com.yjl.service.impl, com.yjl.action, com.yjl.utils , 来放置代码
创建源文件夹为 config, 来放置 配置文件
二.三 创建mybatis 数据库,里面创建 user表。 以user表为例进行整合
User的 字段有 ,id,name,sex,age,description, id为Integer,自动增长,主键。
数据有:
二.四 导入SSM 需要的整合Jar包
1 . MyBatis 所需要的Jar包
共15个。
2 . Spring+SpringMVC所需要的 jar包
共 25个
3 . JSTL模板类 库,有两个
4 . 数据库连接池 C3P0所需要的 jar包 或者是dbcp 所需要的jar包。 用dbcp吧,区别于SSH. 有两个
5 . mysql 数据库的驱动 1个。
6 . MyBatis与 Spring整合所需要的jar包 由MyBatis提供, 注意版本,选择1.3版本的。 1个。
将这些jar 包放置在 WEB-INF 下面的lib文件夹下。
共有 16+25+2+2+1+1= 46个。
导入之后, 发现 commons-logging-1.2.jar 包 重复,(Spring与MyBatis都有),去除一个。
log4j.jar 有两个版本, log4j-1.2.17.jar(MyBatis的), log4j-1.2.16.jar(Spring的),去除低版本的,保留 1.2.17
故最后只剩下 44个 jar包。
二.五 源文件夹 config下创建 db.properties 文件,来存储数据库的连接配置
db.properties:
##关于数据库的属性 jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf8 jdbc.username=root jdbc.password=abc123 ## 关于数据库连接池的属性 jdbc.maxActive=30 jdbc.maxIdle=5
在数据库前面加上前缀, jdbc,避免直接 url,username 与spring中的属性重复。
二.六 源文件夹config 下创建log4j.properties, 来存储日志信息
log4j.properties
### direct log messages to stdout ### log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target=System.out log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n ### direct messages to file hibernate.log ### #log4j.appender.file=org.apache.log4j.FileAppender #log4j.appender.file.File=hibernate.log #log4j.appender.file.layout=org.apache.log4j.PatternLayout #log4j.appender.file.layout.ConversionPattern=%d{ABSOLUTE} %5p %c{1}:%L - %m%n ### set log levels - for more verbose logging change 'info' to 'debug' ### log4j.rootLogger=debug, stdout
二.七 源文件夹 config下创建 mybatis文件夹,下面再创建 SqlMapConfig.xml 文件,存储MyBatis的配置
二.八 config下创建spring的文件夹,下面再创建 spring的配置文件
如 applicationContext-dao.xml(Spring与dao的整合) , applicationContext-service.xml(Spring与Service的整合), springmvc.xml (SpringMVC的配置文件)
创建之后, config 源文件夹下的目录如下所示:
上面是配置基本的文件,还没有到真正开始呢。 现在,才正式进入配置。
二.九 利用MyBatis的逆向工程来生成 user 表的逆向代码
MyBatis的逆向工程,可以观看老蝴蝶写的文章: MyBatis逆向工程的使用(十二)
逆向工程执行之后 ,会生成 User.java, UserExample.java, UserMapper.java, UserMapper.xml 文件。
将 User.java,UserExample.java 复制到 com.yjl.pojo 包下, 将UserMapper.java, UserMapper.xml 复制到 com.yjl.mapper 包下。
在MyBatis中添加分页查询的功能, 关于MyBatis的分页,可以观看老蝴蝶以前写的文章: MyBatis的pageHelper分页插件的使用(十五)
需要在UserExample, UserMapper.java, UserMapper.xml 中添加分页的功能代码。
故需要对其进行稍微的改变。
改变后的文件如下:
User.java
package com.yjl.pojo; import java.io.Serializable; public class User implements Serializable{ private static final long serialVersionUID = 6736354022794444729L; private Integer id; private String name; private Integer age; private String sex; private String description; 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 == null ? null : name.trim(); } public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex == null ? null : sex.trim(); } public String getDescription() { return description; } public void setDescription(String description) { this.description = description == null ? null : description.trim(); } @Override public String toString() { return "User [id=" + id + ", name=" + name + ", age=" + age + ", sex=" + sex + ", description=" + description + "]"; } }
UserExample.java
package com.yjl.pojo; import java.util.ArrayList; import java.util.List; public class UserExample { protected String orderByClause; protected boolean distinct; //添加两个字段,用于分页。 private int start; //开始的位置 private int offset; //每页显示的最大数目 public int getStart() { return start; } public void setStart(int start) { this.start = start; } public int getOffset() { return offset; } public void setOffset(int offset) { this.offset = offset; } // .... 省略逆向工程生成的代码, 主要是太多了,老蝴蝶就不复制了。 }
UserMapper.java
package com.yjl.mapper; import java.util.List; import org.apache.ibatis.annotations.Param; import com.yjl.pojo.User; import com.yjl.pojo.UserExample; public interface UserMapper { int countByExample(UserExample example); int deleteByExample(UserExample example); int deleteByPrimaryKey(Integer id); int insert(User record); int insertSelective(User record); List<User> selectByExample(UserExample example); User selectByPrimaryKey(Integer id); int updateByExampleSelective(@Param("record") User record, @Param("example") UserExample example); int updateByExample(@Param("record") User record, @Param("example") UserExample example); int updateByPrimaryKeySelective(User record); int updateByPrimaryKey(User record); //根据sql语句进行相应的查询 List<User> selectBySQL(@Param(value="limit")int limit, @Param(value="offset") int offset); }
UserMapper.xml
代码也太多了,就不复制了,在逆向工程生成的代码之上, 把 selectBySQL写出来即可。
<!-- 分页查询 --> <select id="selectBySQL" resultMap="BaseResultMap" parameterType="com.yjl.pojo.UserExample" > select <include refid="Base_Column_List" /> from user limit #{limit},#{offset} </select>
样式为: