Maven搭建Mybatis-spring-springMVC项目记录

来源:互联网 发布:名校毕业生知乎 编辑:程序博客网 时间:2024/05/19 03:45

本例中用到的jar版本:

 <!-- jar version control start -->  <properties>      <slf4j.version>1.7.24</slf4j.version>      <log4j2.version>2.8.2</log4j2.version>      <junit.version>4.9</junit.version>      <spring.version>4.3.7.RELEASE</spring.version>      <mybatis.version>3.4.5</mybatis.version>   </properties>   <!-- jar version control end -->

搭建Mybatis

在pom.xml中引入Mysql和Mybatis的包

 <!-- MySQL stat -->    <dependency>        <groupId>mysql</groupId>        <artifactId>mysql-connector-java</artifactId>        <version>5.1.38</version>    </dependency>    <!-- MySQL end -->    <!-- Mybatis start-->    <dependency>        <groupId>org.mybatis</groupId>        <artifactId>mybatis</artifactId>        <version>${mybatis.version}</version>    </dependency>    <!-- Mybatis end -->

数据库新建测试表

REATE TABLE test_user(    id int primary key,    name varchar(255) not null,    age int);

在src/test/java/bean中新建TestUser.class

package bean;public class TestUser {    private Integer id;    private String name;    private Integer age;    public String getId(){        return id;    }    public void setId(Integer 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;    }    @Override    public String toString() {        // TODO Auto-generated method stub        return "ID= "+this.getId()+" NAME= "+this.getName()+" AGE= "+this.getAge();    }}

在src/test/java/mapper中新建TestUserMapper.class(这里Mybatis以接口的方式访问数据库,仅测试一个方法)

package mapper;import java.util.List;import bean.TestUser;public interface TestUserMapper {     public List<TestUser> getAllUsers();}

同时在src/test/java/mapper中新建TestUserMapper.xml实现具体操作数据库的方法

<?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" ><mapper namespace="mapper.TestUserMapper" >    <!--id应该是接口中的方法名字,结果类型如没有配置别名则应该使用全名称 -->    <select id="getAllUsers" resultType="bean.TestUser">        select * from test_user    </select></mapper>

在src/test/resources中引入Mybatis总配置文件:mybatis-config.xml
(db.properties文件位于同目录下,记录了数据库连接的基本配置信息)

<?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>    <!-- 指定数据库连接信息的位置 -->    <properties resource="db.properties"></properties>    <!--类型别名,如果此处没配置,那么mapper.xml中的resultType就要用全名 -->    <!-- <typeAliases>        <package name=""/>    </typeAliases>     -->        <environments default="mysql">        <environment id="mysql">            <transactionManager type="JDBC" />            <dataSource type="POOLED">                <property name="driver" value="${mysql_driver}" />                <property name="url" value="${mysql_url}" />                <property name="username" value="${mysql_username}" />                <property name="password" value="${mysql_password}" />            </dataSource>        </environment>    </environments>    <!-- 每个mapper.xml文件都要被注册 -->    <mappers>        <mapper resource="mapper/TestUserMapper.xml" />    </mappers></configuration>

在src/test/jaca/manager中新建TestUserManager测试Mybatis

package manager;import java.io.InputStream;import java.util.List;import mapper.TestUserMapper;import org.apache.ibatis.session.SqlSession;import org.apache.ibatis.session.SqlSessionFactory;import org.apache.ibatis.session.SqlSessionFactoryBuilder;import org.junit.Test;import bean.TestUser;//手动加载mybatispublic class TestUserManager {    private static SqlSessionFactory factory=null;    public static SqlSessionFactory getSqlSessionFactory(){        if(factory==null){        // 获得环境配置文件流        InputStream config = TestUserManager.class.getClassLoader()        .getResourceAsStream("mybatis-config.xml");        // 创建sql会话工厂        factory = new SqlSessionFactoryBuilder().build(config);        }        return factory;    }    //获得会话    public static SqlSession getSession(){        return getSqlSessionFactory().openSession(true);    }    /**     * 获得得sql会话     * @param isAutoCommit 是否自动提交,如果为false则需要sqlSession.commit();rollback();     * @return sql会话     */    public static SqlSession getSession(boolean isAutoCommit){        return getSqlSessionFactory().openSession(isAutoCommit);    }    @Test    public void testMapperInterface(){        //获得会话对象        SqlSession session=getSession();        try {            //通过MyBatis实现接口BookTypeDAO,返回实例            TestUserMapper testUserMapper =session.getMapper(TestUserMapper.class);            List<TestUser> userList = testUserMapper.getAllUsers();            for(TestUser user: userList){                System.err.println(user.toString());            }        } finally {            session.close();        }    }}   

运行Junit测试:
这里写图片描述

Mybatis引入成功后,Junit测试中出现错误“ERROR StatusLogger No log4j2 configuration file found. Using default configuration: logging only errors to the console.”
原因是日志记录器没有找到log4j2的配置文件。
(log4j和log4j2有所不同,log4j配置是.properties,log4j是.xml)
pom.xml配置:

<!-- Log4j start --><dependency>    <groupId>org.apache.logging.log4j</groupId>    <artifactId>log4j-core</artifactId>    <version>${log4j.version}</version>  </dependency><!-- Log4j end -->

在src/test/resource中新建log4j2.xml:

<?xml version="1.0" encoding="UTF-8"?><Configuration status="off" monitorInterval="1800">        <Appenders>        <Console name="Console" target="SYSTEM_OUT">            <PatternLayout pattern="%d{HH:mm:ss.SSS} [%t] %-5level %logger{36} - %msg%n" />        </Console>            </Appenders>    <Loggers>                    <Root level="debug">            <AppenderRef ref="Console" />        </Root>    </Loggers></Configuration>

配置后再次测试:

这里写图片描述

目前项目目录结构:
这里写图片描述

===================================================

用Mybatis-generator插件

Mybatis成功引入后,考虑采用Mybatis-generator插件自动生成数据库操作接口(该步骤需要对Mybatis的配置进行改动)

在pom.xml中配置Mybatis-generator
a. 引入包mybatis-generator-core

<!-- Mybatis-generator-jar start --><dependency>    <groupId>org.mybatis.generator</groupId>    <artifactId>mybatis-generator-core</artifactId>    <version>1.3.5</version></dependency><!-- Mybatis-generator-jar end -->

b. 配置generator插件(在 这个节点的节点内部加入一个,同时该插件依赖了mysql驱动,mybatis核心,)

<plugin>    <groupId>org.mybatis.generator</groupId>        <artifactId>mybatis-generator-maven-plugin</artifactId>           <version>1.3.2</version>           <executions>              <execution>                 <id>Generate MyBatis Files</id>                 <goals>                    <goal>generate</goal>                 </goals>                 <phase>generate</phase>                 <configuration>                    <verbose>true</verbose>                    <overwrite>true</overwrite>                 </configuration>              </execution>           </executions>           <dependencies>              <dependency>                 <groupId>mysql</groupId>                 <artifactId>mysql-connector-java</artifactId>                 <version>5.1.38</version>              </dependency>              <dependency>                 <groupId>org.mybatis.generator</groupId>                 <artifactId>mybatis-generator-core</artifactId>                 <version>1.3.5</version>              </dependency>              <dependency>                 <groupId>org.mybatis</groupId>                 <artifactId>mybatis</artifactId>                 <version>${mybatis.version}</version>             </dependency>         </dependencies>  </plugin>

在src/test/resource中建立generatorConfig.xml
(1. classPathEntry最好指定mysql-connector-java-5.1.38.jar的绝对路径)
(2. targetProject是从项目名开始,指定到对应的包)

<?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 >    <properties  resource="./db.properties"/>    <classPathEntry location="D:\Apache\apache-maven-3.5.0\repository\mysql\mysql-connector-java\5.1.38\mysql-connector-java-5.1.38.jar" />    <context id="mysqlTables" targetRuntime="MyBatis3">        <!-- 消除插件自动生成的垃圾注释 -->        <commentGenerator>            <property name="suppressAllComments" value="true" />        </commentGenerator>        <jdbcConnection driverClass="com.mysql.jdbc.Driver"            connectionURL="${mysql_url}" userId="${mysql_username}" password="${mysql_password}" />         <!--指定生成的类型为java类型,避免数据库中number等类型字段 -->        <javaTypeResolver>            <property name="forceBigDecimals"  value="false" />        </javaTypeResolver>        <!-- pojo,mapper,mapper.xml等源文件生成的路径 -->        <javaModelGenerator targetPackage="bean" targetProject="categorySystem/src/test/java" />        <sqlMapGenerator targetPackage="mapper" targetProject="categorySystem/src/test/java" />        <javaClientGenerator targetPackage="mapper" targetProject="categorySystem/src/test/java" type="XMLMAPPER" />        <!-- 表信息 -->        <table schema="category_system" tableName="test_user" enableCountByExample="true" enableUpdateByExample="true"             enableDeleteByExample="true" enableSelectByExample="true" selectByExampleQueryId="true">            <generatedKey column="ID" sqlStatement="MySql" identity="true" />        </table>    </context></generatorConfiguration>

右键generatorConfig.xml–>Generator Mybatis/iBatis Artifacts—>运行成功后项目目录:
这里写图片描述

===================================================

整合Spring-Mybatis

需要:Mybatis-Spring/ Spring AOP/ Spring Core/ JDBC
在pom.xml中增加依赖:

<!-- Mybatis-Spring Adapter start-->    <dependency>         <groupId>org.mybatis</groupId>         <artifactId>mybatis-spring</artifactId>         <version>1.3.0</version>    </dependency>    <!-- Mybatis-Spring Adapter end -->        <!-- Spring start-->    <!-- Spring core start -->    <dependency>        <groupId>org.springframework</groupId>        <artifactId>spring-context</artifactId>        <version>${spring.version}</version>    </dependency>    <!-- aspectJ AOP start  -->    <dependency>        <groupId>org.aspectj</groupId>        <artifactId>aspectjweaver</artifactId>        <version>1.8.9</version>    </dependency>    <!-- Spring java jdbc start -->    <dependency>        <groupId>org.springframework</groupId>        <artifactId>spring-jdbc</artifactId>        <version>${spring.version}</version>    </dependency>    <!-- Spring end -->

接着在src/test/resources中新建ApplicationContext.xml,将mybatis-config.xml的配置交由spring托管,托管前mybatis-config.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>    <!-- 指定数据库连接信息的位置 -->    <properties resource="db.properties"></properties>    <!--类型别名,默认引入bean下的所有类 -->    <!-- <typeAliases>        <package name=""/>    </typeAliases> -->        <environments default="mysql">        <environment id="mysql">            <transactionManager type="JDBC" />            <dataSource type="POOLED">                <property name="driver" value="${mysql_driver}" />                <property name="url" value="${mysql_url}" />                <property name="username" value="${mysql_username}" />                <property name="password" value="${mysql_password}" />            </dataSource>        </environment>    </environments>    <mappers>        <mapper resource="mapper/TestUserMapper.xml" />    </mappers></configuration>

开始配置ApplicationContext.xml(配置jdbc数据源/sqlSessionFactory/注册mapper.java)

<?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:p="http://www.springframework.org/schema/p"    xmlns:task="http://www.springframework.org/schema/task" xmlns:context="http://www.springframework.org/schema/context"    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"    xsi:schemaLocation="http://www.springframework.org/schema/task                        http://www.springframework.org/schema/task/spring-task-3.0.xsd                        http://www.springframework.org/schema/context                        http://www.springframework.org/schema/context/spring-context-2.5.xsd                        http://www.springframework.org/schema/aop                        http://www.springframework.org/schema/aop/spring-aop-2.5.xsd                        http://www.springframework.org/schema/beans                        http://www.springframework.org/schema/beans/spring-beans-3.0.xsd                        http://www.springframework.org/schema/beans                        http://www.springframework.org/schema/beans/spring-beans.xsd                        http://www.springframework.org/schema/tx                        http://www.springframework.org/schema/tx/spring-tx.xsd ">   <!-- 1. 指定数据库连接信息的位置 -->    <bean id="propertyConfig"   class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">          <property name="location">              <value>db.properties</value>          </property>      </bean>     <!-- 2. 配置数据源 -->    <bean id="jdbcDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">        <property name="driverClassName" value="${mysql_driver}"></property>        <property name="url" value="${mysql_url}"></property>        <property name="username" value="${mysql_username}"></property>         <property name="password" value="${mysql_password}"></property>     </bean>    <!-- 3. 配置sqlSessionFactory -->    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">        <property name="dataSource" ref="jdbcDataSource" />        <!-- 指向mybatis-config.xml 由spring托管 -->        <property name="configLocation" value="classpath:mybatis-config.xml"></property>    </bean>    <!-- 4. 将mapper交给spring管理 -->    <bean id="testUserMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">        <property name="mapperInterface" value="mapper.TestUserMapper"></property>        <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>    </bean></beans>

注:
配置1,2相当于移植mybatis-config.xml中的节点
配置3相当于之前手动获取mybatis-config.xml:

 // 获得环境配置文件流InputStream config = TestUserManager.class.getClassLoader().getResourceAsStream("mybatis-config.xml");// 创建sql会话工厂factory = new SqlSessionFactoryBuilder().build(config);

配置4相当于之前在mybatis-config.xml中配置的mapper:

<mappers>    <mapper resource="mapper/TestUserMapper.xml" /></mappers>

如果有很多的表,就要对应很多的Mpper.java接口,这样每个都要在Spring中配置就太麻烦了,我们可以一次性指定需要配置的Mapper.java所在的包,默认注册的bean的id就是该接口的类名:

<!-- 4. 将mapper交给spring管理 (映射接口类自动扫描) -->    <!-- <bean id="testUserMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">        <property name="mapperInterface" value="mapper.TestUserMapper"></property>        <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>    </bean> --><bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">     <property name="sqlSessionFactoryBeanName"     value="sqlSessionFactory"></property>  <!-- 指定基础包,即自动扫描mapper这个包以及它的子包下的所有映射接口类 -->     <property name="basePackage" value="mapper"></property> </bean>

我们仍旧在src/test/java/manager/TestUserManager中测试:

@Testpublic void testSpringMybatis(){    /**     *  1. init spring context     *  2. get mapper bean from context     *  3. interact to database through mapper bean     */    ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:ApplicationContext.xml");    TestUserMapper testUserMapper = ctx.getBean("testUserMapper",TestUserMapper.class);    TestUser user = testUserMapper.selectByPrimaryKey(2);    System.out.println(user); }

执行后:

这里写图片描述

此时ApplicationContext.xml是需要手动去加载的,我们可以在web.xml中配置Spring的IOC容器,通过这样的配置,web容器会自动加载applicationcontext.xml初始化:

<listener>    <listener-class>        org.springframework.web.context.ContextLoaderListener    </listener-class></listener><!-- 默认情况下容器会去WEB-INF/applicationContex.xml找不到就会报错 这里重新指定applicationContext.xml的位置 --><context-param>      <param-name>contextConfigLocation</param-name>      <param-value>classpath*:applicationContext.xml</param-value>  </context-param> 

小结:
至此Spring和Mybatis已经整合完成,也说明
Mybatis-config.xml构建sqlSessionFactory的功能也可以由Spring托管了,所以我们可以删除Mybatis-config.xml里面数据源的配置以及的配置;
值得一提的是此时的数据源是使用了Spring自带的数据源 (org.springframework.jdbc.datasource.DriverManagerDataSource)
,该数据源事实上并没有连接池的作用,即每次有连接都会新建一个connection,会造成资源的浪费和多余的程序开销。
如果要更加灵活的配置我们可以使用连接池:
C3P0(com.mchange.v2.c3p0.ComboPooledDataSource)
DBCP(org.apache.commons.dbcp.BasicDataSource)

===================================================

整合SpringMVC-Spring-Mybatis

pom.xml中引入核心包:

   <!-- Spring mvc start -->    <dependency>        <groupId>org.springframework</groupId>        <artifactId>spring-webmvc</artifactId>        <version>${spring.version}</version>    </dependency>    <dependency>        <groupId>org.springframework</groupId>        <artifactId>spring-web</artifactId>        <version>${spring.version}</version>    </dependency>    <dependency>        <groupId>org.springframework</groupId>        <artifactId>spring-orm</artifactId>        <version>${spring.version}</version>    </dependency>    <!-- Spring mvc end -->

在web.xml中注册Springmvc核心控制器

<!-- 2. Spring mvc configuration start -->  <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:spring-mvc.xml</param-value>      </init-param>       <!-- init servlet when context startup-->      <load-on-startup>1</load-on-startup>   </servlet>    <servlet-mapping>        <servlet-name>springmvc</servlet-name>        <url-pattern>/</url-pattern>    </servlet-mapping>  <!-- Spring mvc configuration end -->

在src/test/java/action/中新建TestUserController.java

package action;import mapper.TestUserMapper;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 bean.TestUser;@Controllerpublic class TestUserController {    @Autowired    private TestUserMapper testUserMapper;      @RequestMapping("test/login.do")      // 请求url地址映射,类似Struts的action-mapping    public String testLogin(Model model) {        // @RequestParam是指请求url地址映射中必须含有的参数(除非属性required=false)        // @RequestParam可简写为:@RequestParam("username")        TestUser user = testUserMapper.selectByPrimaryKey(1);        model.addAttribute("user", user);        return "testSuccess";    }}

本例中返回了user信息到/jsp/testSuccess.jsp中,在 src/main/webapp/jsp/中新建testSuccess.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"    pageEncoding="ISO-8859-1"%><!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=ISO-8859-1"><title>Insert title here</title></head><body>    user name:<P> ${user.name}</P>    <br/>    user age<P> ${user.age}</P></body></html>

启动tomcat,访问:http://localhost:8080/categorySystem

这里写图片描述

访问:http://localhost:8080/categorySystem/test/login.do

这里写图片描述

至此Mybatis-Spring-Springmvc已经整合完成,如有错误,请指正~

参考资料:
http://www.cnblogs.com/best/p/5638827.html
http://blog.csdn.net/abcd898989/article/details/51316612
相关工具:
http://mvnrepository.com/

阅读全文
0 0
原创粉丝点击