利用SSM框架实现简单的增删改查功能
一、需要的依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.11</version>
<scope>test</scope>
</dependency>
<!--1.mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.0</version>
</dependency>
<dependency>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-core</artifactId>
<version>1.3.5</version>
</dependency>
<!--逆向生成带分页的插件-->
<dependency>
<groupId>com.itfsw</groupId>
<artifactId>mybatis-generator-plugin</artifactId>
<version>1.0.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<dependency>
<groupId>com.mchange</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.5.2</version>
</dependency>
<!--2.spring-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<!--springMvc-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<!--pojo转换成 json -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.7.3</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.7.3</version>
</dependency>
<!--jstl和tablib-->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
</dependencies>
<!--Tomcat-->
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<path>/</path>
<port>8080</port>
<uriEncoding>UTF-8</uriEncoding>
</configuration>
</plugin>
二、逆向生成
逆向生成配置文件:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<!-- 生成配置文件 -->
<generatorConfiguration>
<context id="DB2Tables" targetRuntime="MyBatis3">
<!--分页插件-->
<plugin type="com.itfsw.mybatis.generator.plugins.LimitPlugin"/>
<commentGenerator>
<!-- 是否去除注释,true表示是,false否 -->
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!-- 1.连接数据库信息 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/k9503?characterEncoding=UTF-8"
userId="root"
password="123456">
</jdbcConnection>
<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
NUMERIC 类型解析为java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- 2.pojo类的生成配置 targetPackage表示目标文件夹
targetProject表示当前目标文件夹所放置的目标地址
-->
<javaModelGenerator targetPackage="com.pojo" targetProject=".\src\main\java">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- 3.sql映射文件生成配置 -->
<sqlMapGenerator targetPackage="mybatis/mapper" targetProject=".\src\main\resources">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!-- 4.mapper接口配置 -->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.mapper" targetProject=".\src\main\java">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!-- 5.数据库表和实体类映射 -->
<table tableName="emp" domainObjectName="Emp">
</table>
<table tableName="dept" domainObjectName="Dept">
</table>
</context>
</generatorConfiguration>
逆向生成代码:
@Test
public void create() throws Exception {
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
File configFile = new File("mbg.xml");
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(configFile);
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
}
核心配置文件;
springMVC.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="com.controller"></context:component-scan>
<mvc:annotation-driven>
<mvc:message-converters>
<bean class="org.springframework.http.converter.StringHttpMessageConverter">
<constructor-arg value="UTF-8"></constructor-arg>
</bean>
<bean class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"></bean>
</mvc:message-converters>
</mvc:annotation-driven>
<mvc:default-servlet-handler/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/jsp/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
</beans>
sqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--引入外部文件的标签 -->
<properties resource="properties/db.properties"></properties>
<settings>
<!-- 可以在控制台输出日志信息:sql语句和参数 -->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!-- 表示类型别名 库-->
<typeAliases>
<!-- 每一个类型的别名 type属性表示别名对应的类型地址 alias表示起的别名-->
<typeAlias type="java.util.List" alias="list"/>
<!-- package表示包,利用包的形式进行扫描包之下的所有的类,别名就是当前类名 -->
<package name="com.pojo"/>
</typeAliases>
<!-- 分页插件 -->
<!-- <plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"> 3.3.0版本可用 - 分页参数合理化,默认false禁用
pageNum表示当前页 pages表示尾页
true启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 false禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据
<property name="reasonable" value="true"/>
</plugin>
</plugins>
-->
<!-- 环境配置 作为连接数据库的环境 -->
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
</environment>
</environments>
<!-- mappers表示代理模式扫描 ,目的主要是在当前配置文件中扫描到sql映射文件-->
<!--核心配置文件 关联 映射文件 -->
<!-- <mappers>
<mapper resource="mapper/Mapper.xml"/>
</mappers>-->
</configuration>
db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/k9503?zeroDateTimeBehavior=convertToNull
jdbc.username=root
jdbc.password=123456
applicationContext.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!--1、开启service层的注解-->
<context:component-scan base-package="com.service"/>
<!--2、加载db.properties-->
<context:property-placeholder location="classpath:properties/db.properties"/>
<!--3、数据源-->
<bean id="ds" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${jdbc.driver}"/>
<property name="jdbcUrl" value="${jdbc.url}"/>
<property name="user" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--4、事务管理-->
<bean id="tx" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="ds"></property>
</bean>
<!--5、开启事务的注解@Transactional-->
<tx:annotation-driven transaction-manager="tx"/>
<!--6、spring管理MyBatis-->
<bean id="fb" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="ds"/>
<property name="configLocation" value="classpath:mybatis/sqlMapConfig.xml"></property>
<property name="mapperLocations" value="classpath:mybatis/mapper/*.xml"></property>
</bean>
<!--7、让mapper接口和mapper.xml关联,即使不在同一个文件夹下,依然可以使用包扫描的形式,加载所有的映射文件-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.mapper"/><!--指定mapper接口的路径-->
<property name="sqlSessionFactoryBeanName" value="fb"/>
</bean>
</beans>
controller层
package com.controller;
import com.pojo.Dept;
import com.pojo.Emp;
import com.pojo.PageBean;
import com.service.IEmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import java.util.List;
@Controller
@RequestMapping("/emp")
public class EmpController {
@Autowired
private IEmpService service;
@RequestMapping("/show")
public ModelAndView show(PageBean page, ModelAndView mav){
//取
//模糊分页条件查询所有员工
List<Emp> list=service.selectLikePage(page);
//查询下拉框中的所有部门
List<Dept> depts=service.selectDepts();
//存进request域中
mav.addObject("list",list);
mav.addObject("depts",depts);
mav.addObject("page",page);
//转
mav.setViewName("show");
return mav;
}
//新增页面跳转
@RequestMapping("/add1")
public String add1(Model m){
//查询所有的部门--中下拉框展示所有的部门
List<Dept> depts=service.selectDepts();
m.addAttribute("depts",depts);
return "add";
}
//实现新增
@RequestMapping("/add2")
public String add2(Emp emp){
int i=service.addEmp(emp);
return "redirect:/emp/show";//去show方法 重查
}
//1.查询单条 2.页面跳转
@RequestMapping("/update1/{id}")
public String update1(@PathVariable String id, Model m){
Emp e=service.selectById(Integer.parseInt(id));
m.addAttribute("emp",e);
//查询所有的部门--中下拉框展示所有的部门
List<Dept> depts=service.selectDepts();
m.addAttribute("depts",depts);
return "update";//转发到update.jsp
}
//执行修改
@RequestMapping("/update2")
public String update2(Emp emp){
int i=service.updateEmp(emp);
return "redirect:/emp/show";//去show方法 重查
}
@RequestMapping("/deleteById/{id}")
public String deleteById(@PathVariable String id){
int i=service.deleteById(Integer.parseInt(id));
//删除后重查数据库
return "redirect:/emp/show";//去show方法 重查
}
}
pageBean
package com.pojo;
import org.springframework.format.annotation.DateTimeFormat;
import java.util.Date;
public class PageBean {
private int currPage = 1;
private int totalPage;
private int size = 4;
private int count;
private String name;
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
private Date startBirth;
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
private Date endBirth;
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE)
private Integer deptId;
public Integer getDeptId() {
return deptId;
}
public void setDeptId(Integer deptId) {
this.deptId = deptId;
}
public int getCurrPage() {
return currPage;
}
public void setCurrPage(int currPage) {
this.currPage = currPage;
}
public int getTotalPage() {
return totalPage;
}
public void setTotalPage(int totalPage) {
this.totalPage = totalPage;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name==null?null:name.trim();
}
public Date getStartBirth() {
return startBirth;
}
public void setStartBirth(Date startBirth) {
this.startBirth = startBirth;
}
public Date getEndBirth() {
return endBirth;
}
public void setEndBirth(Date endBirth) {
this.endBirth = endBirth;
}
}
关联逻辑外键
//在Emp中关联逻辑外键:
private Dept dept;
Service接口:
package com.service;
import com.pojo.Dept;
import com.pojo.Emp;
import com.pojo.PageBean;
import java.util.List;
public interface IEmpService {
List<Emp> selectLikePage(PageBean page);
List<Dept> selectDepts();
int addEmp(Emp emp);
Emp selectById(int parseInt);
int updateEmp(Emp emp);
int deleteById(int parseInt);
}
Servicce实现类:
package com.service.impl;
import com.mapper.DeptMapper;
import com.mapper.EmpMapper;
import com.pojo.*;
import com.service.IEmpService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service
@Transactional
public class EmpServiceImpl implements IEmpService {
@Autowired
private EmpMapper empMapper;
@Autowired
private DeptMapper deptMapper;
@Override
public List<Emp> selectLikePage(PageBean page) {
EmpExample e = new EmpExample();
EmpExample.Criteria c = e.createCriteria();
if(page.getName()!=null){
c.andNameLike("%"+page.getName()+"%");
}
if(page.getStartBirth()!=null){
c.andBirthGreaterThanOrEqualTo(page.getStartBirth());
}
if(page.getEndBirth()!=null){
c.andBirthLessThanOrEqualTo(page.getEndBirth());
}
if(page.getDeptId()!=null&&page.getDeptId()!=0){
c.andDeptidEqualTo(page.getDeptId());
}
int count = (int) empMapper.countByExample(e);
int size = page.getSize();
int totalPage=(count%size==0)?(count/size):(count/size+1);
page.setCount(count);
page.setTotalPage(totalPage);
int startRow=(page.getCurrPage()-1)*size;
e.limit(startRow,size);
List<Emp> emps = empMapper.selectByExample(e);
for(Emp emp:emps){
Dept dept=deptMapper.selectByPrimaryKey(emp.getDeptid());
emp.setDept(dept);
}
return emps;
}
@Override
public List<Dept> selectDepts() {
return deptMapper.selectByExample(null);
}
@Override
public int addEmp(Emp emp) {
return empMapper.insertSelective(emp);
}
@Override
public Emp selectById(int id) {
return empMapper.selectByPrimaryKey(id);
}
@Override
public int updateEmp(Emp emp) {
return empMapper.updateByPrimaryKeySelective(emp);
}
@Override
public int deleteById(int id) {
return empMapper.deleteByPrimaryKey(id);
}
}