maven+mybatis+spring+springmvc整合

来源:互联网 发布:恒大淘宝组织架构 编辑:程序博客网 时间:2024/05/21 19:23

1      使用技术

项目构建采用maven,持久层使用mybatis实现,业务层采用spring,控制层采用springmvc、

 

1.1    需求

实现用户列表,从mysql数据库查询用户信息,并且添加用户信息。

 

1.2    导入数据库

先导入sql_table.sql,再导入 sql_data.sql脚本:

 

1.3    创建maven项目:ssm

 

1.4    Dao(搭建mybatis)

1.4.1  pom中添加所需依赖

 

<project xmlns="http://maven.apache.org/POM/4.0.0"

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0http://maven.apache.org/xsd/maven-4.0.0.xsd">

 <modelVersion>4.0.0</modelVersion>

 <groupId>com.lanqiao</groupId>

 <artifactId>ssm</artifactId>

 <version>0.0.1-SNAPSHOT</version>

 <packaging>war</packaging>

 

 <!-- 属性配置 -->

 <properties>

                <mybatis.version>3.4.4</mybatis.version>

                <junit.version>4.12</junit.version>

                <log4j.version>1.2.17</log4j.version>

                <mysql.version>5.1.38</mysql.version>

               

         </properties>

 

 <dependencies>

                <!-- ==========mybatis相关依赖=====-->

 

                   <!--mybatis -->

                   <dependency>

                            <groupId>org.mybatis</groupId>

                            <artifactId>mybatis</artifactId>

                            <version>${mybatis.version}</version>

                   </dependency>

 

                   <!--junit依赖 -->

                   <dependency>

                            <groupId>junit</groupId>

                            <artifactId>junit</artifactId>

                            <version>${junit.version}</version>

                            <scope>test</scope>

                   </dependency>

 

                   <!--log4j依赖 -->

                   <dependency>

                            <groupId>log4j</groupId>

                            <artifactId>log4j</artifactId>

                            <version>${log4j.version}</version>

                   </dependency>

 

                   <!--mysql依赖 -->

                   <dependency>

                            <groupId>mysql</groupId>

                            <artifactId>mysql-connector-java</artifactId>

                            <version>${mysql.version}</version>

                   </dependency>

         </dependencies>

 

</project>

 

1.4.2  创建po类

public class User implements Serializable {

         privateint id;

         privateString username;// 用户姓名

         privateString sex;// 性别

         privateDate birthday;// 生日

         privateString address;// 地址

}

 

 

1.4.3  创建UserMapper接口

public interface UserMapper {

         //通过ID查询用户对象

         publicUser findUserById(int id);

         //添加用户

         publicvoid insertUser(User user);

}

1.4.4  创建UserMapper.xmp

<?xml version="1.0"encoding="UTF-8" ?>

