前言:
spring+springmvc+mybatis,称为ssm。ssm可以说是后端程序员必备技能,应该也是目前用得最多的,所以无论如何都要掌握!下面一起来看整合案例。点我下载源码。
开发环境:
1、开发工具:eclipse 4.7.3
2、maven 3.5.2
3、jdk 1.9
4、tomcat 8.5
5、mysql 5.7.21
欢迎大家关注我的公众号 javawebkf,目前正在慢慢地将文章搬到公众号,以后和公众号文章将同步更新,且上的付费文章在公众号上将免费。
一、项目环境搭建:
1、创建项目:
打开eclipse,file --> new --> maven project --> maven archetype webapp,然后填写好artifactId,点finish即可。若是创建maven项目失败,请参考eclipse创建maven项目失败解决方法
2、创建项目目录结构:
创建好项目以后,按照下图创建项目结构:
注意:项目刚创建出来可能只有src/main/java,自己创建其他的时候是 new source folder,而不是package。
3、添加依赖:
接下来就是添加依赖,本案例需要如下依赖:
4.0.0
com.zhu
ssm
war
0.0.1-SNAPSHOT
ssm Maven Webapp
http://maven.apache.org
junit
junit
4.12
test
org.springframework
spring-core
4.3.14.RELEASE
org.springframework
spring-beans
4.3.14.RELEASE
org.springframework
spring-context
4.3.14.RELEASE
org.springframework
spring-jdbc
4.3.14.RELEASE
org.springframework
spring-tx
4.3.14.RELEASE
org.springframework
spring-web
4.3.14.RELEASE
org.springframework
spring-webmvc
4.3.14.RELEASE
org.springframework
spring-test
4.3.14.RELEASE
test
javax.servlet
javax.servlet-api
3.1.0
provided
com.fasterxml.jackson.core
jackson-databind
2.8.7
commons-collections
commons-collections
3.2
org.mybatis
mybatis
3.4.2
org.mybatis
mybatis-spring
1.3.1
mysql
mysql-connector-java
5.1.37
com.mchange
c3p0
0.9.5.2
>>
ssm
org.springframework.boot
spring-boot-maven-plugin
3.6.1
4、完成各项配置:
添加好依赖之后,就来完成jdbc数据源、mybatis和spring 的配置:
jdbc.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql:///ssm?useUnicode=true&characterEncoding=utf8
jdbc.username=#
jdbc.password=#
mybatis-config.xml
src/main/resource/spring下有如下三个配置文件,分别配置dao层,service层,controller层:
spring-dao.xml
spring-service.xml
spring-web.xml
注意:spring-web.xml中还可以配置视图解析器、文件上传器、静态资源的处理等,因为本案例未涉及这些内容,所以没有配置。
5、对web.xml进行配置
需要在web.xml中进行如下配置,让web容器能够加载到spring的配置文件:
Archetype Created Web Application
spring-dispatcher
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:spring/spring-.xml
spring-dispatcher
/
至此,就完成了环境的搭建了,接下来就可以进行代码的编写了!
二、分层编写代码:
1、entity层:
User.java
public class User {
private Integer userId;
private String userName;
private Integer age;
private Card card;//一个人一张身份证,1对1
private List mobilePhone;//土豪,多个手机,1对多
}
Card.java
public class Card {
private Integer cardId;
private String cardNum;//身份证号
private String address;//地址
}
MobilePhone.java
public class MobilePhone {
private Integer mobilePhoneId;
private String brand;//品牌
private double price;//价格
private User user;//主人
}
注意:以上实体类均省略了set和get方法。
2、数据库设计:
借助数据库客户端工具navicat进行数据库以及表的创建。
tb_mobile_phone中以user_id作为外键关联tu_user,tb_user中以card_id作为外键关联tb_card。
3、dao层:
UserDao.java
/**
* 带条件分页查询:
* 可输入的条件:名字(模糊),cardId,age,
* @param userCondition 把条件封装成一个user对象
* @param rowIndex 表示从第几行开始取数据
* @param pageSize 表示要返回多少行数据
* @return 返回user列表
*/
List queryUserList(@Param("userCondition") User userCondition, @Param("rowIndex") int rowIndex,
@Param("pageSize") int pageSize);
UserDao.xml
dao层的带条件分页查询用到了mybatis的动态sql,对动态sql不熟悉的请参考:mybatis笔记整理
养成良好习惯,写完dao应该做个Junit测试:
BaseTest.java
/**
* 初始化spring各项配置的
* @author zhu
*
*/
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration({"classpath:spring/spring-dao.xml","classpath:spring/spring-service.xml"})
public class BaseTest {
}
注意:BaseTest.java是用来加载spring配置文件的。
UserDaoTest.java
public class UserDaoTest extends BaseTest {
@Autowired
private UserDao userDao;
@Test
public void testQueryUserList() {
User userCondition = new User();
/*Card c = new Card();
c.setCardId(2);
userCondition.setCard(c);*/
//userCondition.setAge(22);
userCondition.setUserName("菲");
List ul = userDao.queryUserList(userCondition, 1, 99);
for(User user : ul) {
System.out.println(user.getUserName());
/*List list = new ArrayList<>();
list = user.getMobilePhone();
for(MobilePhone mp : list) {
System.out.println(mp.getBrand());
}*/
}
}
}
userCondition设置了userName一个"菲"字,就是模糊查询名字中带"菲"字的用户。
先看数据库表中的数据:
数据表中名字带"菲"字的用户只有"刘亦菲",正常运行的话应该输出"刘亦菲"。
再看运行结果:
在控制台输出了"刘亦菲",符合预期,测试通过。
4、service层:
UserService.java
public interface UserService {
/**
* 带条件分页查询:
* 可输入的条件:名字(模糊),cardId,age,
* @param userCondition 把条件封装成一个user对象
* @param rowIndex 表示从第几行开始取数据
* @param pageSize 表示要返回多少行数据
* @return 返回user列表
/
List queryUserList(@Param("userCondition") User userCondition, @Param("rowIndex") int rowIndex,
@Param("pageSize") int pageSize);
}
UserServiceImpl.java
@Service
public class UserServiceImpl implements UserService {
@Autowired
private UserDao userDao;
@Override
public List queryUserList(User userCondition, int rowIndex, int pageSize) {
// TODO Auto-generated method stub
return userDao.queryUserList(userCondition, rowIndex, pageSize);
}
}
由于service层只是简单的调用了dao层,这里不再做Junit测试。
5、controller层:
UserController.java
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@RequestMapping(value = "/listusers", method = RequestMethod.GET)
@ResponseBody
public Map listUsers() {
Map modelMap = new HashMap<>();
User userCondition = new User();
List userList = userService.queryUserList(userCondition, 1, 99);
modelMap.put("userList", userList);
return modelMap;
}
}
至此,已完成所有代码。接下来,在浏览器输入:
localhost:8080/ssm/user/listusers
在页面就可以看到访问结果了:
注意:
图片中有几个值为null,是因为查询UserDao.xml中写查询语句时并没有查这几个字段,自己加上就行了。
总结:
常见问题:
1、做测试的时候一定要在BaseTest中加载spring 配置文件,其他test在继承BaseTest。
2、一定不要忘记web.xml中的配置,且路径一定要写对,否则web容器加载不到spring 配置文件,访问controller时会报404错误。
3、由于tb_user中的card_id作为外键关联了tb_card,所以为user设置card时,cardId一定得是tb_card中存在的,否则会报错,user_id也是tb_mobile_phone的外键,同样的道理。