看了好几天的Spring和Mybatis了,现在试着写一个基于SSM(Spring,SpringMVC,Mybtis)的小例子。
写在前面:
例子比较简单:从浏览器发出一个请求,由DispatcherServle进行拦截,交给对应处理器进行处理(controller),接着调用service层方法进行具体的业务逻辑处理,期间会用到数据库中的数据,因此会通过dao层与数据库进行交互,与数据库交互借助于Mybatis框架进行。
项目的结构如图所示:
下面介绍具体步骤:
1在Spring框架中配置Mybatis
首先创建一个properties文件,用于存放数据库连接信息:
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.username=root
jdbc.password=root
在Spring配置文件中配置数据库连接信息,并指定Mybatis配置文件:
<!--spring-dao.xml-->
<!--加载外部的配置文件 -->
<context:property-placeholder location="classpath:properties/connection.properties" />
<bean id="datasource" class="org.apache.commons.dbcp2.BasicDataSource" destroy-method="close"
p:driverClassName="${jdbc.driver}"
p:url="${jdbc.url}"
p:username="${jdbc.username}"
p:password="${jdbc.password}" />
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"
p:dataSource-ref="datasource"
<!--指定Mybatis配置文件-->
p:configLocation="classpath:mybatis/mybatis-conf.xml"/>
<bean id="sessionTemplate" class="org.mybatis.spring.SqlSessionTemplate">
<constructor-arg ref="sqlSessionFactory" />
</bean>
2配置Mybatis
由于数据连接信息已经在spring配置文件中配置过了,所有mybatis配置文件中无须再次配置,只需要在配置文件中指定mybatis映射文件即可(当然,需要需要进行额外配置如等等,还是可以进行配置,本例比较简单,没有额外配置信息)
<configuration>
<mappers>
<mapper resource="mybatis/mapping/sql.xml" />
</mappers>
</configuration>
配置mybatis映射文件,在mybatis映射文件中,主要预定义Sql语句,本例子中仅定义一条sql语句,如下所示:
<!--主要namespace不可少-->
<mapper namespace="mybatis.mapping.sql" >
<select id="select" parameterType="String" resultType="com.guluo.user.User">
SELECT * FROM user WHERE name=#{name};
</select>
</mapper>
3 业务逻辑处理
首先定义个处理器,用于对对应请求进行处理,这里讲拦截器拦截到的/user/login.html交给处理器中的login方法进行处理:
@Controller
@RequestMapping(value = "/user")
public class RequestController {
@Autowired
private LoginService loginService;
@RequestMapping(value = "/login")
public void login(User user){
System.out.println("正在执行controller方法");
if(loginService.isSuccess(user)){
System.out.println("登录成功");
}else {
System.out.println("登录失败");
}
}
}
User类比较简单,就是一个java bean,仅仅定义了id,name,age三个元素,与数据库中的表user对应。
在处理请求过程中中,会调用service层的方法进行具体的业务逻辑处理:
@Service
public class LoginService {
@Autowired
private SelectUser selectUser;
public boolean isSuccess(User user){
System.out.println("service:正在处理业务逻辑!!!");
User user_database = selectUser.select(user.getName());
if(user_database == null){
return false;
}else{
return true;
}
}
}
在service层处理具体业务逻辑时,需要数据库中的数据信息,因此,需要调用dao层的方法。
@Service("select")
public class SelectUser {
@Autowired
private SqlSessionTemplate sqlSessionTemplate;
public User select(String name){
System.out.println("正在与数据库进行交互");
return sqlSessionTemplate.selectOne("mybatis.mapping.sql.select",name);
}
}
因为controller、service、dao都是通过注解进行定义的,因此需要在spring配置文件中,对这些通过注解定义的bean进行扫描,以便于在spring容器中产生对应的bean:
<!--spring-dao.xml-->
<context:component-scan base-package="com.guluo.dao" />
<!--spring-service.xml-->
<context:component-scan base-package="com.guluo.service" />
<!--spring-view.xml-->
<context:component-scan base-package="com.guluo.control" />
4配置视图解析器
<!--spring-view.xml-->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/view/"
p:suffix=".jsp" />
ps:实际上,在本例子中,我没有定义视图层的元素,通过在控制台中输出数据,来进行验证的。
5修改web.xml文件
配置拦截器,以及配置在容器启动时,去指定位置加载spring配置文件,如下:
<servlet>
<servlet-name>ssm</servlet-name>
<!--配置拦截器-->
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<!--去指定位置加载spring配置文件-->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring/*</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>ssm</servlet-name>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
6 验证
将工程部署到Tomcat上,在浏览器中输入localhost:8080/user/login.html?name=guluo&&age=24,控制台中会出现如下结果:
正在执行controller方法
service:正在处理业务逻辑!!!
正在与数据库进行交互
登录成功
结束