1、导包
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<spring.version>4.3.7.RELEASE</spring.version>
<hibernate.version>4.3.8.Final</hibernate.version>
<jackson.version>2.8.7</jackson.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- ORM映射框架和事务管理 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- MySQL驱动包 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.26</version>
</dependency>
<!-- DBCP连接池 -->
<dependency>
<groupId>commons-pool</groupId>
<artifactId>commons-pool</artifactId>
<version>1.5.6</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.2.2</version>
</dependency>
<!-- Hibernate核心包 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>${hibernate.version}</version>
</dependency>
<!-- Hibernate对JPA的实现包 -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>${hibernate.version}</version>
</dependency>
<!-- jackson -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>${jackson.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>${jackson.version}</version>
</dependency>
<!-- AOP联盟 -->
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.1</version>
</dependency>
</dependencies>
2、配置Spring.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">
<!--扫描包-->
<context:component-scan base-package="cn.yinsh.ssj.dao,cn.yinsh.ssj.service"/>
<!--数据库连接池-->
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="${jdbc.driverClassName}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!--集成JPA-->
<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<!--引用数据库连接池-->
<property name="dataSource" ref="dataSource"/>
<!--配置domain-->
<property name="packagesToScan" value="cn.yinsh.ssj.domain"/>
<!--JPA实现厂商-->
<property name="jpaVendorAdapter">
<bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
<!--是否自动建表-->
<property name="generateDdl" value="FALSE"/>
<!--是否显示Sql-->
<property name="showSql" value="TRUE"/>
<!--方言-->
<property name="databasePlatform" value="org.hibernate.dialect.MySQLDialect"/>
</bean>
</property>
</bean>
<!--事务管理-->
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
<property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>
</beans>
3、domain实体类
employee:
@Entity
public class Employee {
@Id
@GeneratedValue
private Long id;
private String name;
private Integer age;
private String phone;
private String email;
private Integer gender;
private BigDecimal salary;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "department_id")
@JsonIgnoreProperties({"hibernateLazyInitializer","handler","fieldHandler"})
private Department department;
@Override
public String toString() {
return "Employee{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
", phone='" + phone + '\'' +
", email='" + email + '\'' +
", gender=" + gender +
", salary=" + salary +
'}';
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public String getPhone() {
return phone;
}
public void setPhone(String phone) {
this.phone = phone;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public Integer getGender() {
return gender;
}
public void setGender(Integer gender) {
this.gender = gender;
}
public BigDecimal getSalary() {
return salary;
}
public void setSalary(BigDecimal salary) {
this.salary = salary;
}
public Department getDepartment() {
return department;
}
public void setDepartment(Department department) {
this.department = department;
}
}
department:
@Entity
public class Department {
@Id
@GeneratedValue
private Long id;
private String name;
public Department() {}
public Department(Long id,String name) {
this.id=id;
this.name = name;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
4、dao层接口及实现类
IBaseDao
public interface IBaseDao<T> {
void save(T t);
void update(T t);
void delete(Long id);
T findOne(Long id);
List<T> findAll();
//分页查询
List<T> findByPage(Integer pageNum,Integer pageSize);
//查询总行数
Long findRowCount();
}
IDepartmentDao&IEmployeeDao
public interface IDepartmentDao extends IBaseDao<Department>{
}
public interface IEmployeeDao extends IBaseDao<Employee>{
}
dao层实现类
Employee
@Repository
public class EmployeeDaoImpl implements IEmployeeDao {
@PersistenceContext//在找不到entityManager时会通过entityManagerFactory创建一个entityManager对象
private EntityManager entityManager;
@Override
public void save(Employee employee) {
entityManager.persist(employee);
}
@Override
public void update(Employee employee) {
entityManager.merge(employee);
}
@Override
public void delete(Long id) {
Employee employee = entityManager.find(Employee.class, id);
entityManager.remove(employee);
}
@Override
public Employee findOne(Long id) {
return entityManager.find(Employee.class, id);
}
@Override
public List<Employee> findAll() {
Query query = entityManager.createQuery("select e from Employee e");
return query.getResultList();
}
@Override
public List<Employee> findByPage(Integer pageNum, Integer pageSize) {
Query employee = entityManager.createQuery("select e from Employee e order by e.id desc");
employee = employee.setFirstResult((pageNum - 1) * pageSize).setMaxResults(pageSize);
return employee.getResultList();
}
@Override
public Long findRowCount() {
Query query = entityManager.createQuery("select count(e) from Employee e");
return (Long) query.getSingleResult();
}
}
Department
@Repository
public class DepartmentDaoImpl implements IDepartmentDao{
@PersistenceContext//在找不到entityManager时会通过entityManagerFactory创建一个entityManager对象
private EntityManager entityManager;
@Override
public void save(Department department) {
entityManager.persist(department);
}
@Override
public void update(Department department) {
entityManager.merge(department);
}
@Override
public void delete(Long id) {
Employee employee = entityManager.find(Employee.class, id);
entityManager.remove(employee);
}
@Override
public Department findOne(Long id) {
return entityManager.find(Department.class, id);
}
@Override
public List<Department> findAll() {
Query employee = entityManager.createQuery("select d from Department d");
return employee.getResultList();
}
@Override
public List<Department> findByPage(Integer pageNum, Integer pageSize) {
Query query = entityManager.createQuery("select d from Department d order by d.id desc ");
query = query.setFirstResult((pageNum - 1) * pageSize).setMaxResults(pageSize);
return query.getResultList();
}
@Override
public Long findRowCount() {
Query query = entityManager.createQuery("select count(d) from Department d");
return (Long) query.getSingleResult();
}
}
5、Service层接口及实现类
IBaseService
public interface IBaseService<T> {
void save(T t);
void update(T t);
void delete(Long id);
void delete(String ids);
T findOne(Long id);
List<T> findAll();
Page<T> findByPage(Integer pageNum,Integer pageSize);
}
IBaseServiceImpl
@Transactional(readOnly = true)
public class BaseServiceImpl<T> implements IBaseService<T> {
@Autowired
private IBaseDao<T> baseDao;
@Override
@Transactional(readOnly = false)
public void save(T t) {
baseDao.save(t);
}
@Override
@Transactional(readOnly = false)
public void update(T t) {
baseDao.update(t);
}
@Override
@Transactional(readOnly = false)
public void delete(Long id) {
baseDao.delete(id);
}
@Override
@Transactional(readOnly = false)
public void delete(String ids) {
if (ids!=null && !"".equals(ids)){
for (String id :ids.split(",")){
baseDao.delete(Long.valueOf(id));
}
}
}
@Override
public T findOne(Long id) {
return baseDao.findOne(id);
}
@Override
public List<T> findAll() {
return baseDao.findAll();
}
@Override
public Page<T> findByPage(Integer pageNum, Integer pageSize) {
List<T> list = baseDao.findByPage(pageNum, pageSize);
Long total = baseDao.findRowCount();
return new Page<T>(total,list,pageNum,pageSize);
}
}
EmployeeService & impl
public interface IEmployeeService extends IBaseService<Employee>{
}
@Service
@Transactional(readOnly = true)
public class EmployeeServiceImpl extends BaseServiceImpl<Employee> implements IEmployeeService{
}
DepartmentService & impl
public interface IDepartmentService extends IBaseService<Department> {
}
@Service
@Transactional(readOnly = true)
public class DepartmentServiceImpl extends BaseServiceImpl<Department> implements IDepartmentService {
}
6、controller层暴露接口
EmployeeController
@Controller
@RequestMapping("/employee")
public class EmployeeController {
@Autowired
private IEmployeeService employeeService;
@RequestMapping("/index")
public String index() {
return "employee";
}
@ResponseBody
@RequestMapping("/page")
public Page<Employee> page(Integer pageNum, Integer pageSize) {
pageNum = pageNum == null ? 1 : pageNum;
pageSize = pageSize == null ? 10 : pageSize;
return employeeService.findByPage(pageNum, pageSize);
}
@ResponseBody
@RequestMapping("/save")
public Result save(Employee employee){
try {
if (employee.getId()==null){
employeeService.save(employee);
return new Result(200,"新增成功");
}else {
employeeService.update(employee);
return new Result(200,"修改成功");
}
} catch (Exception e) {
e.printStackTrace();
return new Result(500,"失败");
}
}
@ResponseBody
@RequestMapping("/delete")
public Result delete(String ids){
try {
employeeService.delete(ids);
return new Result(200,"删除成功");
} catch (Exception e) {
e.printStackTrace();
return new Result(500,"删除失败");
}
}
@ResponseBody
@RequestMapping("/findOne")
public Employee findOne(Long id){
return employeeService.findOne(id);
}
}
DepartmentController
@Controller
@RequestMapping("/department")
public class DepartmentController {
@Autowired
private IDepartmentService departmentService;
@ResponseBody
@RequestMapping("/findAll")
public List<Department> findAll(){
List<Department> list = departmentService.findAll();
list.add(0,new Department(-1L,"请选择部门"));
return list;
}
}
7、配置SpringMVC
<?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:mvc="http://www.springframework.org/schema/mvc"
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/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--扫描包-->
<context:component-scan base-package="cn.yinsh.ssj.controller"/>
<!--开启springmvc的注解驱动-->
<mvc:annotation-driven/>
<!--静态资源放行-->
<mvc:default-servlet-handler/>
<!--视图解析器-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--文件上传解析器-->
</beans>
8、集成EasyUI,对员工增删改查
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
<link rel="stylesheet" type="text/css" href="/easyui/themes/default/easyui.css" />
<link rel="stylesheet" type="text/css" href="/easyui/themes/icon.css" />
<script type="text/javascript" src="/easyui/jquery.min.js"></script>
<script type="text/javascript" src="/easyui/jquery.jdirk.js"></script>
<script type="text/javascript" src="/easyui/jquery.easyui.min.js"></script>
<script type="text/javascript" src="/easyui/locale/easyui-lang-zh_CN.js"></script>
<style type="text/css">
.form-group{width:200px;height: 35px;margin: auto;}
.form-group:first-child{margin-top:10px;}
.form-group:last-child{text-align:center;}
.in{width:200px;height: 25px;border: 1px solid lightgray;}
.in:focus{border: 1px solid #95B8E7;box-shadow: 0px 0px 5px 2px #95B8E7;}
.searchin{width:120px;}
</style>
<script type="text/javascript">
$(function () {
$("#dg").datagrid({
url:"/employee/page",
method:"post",
striped:true,
rownumbers:true,
pagination:true,
toolbar:"#toolbar",
frozenColumns:[[{field:'hhhh',title:'代码',checkbox:true}]],
columns:[[
{field:"id",title:"编号",width:100},
{field:"name",title:"姓名",width:100},
{field:"gender",title:"性别",width:100,formatter:function(value, row, index) {
return value == 1 ? "男" : "女";
}},
{field:"email",title:"邮箱",width:100},
{field:"age",title:"年龄",width:100},
{field:"phone",title:"手机",width:100},
{field:"salary",title:"工资",width:100},
{field:"department",title:"所属部门",width:100,formatter:function(value, row, index) {
return value && value.name ? value.name : "";
}}
]]
});
//获取datagrid的翻页工具栏对象 Pagination
var pager = $("#dg").datagrid("getPager");
pager.pagination({
onSelectPage:function(pageNumber, pageSize){
$("#dg").datagrid('loading');
//将当前页码和每页展示的数据作为请求参数发送到datagrid的url地址
$("#dg").datagrid('load',{
pageNum:pageNumber,
pageSize:pageSize
});
//改变分页工具栏下方展示的当前页码和每页显示的行数
pager.pagination({
pageNumber:pageNumber,
pageSize:pageSize
});
$("#dg").datagrid('loaded');
}
});
//给btn-add按钮绑定点击事件
$("#btn-add").click(function () {
$("#dialog").dialog("open");
//重置表单
$("#ffff").form("reset");
});
//给btn-submit按钮绑定点击事件
$("#btn-submit").click(function () {
//serializeObject方法来自于jquery.jdirk.js文件,作用是将一个表单序列化成一个json对象
var params = $("#ffff").serializeObject();
var url = "/employee/save";
//如果id输入框有值,就是修改,否则就是新增
if(params.id){
url = "/employee/save";
}
$.post(url,params,function (data) {
if(data.status == 200){
$.messager.alert("消息",data.msg,"info");
//关闭表单窗口
$("#dialog").dialog("close");
//重新加载一下表格的数据
$("#dg").datagrid('load',{
pageNo:1,
pageSize:10
});
$("#dg").datagrid("getPager").pagination({
pageNumber:pageNumber,
pageSize:pageSize
});
}else{
$.messager.alert("错误",data.msg,"error");
}
},"json");
});
//给btn-edit按钮绑定点击事件
$("#btn-edit").click(function () {
//先获取用户选中的行
var rows = $("#dg").datagrid("getSelections");
if(rows.length == 0){
$.messager.alert("错误","请先选中你要修改的数据!","error");
return;
}
if(rows.length > 1){
$.messager.alert("错误","只能选中一行数据进行修改!","error");
return;
}
//通过id去查询一行数据,进行表单回填
$.getJSON("/employee/findOne",{id:rows[0].id},function (data) {
//表单回填
$('#ffff').form('load',data);
//打开表单窗口
$("#dialog").dialog("open");
//手动回填一下关联的部门下拉框
if(data.department) $("#departmentId").combobox("setValue",data.department.id);
});
});
//给btn-remove按钮绑定点击事件
$("#btn-remove").click(function () {
//先获取用户选中的行
var rows = $("#dg").datagrid("getSelections");
if(rows.length == 0){
$.messager.alert("错误","请先选中你要删除的数据!","error");
return;
}
$.messager.confirm('确认','您确认想要删除这些数据吗?',function(r){
if (r){
var ids = [];
for(var i=0;i<rows.length;i++){
ids.push(rows[i].id);
}
//支持一次性删除多行数据,参数格式是:12,2,23,17 以逗号隔开
$.getJSON("/employee/delete",{ids:ids.join(",")},function (data) {
if(data.status == 200){
$.messager.alert("消息",data.msg,"info");
//重新加载一下表格的数据
$("#dg").datagrid('load',{
pageNo:1,
pageSize:10
});
$("#dg").datagrid("getPager").pagination({
pageNumber:pageNumber,
pageSize:pageSize
});
}else{
$.messager.alert("错误",data.msg,"error");
}
});
}
});
});
});
</script>
</head>
<body>
<div id="toolbar">
<a id="btn-add" href="javascript:void(0);" class="easyui-linkbutton" data-options="iconCls:'icon-add'">新增</a>
<a id="btn-edit" href="javascript:void(0);" class="easyui-linkbutton" data-options="iconCls:'icon-edit'">编辑</a>
<a id="btn-remove" href="javascript:void(0);" class="easyui-linkbutton" data-options="iconCls:'icon-remove'">删除</a>
</div>
<table id="dg"></table>
<div id="dialog" class="easyui-dialog" title="新增/编辑员工信息" style="width:400px;height:340px;top:100px;"
data-options="iconCls:'icon-save',resizable:true,modal:true,closed:true">
<form id="ffff">
<div class="form-group">
<input type="hidden" name="id" />
<input type="text" name="name" placeholder="姓名" class="easyui-validatebox in" />
</div>
<div class="form-group">
<input type="text" name="email" placeholder="邮箱" class="easyui-validatebox in" />
</div>
<div class="form-group">
<input type="text" name="age" placeholder="年龄" class="easyui-validatebox in" />
</div>
<div class="form-group">
<input type="text" name="phone" placeholder="电话" class="easyui-validatebox in" />
</div>
<div class="form-group">
<input type="text" name="salary" placeholder="工资" class="easyui-validatebox in" />
</div>
<div class="form-group">
<input type="text" name="department.id" id="departmentId" class="easyui-combobox in"
data-options="url:'/department/findAll',valueField:'id',textField:'name',value:'-1',editable:false"/>
</div>
<div class="form-group">
<input type="radio" name="gender" value="1" />男
<input type="radio" name="gender" value="2" />女
</div>
<div class="form-group">
<a id="btn-cancel" href="javascript:void(0);" class="easyui-linkbutton" data-options="iconCls:'icon-undo'">取消</a>
<a id="btn-submit" href="javascript:void(0);" class="easyui-linkbutton" data-options="iconCls:'icon-redo'">提交</a>
</div>
</form>
</div>
</body>
</html>