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/

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值