【Spring in action】Spring、SpringMVC、Mybatis,Mysql使用详解。github源码地址。
一、前言:
本来打算先把SSH结合Mysql数据库的文章写一下。但是公司的项目写业务都是通过SSM。所以那就趁此机会学习一下SSM结合使用吧。本文并没有使用maven,而是直接导入jar包,下篇文章再写Maven。
二、准备工作(jar包,可以去我的github下载):
mysql-connector-java-5.1.18-bin.jarspring-aop-4.3.0.RELEASE.jar
aopalliance-1.0.jar spring-aspects-4.3.0.RELEASE.jar
aspectjweaver-1.8.9.jar spring-beans-4.3.0.RELEASE.jar
c3p0-0.9.5.2.jar spring-context-4.3.0.RELEASE.jar
commons-dbutils-1.6.jar spring-core-4.3.0.RELEASE.jar
commons-logging-1.1.1.jar spring-expression-4.3.0.RELEASE.jar
commons-pool2-2.4.2.jar spring-jdbc-4.3.0.RELEASE.jar
fastjson-1.1.38.jar spring-tx-4.3.0.RELEASE.jar
mchange-commons-java-0.2.11.jar spring-web-4.3.0.RELEASE.jar
mybatis-3.3.0.jar spring-webmvc-4.3.0.RELEASE.jar
mybatis-spring-1.1.1.jar
三、搭建一个SSM项目:
1.新建一个web项目:
1)此处为新手准备,所以写的比较详细。可略过。
2)记得勾选此处,如果这个时候忘了,那么也可以通过项目右键见下面的第二张图(除非使用注解模式代替web.xml创建项目,至少目前完全通过注解模式比较少见):
2、结合SpringMVC:
1)在web.xml中配置DispatchSevlet。配置位置在src下的conf文件夹下,比较优雅。
<!-- 创建分发Servlet -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:conf/springmvc-servlet.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
2)结合SpringMVC:在位置在src下的conf文件夹下新建SpringMVC配置文件。
springmvc-servlet.xml这个文件名命名并不是随便乱命名的,是通过1)中的servlet-name(springmvc)配置的。当然如果不使用默认位置,而是像我一般指定在src下的conf文件夹下倒是无所谓了。springmvc-servlet.xml代码如下:(其中关注最后一行配置:扫描器的地址com.controller)
<?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/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
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-4.3.xsd">
<!-- 配置handlerMapping -->
<bean class="org.springframework.web.servlet.mvc.support.ControllerBeanNameHandlerMapping"></bean>
<!-- 配置视图解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- 前缀 :说明如果直接放在web-inf下,不需要加前缀-->
<property name="prefix" value="WEB-INF/views/"></property>
<!-- 后缀 : -->
<property name="suffix" value=".jsp"></property>
</bean>
<!-- 加入注解驱动 -->
<mvc:annotation-driven></mvc:annotation-driven>
<!-- 扫描器 -->
<context:component-scan base-package="com.controller"></context:component-scan>
</beans>
3)测试SpringMVC。
新建一个Model对象User:
package com.model;
import java.io.Serializable;
public class User implements Serializable{
private String name;
private String addr;
public User() {
super();
}
public User(String name, String addr) {
super();
this.name = name;
this.addr = addr;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
}
写一个Controller:(此处我是直接通过Controller返回了一个String给app提供一个json,正和我之前一直做android相互配合)
package com.controller;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.alibaba.fastjson.JSONObject;
import com.model.User;
@Controller
public class HelloController {
//返回到index.jsp
@RequestMapping(value="/hello.do")
public void hello(HttpServletResponse response) throws IOException{
response.getWriter().write(JSONObject.toJSONString(new User("hbfaith","changsha")).toString());;
}
}
测试run as /run on server。
3、结合Spring:
1)在web.xml中新增配置:(位置指向src下的conf文件夹下新建Spring配置文件)
<!-- 配置Spring1:配置spring-servlet.xml路劲 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:conf/spring.xml</param-value>
</context-param>
<!-- 配置Spring2:配置Spring监听2 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
2)结合Spring:在位置在src下的conf文件夹下新建Spring配置文件。
3)spring.xml代码如下:当前配置为,自动扫描文件夹com下所有
<?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"
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-4.3.xsd">
<context:component-scan base-package="com"></context:component-scan>
</beans>
3)测试spring结合。
在com.model中添加接口Addr:
package com.model;
public interface Addr {
String show();
}
在com.model中添加接口实现AddrImpl:package com.model;
import org.springframework.stereotype.Component;
@Component
public class AddrImpl implements Addr {
@Override
public String show() {
return new User("hbfaith","changsha").getAddr().toString();
}
}
在HelloConroller中添加mapping地址等:
package com.controller;
import java.io.IOException;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import com.alibaba.fastjson.JSONObject;
import com.model.Addr;
import com.model.User;
@Controller
public class HelloController {
@Autowired
private Addr addr;
//返回到index.jsp
@RequestMapping(value="/hello.do")
public void hello(HttpServletResponse response) throws IOException{
response.getWriter().write(JSONObject.toJSONString(new User("hbfaith","changsha")).toString());;
}
@RequestMapping(value="/spring.do")
public void addrShow(HttpServletResponse response) throws IOException{
response.getWriter().write(JSONObject.toJSONString(addr.show()).toString());;
}
}
测试结果:
4、结合Mybatis:
1)在spring.xml中配置数据库:
首先配置数据库,学习Mybatis就是学习如何使用Mybatis更简单的调用数据库。
<!-- 引入配置文件 -->
<bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="location" value="classpath:conf/jdbc.property" />
</bean>
<bean id="dataSource" class="org.apache.tomcat.dbcp.dbcp2.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${driver}" />
<property name="url" value="${url}" />
<property name="username" value="${username}" />
<property name="password" value="${password}" />
<!-- 初始化连接大小 -->
<property name="initialSize" value="${initialSize}"></property>
<!-- 连接池最大数量 -->
<!-- <property name="maxActive" value="${maxActive}"></property> -->
<!-- 连接池最大空闲 -->
<!-- <property name="maxIdle" value="${maxIdle}"></property> -->
<!-- 连接池最小空闲 -->
<!-- <property name="minIdle" value="${minIdle}"></property> -->
<!-- 获取连接最大等待时间 -->
<!-- <property name="maxWait" value="${maxWait}"></property> -->
</bean>
此处我本地的配置文件是jdbc.property位置依然在位置在src下的conf文件夹下。
driver=org.gjt.mm.mysql.Driver
url=jdbc:mysql://localhost:3306/mybatis
username=root
password=haibo1118
initialSize=5
2)结合Mybatis的使用,Mybatis的使用涉及到几个模块:mapping分发,model模型对象,dao链接数据库层。在com文件夹下新建三个包dao,model,mapping;在spring.xml中配置这几个文件夹。
<!-- spring和MyBatis完美整合,不需要mybatis的配置映射文件 -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!-- 自动扫描mapping.xml文件 -->
<property name="mapperLocations" value="classpath:com/mapping/*.xml"></property>
</bean>
<!-- DAO接口所在包名,Spring会自动查找其下的类 -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.dao" />
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
</bean>
<!-- (事务管理)transaction manager, use JtaTransactionManager for global tx -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
3)快速生成Mybatis的各种类等。通过eclipse插件可实现。
先新建一个配置文件generatorConfig.xml
<?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>
<!-- 数据库驱动-->
<!-- <classPathEntry location="mysql-connector-java-5.1.18-bin.jar"/> -->
<context id="DB2Tables" targetRuntime="MyBatis3">
<commentGenerator>
<property name="suppressDate" value="true"/>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true"/>
</commentGenerator>
<!--数据库链接URL,用户名、密码 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://localhost:3306/mybatis" userId="root" password="haibo1118">
</jdbcConnection>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- 生成模型的包名和位置-->
<javaModelGenerator targetPackage="com.model" targetProject="ssmdemo/src">
<property name="enableSubPackages" value="true"/>
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!-- 生成映射文件的包名和位置-->
<sqlMapGenerator targetPackage="com.mapping" targetProject="ssmdemo/src">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!-- 生成DAO的包名和位置-->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.dao" targetProject="ssmdemo/src">
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!-- 要生成的表 tableName是数据库中的表名或视图名 domainObjectName是实体类名-->
<table tableName="user_t" domainObjectName="UserT" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>
</context>
</generatorConfiguration>
4)右键配置文件,可快速生成以下几个文件。
5)在com下新建一个service文件夹:用来写业务逻辑。提供给controller数据。
package com.service;
import com.model.UserT;
public interface IUserService {
UserT getUserById(int userId);
}
写一个实现impl:
package com.service;
import javax.annotation.Resource;
import org.springframework.stereotype.Service;
import com.dao.UserTMapper;
import com.model.UserT;
@Service("userService")
public class UserServiceImpl implements IUserService{
@Resource
private UserTMapper userDao;
@Override
public UserT getUserById(int userId) {
// TODO Auto-generated method stub
return this.userDao.selectByPrimaryKey(userId);
}
}
5)测试使用:controller中添加访问测试Mybatis是否成功访问。
package com.controller;
import java.io.IOException;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import com.model.Addr;
import com.model.UserT;
import com.service.IUserService;
@Controller
public class HelloController {
@Autowired
private Addr addr;
@Resource
private IUserService userService = null;
@RequestMapping(value="/a.do")
public void addrShow(HttpServletResponse response) throws IOException{
response.getWriter().write(addr.show());;
}
@RequestMapping(value="/getuserbyid.do")
// @ResponseBody
public String getUserById(Model model) {
int userId = 1;
UserT user = this.userService.getUserById(userId);
model.addAttribute("user", user.toString());
// return JSONObject.toJSONString(user);
return "index";
}
}
最后奉上最炫酷的index展示效果:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>${user}</h1>
</body>
</html>
展示如下: