Maven搭建Mybatis-spring-springMVC項目記錄

本例中用到的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;

//手動加載mybatis
public 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>

若要打印mapper層的sql語句,需要在 Mybatis-config.xml中加入:

<settings>  
    <setting name="logImpl" value="LOG4J2" />  
</settings> 

同時在log4j2.xml的節點中聲明哪些對應的mapper(dao)層需要打印sql:

 <logger name="mapper.catalogmapper" level="debug" additivity="false">  
     <appender-ref ref="Console"/>  
 </logger>

配置後再次測試:

這裏寫圖片描述

目前項目目錄結構:
這裏寫圖片描述

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

用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中測試:

@Test
public 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;

@Controller
public 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/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章