<!DOCTYPE mapper

 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"

 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mappernamespace="com.lanqiao.mapper.UserMapper">

         <!--1、查询 -->

         <selectid="findUserById" parameterType="int"resultType="user">

                   select* from user where id=#{id}

         </select>

         <!--2、添加 -->

         <insertid="insertUser" parameterType="user">

                   <!--2-1:添加主键:指定主键的生成策略-->

                   <selectKeykeyProperty="id" resultType="java.lang.Integer">

                            selectLAST_INSERT_ID()

                   </selectKey>

                   <!--2-2:添加其它 -->

                    insert intouser(username,birthday,sex,address)

            values(#{username},#{birthday},#{sex},#{address})

         </insert>

</mapper>

 

1.4.5  db.properties

jdbc.driver=com.mysql.jdbc.Driver

jdbc.url=jdbc:mysql://localhost:3306/mybatis?useUnicode=true&characterEncoding=UTF-8

jdbc.username=root

jdbc.password=root

 

1.4.6  log4j.properties

log4j.rootLogger=DEBUG,Console,File

 

##\u63A7\u5236\u53F0\u65E5\u5FD7

log4j.appender.Console=org.apache.log4j.ConsoleAppender

log4j.appender.Console.Target=System.out

log4j.appender.Console.layout=org.apache.log4j.PatternLayout

log4j.appender.Console.layout.ConversionPattern=[%p][%t][%d{yyyy-MM-ddHH\:mm\:ss}][%C] - %m%n

#

##\u666E\u901A\u6587\u4EF6\u65E5\u5FD7

log4j.appender.File=org.apache.log4j.RollingFileAppender

#\u6587\u4EF6\u5B58\u50A8\u4F4D\u7F6E

log4j.appender.File.File=d:/log.log

log4j.appender.File.MaxFileSize=10MB

#\u8F93\u51FA\u65E5\u5FD7\uFF0C\u5982\u679C\u6362\u6210DEBUG\u8868\u793A\u8F93\u51FADEBUG\u4EE5\u4E0A\u7EA7\u522B\u65E5\u5FD7

log4j.appender.File.Threshold=ALL

log4j.appender.File.layout=org.apache.log4j.PatternLayout

log4j.appender.File.layout.ConversionPattern=[%p][%t][%d{yyyy-MM-ddHH\:mm\:ss}][%C] - %m%n

 

#mybatis\u65E5\u5FD7\u914D\u7F6E\u4FE1\u606F

log4j.logger.java.sql.ResultSet=DEBUG

log4j.logger.org.apache=DEBUG

log4j.logger.java.sql.Connection=DEBUG

log4j.logger.java.sql.Statement=DEBUG

log4j.logger.java.sql.PreparedStatement=DEBUG

1.4.7  SqlMapConfig.xml

 

在classpath下创建mybatis/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>

         <!--添加属性 -->

         <propertiesresource="db.properties" />

         <!--设置全局属性配置 -->

         <settings>

                   <settingname="lazyLoadingEnabled" value="true" />

                   <settingname="aggressiveLazyLoading" value="false" />

                   <!--打开了二级缓存 -->

                   <settingname="cacheEnabled" value="true"/>

         </settings>

         <!--配置别名 -->

         <typeAliases>

                   <!--给某个包下所有的对象做别名,别名就是当前类的本身,跳过大小的 -->

                   <packagename="com.lanqiao.po" />

         </typeAliases>

         <environmentsdefault="development">

                   <environmentid="development">

                            <!--配置jdbc的实现 -->

                            <transactionManagertype="JDBC" />

                            <!--配置数据源 -->

                            <dataSourcetype="POOLED">

                                     <propertyname="driver" value="${jdbc.driver}" />

                                     <propertyname="url" value="${jdbc.url}" />

                                     <propertyname="username" value="${jdbc.username}" />

                                     <propertyname="password" value="${jdbc.password}" />

                            </dataSource>

                   </environment>

         </environments>

         <!--加载map的映射文件 -->

         <mappers>

                   <!--加载User.xml文件 -->

                   <packagename="com.lanqiao.mapper" />

         </mappers>

</configuration>

 

1.4.8  创建MybatisTest测试类

public class MybatisTest {

         privateSqlSessionFactory sqlSessionFactory;

         privateUserMapper userDao;

         @Before

         publicvoid createSqlSessionFactory(){

                   try{

                            //1、加载SqlMapConfig.xml文件,同时执行里面的内容

                            Stringresources = "SqlMapConfig.xml";

                            sqlSessionFactory= newSqlSessionFactoryBuilder().build(Resources.getResourceAsReader(resources));

                            System.out.println("sqlSessionFactory:"+sqlSessionFactory);

                  

                   }catch (Exception e) {

                            e.printStackTrace();

                   }

         }

        

         /**

          * 1、通过id查询用户对象

          */

         @Test

         publicvoid testFindUserById(){

                   //创建了第一个sqlsession

                   SqlSessionsession = sqlSessionFactory.openSession();

                   UserMapperuserMapper = session.getMapper(UserMapper.class);

                   //第一次查询,内存中是没有缓冲数据,则会去数据库中执行查询,因此我们会看到操作数据库的代码

                   Useruser = userMapper.findUserById(10);

                   System.out.println(user);

                   session.close();

         }

         /**

          * 2、添加用户对象

          */

         @Test

         publicvoid testInsertUser(){

                   //创建了第一个sqlsession

                   SqlSessionsession = sqlSessionFactory.openSession();

                   UserMapperuserMapper = session.getMapper(UserMapper.class);

                   //第一次查询,内存中是没有缓冲数据,则会去数据库中执行查询,因此我们会看到操作数据库的代码

                   Useruser = new User();

                   user.setAddress("上海");

                   user.setBirthday(newDate());

                   user.setSex("男");

                   user.setUsername("张四5");

                   userMapper.insertUser(user);

                   session.commit();

                   session.close();

         }

        

}

 

1.5    Service(搭建spring)

1.5.1       修改pom对spring相关依赖

<sping.version>4.2.5.RELEASE</sping.version>

<mybatis-spring.version>1.3.0</mybatis-spring.version>

<commons-dbcp>1.4</commons-dbcp>

 

<!-- ===========spring相关依赖===============-->

                   <!--spring与mybatis整合依赖 -->

                   <dependency>

                            <groupId>org.mybatis</groupId>

                            <artifactId>mybatis-spring</artifactId>

                            <version>${mybatis-spring.version}</version>

                   </dependency>

                  

                   <!--添加spring aop依赖 -->

                   <dependency>

                            <groupId>org.springframework</groupId>

                            <artifactId>spring-aop</artifactId>

                            <version>${sping.version}</version>

                   </dependency>

                   <!--spring 事务管理 -->

                   <dependency>

                            <groupId>org.springframework</groupId>

                            <artifactId>spring-tx</artifactId>

                            <version>${sping.version}</version>

                   </dependency>

                   <!--spring jdbc -->

                   <dependency>

                            <groupId>org.springframework</groupId>

                            <artifactId>spring-jdbc</artifactId>

                            <version>${sping.version}</version>

                   </dependency>

 

                   <!--添加springaspects依赖 -->

                   <dependency>

                            <groupId>org.springframework</groupId>

                            <artifactId>spring-aspects</artifactId>

                            <version>${sping.version}</version>

                   </dependency>

                   <!--配置spring测试 -->

                   <dependency>

                            <groupId>org.springframework</groupId>

                            <artifactId>spring-test</artifactId>

                            <version>${sping.version}</version>

                   </dependency>

 

                   <!--添加spring的核心依赖库core-->

                   <dependency>

                            <groupId>org.springframework</groupId>

                            <artifactId>spring-core</artifactId>

                            <version>${sping.version}</version>

                   </dependency>

                   <!--添加spring的核心依赖库beans-->

                   <dependency>

                            <groupId>org.springframework</groupId>

                            <artifactId>spring-beans</artifactId>

                            <version>${sping.version}</version>

                   </dependency>

                   <!--添加spring的核心依赖库context-->

                   <dependency>

                            <groupId>org.springframework</groupId>

                            <artifactId>spring-context</artifactId>

                            <version>${sping.version}</version>

                   </dependency>

                   <!--dbcp -->

                   <dependency>

                            <groupId>commons-dbcp</groupId>

                            <artifactId>commons-dbcp</artifactId>

                            <version>${commons-dbcp}</version>

                   </dependency>

1.5.2  创建UserService接口

public interface UserService {

         //通过ID查询用户对象

         publicUser findUserById(int id);

         //添加用户

         publicvoid insertUser(User user);

}

 

1.5.3  创建UserServiceImpl实现类

@Service("userServiceImpl")

public class UserServiceImpl implementsUserService {

         @Resource

         privateUserMapper userMapper;

         //通过ID查询用户对象

         @Override

         publicUser findUserById(int id) {

                   //TODO Auto-generated method stub

                   returnuserMapper.findUserById(id);

         }

         //添加用户

         @Override

         publicvoid insertUser(User user) {

                   userMapper.insertUser(user);

         }

}

 

1.5.4  创建applicationContext-service.xml

 

<?xml version="1.0"encoding="UTF-8"?>

<beansxmlns="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"

         xmlns:aop="http://www.springframework.org/schema/aop"

         xsi:schemaLocation="http://www.springframework.org/schema/beans

         http://www.springframework.org/schema/beans/spring-beans-4.0.xsd

         http://www.springframework.org/schema/mvc

         http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd

         http://www.springframework.org/schema/context

         http://www.springframework.org/schema/context/spring-context-4.0.xsd

         http://www.springframework.org/schema/aop

         http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">

        

         <!--开启组件扫描service -->

         <context:component-scanbase-package="com.lanqiao.service" />

 

</beans>

 

1.5.5  创建applicationContext-dao.xml

 

1、加载db配置文件     2、数据库连接池  3、spring管理sqlsessionfactory   4、mapper扫描器

 

 

<?xml version="1.0"encoding="UTF-8"?>

<beansxmlns="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"xmlns:aop="http://www.springframework.org/schema/aop"

         xsi:schemaLocation="http://www.springframework.org/schema/beans

         http://www.springframework.org/schema/beans/spring-beans-4.0.xsd

         http://www.springframework.org/schema/mvc

         http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd

         http://www.springframework.org/schema/context

         http://www.springframework.org/schema/context/spring-context-4.0.xsd

         http://www.springframework.org/schema/aop

         http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">

 

         <!--1、加载db配置文件 -->

         <context:property-placeholderlocation="classpath:db.properties" />

 

         <!--2、数据库连接池 -->

         <beanid="dataSource"class="org.apache.commons.dbcp.BasicDataSource"

                   destroy-method="close">

                   <propertyname="driverClassName" value="${jdbc.driver}" />

                   <propertyname="url" value="${jdbc.url}" />

                   <propertyname="username" value="${jdbc.username}" />

                   <propertyname="password" value="${jdbc.password}" />

                   <propertyname="maxActive" value="30" />

                   <propertyname="maxIdle" value="5" />

                   <propertyname="defaultAutoCommit" value="false"/>

         </bean>

 

         <!--3、spring管理sqlsessionfactory -->

         <beanid="sqlSessionFactory"class="org.mybatis.spring.SqlSessionFactoryBean">

                   <propertyname="dataSource" ref="dataSource" />

                   <propertyname="typeAliasesPackage" value="com.lanqiao.po" />

         </bean>

 

         <!--4、mapper扫描器 -->

         <beanclass="org.mybatis.spring.mapper.MapperScannerConfigurer">

                   <propertyname="basePackage" value="com.lanqiao.mapper" />

                  <propertyname="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>

         </bean>

</beans>

 

1.5.6  创建MybatisSpringTest测试类

@RunWith(SpringJUnit4ClassRunner.class)

@ContextConfiguration(locations={"classpath*:/applicationContext-dao.xml","classpath*:/applicationContext-service.xml"})

public class MybatisSpringTest {

         @Resource

         UserServiceuserServiceImpl;

         @Test

         publicvoid testFindUser() {

                   Useruser = userServiceImpl.findUserById(10);

                   System.out.println(user.getUsername());

         }

         @Test

         publicvoid testInserUser() {

                   Useruser = new User();

                   user.setAddress("上海");

                   user.setBirthday(newDate());

                   user.setSex("男");

                   user.setUsername("张四5");

                   userServiceImpl.insertUser(user);

         }

}

 

1.5.7  存在问题

mybatis-spring采用的是编码式事务实现了事务的自动提交,但无法回滚,后续使用声明式事物解决

 

实验:

public void insertUser(User user) {

                   userMapper.insertUser(user);

                   thrownew NullPointerException();//此处有异常

}

 

观察结果:数据库依然插入了数据,并没有回滚

 

1.5.8  创建applicationContext-transaction.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"xmlns:mvc="http://www.springframework.org/schema/mvc"

         xmlns:aop="http://www.springframework.org/schema/aop"

         xsi:schemaLocation="http://www.springframework.org/schema/beans

         http://www.springframework.org/schema/beans/spring-beans-4.0.xsd

         http://www.springframework.org/schema/mvc

         http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd

         http://www.springframework.org/schema/context

         http://www.springframework.org/schema/context/spring-context-4.0.xsd

         http://www.springframework.org/schema/tx

         http://www.springframework.org/schema/tx/spring-tx-4.0.xsd

         http://www.springframework.org/schema/aop

         http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">

 

         <!--事务管理器 -->

         <beanid="transactionManager"

                   class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

                  <!-- 数据源 -->

                   <propertyname="dataSource" ref="dataSource" />

         </bean>

 

         <!--通知 -->

         <tx:adviceid="txAdvice" transaction-manager="transactionManager">

                   <tx:attributes>

                            <!--传播行为 -->

                            <tx:methodname="save*" propagation="REQUIRED" />

                            <tx:methodname="insert*" propagation="REQUIRED" />

                            <tx:methodname="delete*" propagation="REQUIRED" />

                            <tx:methodname="update*" propagation="REQUIRED" />

                            <tx:methodname="find*" propagation="SUPPORTS"read-only="true" />

                            <tx:methodname="get*" propagation="SUPPORTS"read-only="true" />

                   </tx:attributes>

         </tx:advice>

 

         <!--切面 -->

         <aop:config>

                   <aop:advisoradvice-ref="txAdvice"

                            pointcut="execution(*com.lanqiao.service.impl.*.*(..))" />

         </aop:config>

 

</beans>

 

1.5.9  修改测试类

@ContextConfiguration(locations={"classpath*:/applicationContext-dao.xml","classpath*:/applicationContext-service.xml","classpath*:/applicationContext-transaction.xml"})

 

1.6    Action(搭建springmvc)

1.6.1  修改pom对spring相关依赖

                   <jstl.version>1.2</jstl.version>

                   <standard.version>1.1.2</standard.version>

                   <servlet.version>3.1.0</servlet.version>

 

<!-- ===========springmvc相关依赖===============-->

                   <!--配置jstl标签 -->

                   <dependency>

                            <groupId>jstl</groupId>

                            <artifactId>jstl</artifactId>

                            <version>${jstl.version}</version>

                   </dependency>

                  <!-- 配置jstls标准标签库 -->

                   <dependency>

                            <groupId>taglibs</groupId>

                            <artifactId>standard</artifactId>

                            <version>${standard.version}</version>

                   </dependency>

                   <!--配置servlet -->

                   <dependency>

                            <groupId>javax.servlet</groupId>

                            <artifactId>javax.servlet-api</artifactId>

                            <version>${servlet.version}</version>

                            <scope>provided</scope>

                   </dependency>

                   <!--配置spring-mvc依赖 -->

                   <dependency>

                            <groupId>org.springframework</groupId>

                            <artifactId>spring-webmvc</artifactId>

                            <version>${sping.version}</version>

                   </dependency>

 

 

 

 

 

1.6.2  创建UserController

@Controller

public classUserController {

      @Autowired

      private UserService userService;

      @RequestMapping("/queryUser.action")

      public ModelAndView queryUser(){

               System.out.println("wwwwwwwwwwwwwwwwwwwwwwwww:"+userService);

               User user =userService.findUserById(10);

              

               ModelAndView model = newModelAndView();

               model.addObject("user",user);

               model.setViewName("user.jsp");

               return model;

      }

}

 

1.6.3  创建springmvc.xml

<?xml version="1.0" encoding="UTF-8"?>

<beansxmlns="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"

         xmlns:aop="http://www.springframework.org/schema/aop"

         xsi:schemaLocation="http://www.springframework.org/schema/beans

         http://www.springframework.org/schema/beans/spring-beans-4.0.xsd

         http://www.springframework.org/schema/mvc

         http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd

         http://www.springframework.org/schema/context

         http://www.springframework.org/schema/context/spring-context-4.0.xsd

         http://www.springframework.org/schema/aop

         http://www.springframework.org/schema/aop/spring-aop-4.0.xsd">

        

         <!--扫描指定包下的组件 -->

         <context:component-scanbase-package="com.lanqiao.controller"/>

</beans>

1.6.4  配置web.xml

 

         <!--加载spring容器 -->

         <context-param>

                   <param-name>contextConfigLocation</param-name>

                   <param-value>classpath:/applicationContext-*.xml</param-value>

         </context-param>

 

         <!--spring监听器 -->

         <listener>

                   <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>

         </listener>

 

         <!--解决post乱码 -->

         <filter>

                   <filter-name>CharacterEncodingFilter</filter-name>

                   <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

                   <init-param>

                            <param-name>encoding</param-name>

                            <param-value>utf-8</param-value>

                   </init-param>

         </filter>

         <filter-mapping>

                   <filter-name>CharacterEncodingFilter</filter-name>

                   <url-pattern>/*</url-pattern>

         </filter-mapping>

 

 

         <!--springmvc的前端控制器 -->

         <servlet>

                   <servlet-name>springmvc</servlet-name>

                   <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>

                   <!--contextConfigLocation不是必须的,如果不配置contextConfigLocation, springmvc的配置文件默认在:WEB-INF/servlet的name+"-servlet.xml" -->

                   <init-param>

                            <param-name>contextConfigLocation</param-name>

                            <param-value>classpath:springmvc.xml</param-value>

                   </init-param>

                   <load-on-startup>1</load-on-startup>

         </servlet>

         <servlet-mapping>

                   <servlet-name>springmvc</servlet-name>

                   <url-pattern>*.action</url-pattern>

         </servlet-mapping>

 

         <welcome-file-list>

                   <welcome-file>index.html</welcome-file>

                   <welcome-file>index.htm</welcome-file>

                   <welcome-file>index.jsp</welcome-file>

                   <welcome-file>default.html</welcome-file>

                   <welcome-file>default.htm</welcome-file>

                   <welcome-file>default.jsp</welcome-file>

         </welcome-file-list>

 

1.7    测试

http://localhost:8089//ssm/queryUser.action