1. 程式人生 > >MyBatis 學習總結 05 Mybatis3.x與Spring3.x整合 OLD

MyBatis 學習總結 05 Mybatis3.x與Spring3.x整合 OLD

into 包括 mybatis 方法 成對 nec 自動化工具 tty red

  本文通過加載mybatis-configuration.xml 文件來產生SqlSessionFactory,然後通過SqlSessionFactory去產生sqlSession,然後在通過 sqlSession對數據庫表所映射的實體類進行增刪改查操作。通過spring的DI和IOC,能產生對象並管理對象的聲明周期,而sprig的AOP也能管理對象的事務。主要有兩點:

1、需要spring通過單例的方式管理 SqlSessionFactory,並用 SqlSessionFactory 去創建 sqlSession
2、持久層的 mapper 需要spring 管理

  本文源碼腳本的下載地址是: http://ovy7j2mnc.bkt.clouddn.com/mybatisSpringPro.rar

1 準備建數據庫和表腳本

DROP database IF EXISTS `myDb2`;

create database myDb2;

use myDb2;DROP TABLE IF EXISTS `User`;
CREATE TABLE `User` ( 
`id` int(11) NOT NULL AUTO_INCREMENT, 
`name` varchar(255) DEFAULT NULL, 
`age` int(11) DEFAULT NULL, 
PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

2 創建工程

  使用Maven創建JAVA工程,名稱為 mybatisSpringPro。

pom.xml的參考內容為:

<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.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.bank</groupId>
  <artifactId>mybatisSpringPro</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <packaging>jar</packaging>

  <name>mybatisSpringPro</name>
  <url>http://maven.apache.org</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <spring.version>3.2.18.RELEASE</spring.version>
    
  </properties>

  <dependencies>
   <!--mysql數據庫驅動 -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.6</version>
        </dependency>
        <!--log4j日誌包 -->
        <dependency>
            <groupId>org.apache.logging.log4j</groupId>
            <artifactId>log4j-core</artifactId>
            <version>2.6.1</version>
        </dependency>
        <!-- mybatis ORM框架 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.1</version>
        </dependency>
        <!-- JUnit單元測試工具 -->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.10</version>
        </dependency>
        <!--mybatis-spring適配器 -->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>1.3.0</version>
        </dependency>
        <!--Spring框架核心庫 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>${spring.version}</version>
        </dependency>
        <!-- aspectJ AOP 織入器 -->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.8.9</version>
        </dependency>
        <!--Spring java數據庫訪問包,在本例中主要用於提供數據源 -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>${spring.version}</version>
        </dependency>

         <!-- 導入dbcp的jar包,用來在applicationContext.xml中配置數據庫 -->  
        <dependency>  
            <groupId>commons-dbcp</groupId>  
            <artifactId>commons-dbcp</artifactId>  
            <version>1.2.2</version>  
        </dependency>  
        
  </dependencies>
  
  
</project>

log4j.properties

log4j.rootLogger=DEBUG, Console 

log4j.appender.Console=org.apache.log4j.ConsoleAppender    
log4j.appender.Console.layout=org.apache.log4j.PatternLayout    
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n      
log4j.logger.java.sql.ResultSet=INFO    
log4j.logger.org.apache=INFO    
log4j.logger.java.sql.Connection=DEBUG    
log4j.logger.java.sql.Statement=DEBUG    
log4j.logger.java.sql.PreparedStatement=DEBUG

3 user表所對應的實體類

新建 User.java

package com.mybatis.pojo;

/**
 * 
 * user表所對應的實體類
 * 
 * */
public class User  
{
    //實體類的屬性和表的字段名稱一一對應
    private int id;
    
    private String username ;
    
    private int age;
    
    public int getId()
    {
        return id;
    }
    public void setId(int id)
    {
        this.id = id;
    }
    public String getUsername()
    {
        return username;
    }
    public void setUsername(String username)
    {
        this.username = username;
    }
    public int getAge()
    {
        return age;
    }
    public void setAge(int age)
    {
        this.age = age;
    }
    @Override
    public String toString()
    {
        return "User [id=" + id + ", username=" + username + ", age=" + age + "]";
    }

 
}

4 持久層的開發

持久層選用MyBatis,先編寫一個配置文件,然後用自動化工具生成dao層以下的所有代碼,配置文件generatorConfig.xml供生成器用,詳細的內容請看我前面的幾篇博客

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.6.jar"/>
    <context id="DB2Tables"    targetRuntime="MyBatis3">
        <commentGenerator>
            <property name="suppressDate" value="true"/>
            <property name="suppressAllComments" value="true"/>
        </commentGenerator>
         <!--數據庫鏈接地址賬號密碼-->
        <jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql://127.0.0.1:3306/myDb2" userId="root" password="123456">
        </jdbcConnection>
        <javaTypeResolver>
            <property name="forceBigDecimals" value="false"/>
        </javaTypeResolver>
         <!--生成Model類存放位置-->
        <javaModelGenerator targetPackage="com.bank.model" targetProject="src">
            <property name="enableSubPackages" value="true"/>
            <property name="trimStrings" value="true"/>
        </javaModelGenerator>
         <!--生成映射文件存放位置-->
        <sqlMapGenerator targetPackage="com.bank.mapping" targetProject="src">
            <property name="enableSubPackages" value="true"/>
        </sqlMapGenerator>
        <!--生成Dao類存放位置-->
        <javaClientGenerator type="XMLMAPPER" targetPackage="com.bank.dao" targetProject="src">
            <property name="enableSubPackages" value="true"/>
        </javaClientGenerator>
        <!--生成對應表及類名-->
        <table tableName="person" domainObjectName="Person" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="false" selectByExampleQueryId="false"></table>
    </context>
</generatorConfiguration>

上面的路徑請酌情修改,保存之後在cmd下面 進入生成器的jar包所在的文件夾,然後執行以下命令:

java -jar mybatis-generator-core-1.3.5.jar -configfile generatorConfig.xml -overwrite

5 建立一個 mybatis.cfg.xml 文件,該文件是MyBatis的重要配置文件

<?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>
         
    <mappers>  
       <mapper resource="com/mybatis/mapper/UserMapper.xml"/>  
    </mappers>  
    
    
</configuration>

6 Spring 的核心配置文件 applicationContext.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:aop="http://www.springframework.org/schema/aop"
    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.xsd
     http://www.springframework.org/schema/aop                
     http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
      
     <!-- 加載Spring配置文件 -->
    <context:property-placeholder location="classpath*:db.properties" />
    
    <!-- 配置數據源-->  
    <bean id="jdbcDataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">  
        <property name="driverClassName">  
            <value>${jdbc.driver}</value>  
        </property>  
        <property name="url">  
            <value>${jdbc.url}</value>  
        </property>  
        <property name="username">  
            <value>${jdbc.username}</value>  
        </property>  
        <property name="password">  
            <value>${jdbc.password}</value>  
        </property>  
    </bean>  

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
    <property name="dataSource" ref="jdbcDataSource" />  
    <property name="configLocation" value="classpath:mybatis.cfg.xml"></property>  
</bean>  

<bean id="userMapper" class="org.mybatis.spring.mapper.MapperFactoryBean">  
    <property name="mapperInterface" value="com.mybatis.mapper.UserMapper"></property>  
    <property name="sqlSessionFactory" ref="sqlSessionFactory"></property>  
</bean>  
</beans>

註意: 在定義SqlSessionFactoryBean的時候,dataSource屬性是必須指定的,它表示用於連接數據庫的數據源。當然,我們也可以指定一些其他的屬性,下面簡單列舉幾個:

  • mapperLocations:它表示我們的Mapper文件存放的位置,當我們的Mapper文件跟對應的Mapper接口處於同一位置的時候可以不用指定該屬性的值。
  • configLocation:用於指定Mybatis的配置文件位置。如果指定了該屬性,那麽會以該配置文件的內容作為配置信息構建對應的SqlSessionFactoryBuilder,但是後續屬性指定的內容會覆蓋該配置文件裏面指定的對應內容。
  • typeAliasesPackage:它一般對應我們的實體類所在的包,這個時候會自動取對應包中不包括包名的簡單類名作為包括包名的別名。多個package之間可以用逗號或者分號等來進行分隔。(value的值一定要是包的全名)

db.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/myDb?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=123456

7 UserMapper.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="com.mybatis.mapper.UserMapper">
     
 <select id="getUser" parameterType="com.mybatis.pojo.User" resultType="com.mybatis.pojo.User">  
        SELECT * FROM user WHERE username=#{username} AND age=#{age}  
</select>  

<insert id="addUser" parameterType="com.mybatis.pojo.User"  >  
   INSERT INTO user (id,username,age) VALUES (#{id},#{username},#{age})  
</insert>  

<update id="updateUser" parameterType="com.mybatis.pojo.User">  
    UPDATE user SET username=#{username} WHERE id=#{id}  
</update>  

<delete id="deleteUser" parameterType="int">  
    DELETE FROM user WHERE id=#{id}  
</delete>  
     
</mapper>

8 編寫存儲層代碼

新建UserMapper.java

package com.mybatis.mapper;

import com.mybatis.pojo.User;

/**
 * 
 */
public interface UserMapper
{
    
     public User getUser(User user);
    
     public void addUser(User user);
     
     public void updateUser(User user);
     
     public void deleteUser(int UserId);
    
    
}

7 測試方法

package mybatisSpringPro;

import org.junit.Before;
import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import com.mybatis.mapper.UserMapper;
import com.mybatis.pojo.User;

public class UserMapperTest
{
    ApplicationContext ctx = null; 
            
     @Before
     public void setUp() throws Exception {
         ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
     }
     
     @Test
     public void testAdd() throws Exception {
        try{
               UserMapper userMapper=(UserMapper) ctx.getBean("userMapper");
               System.out.println( "userMapper=" + userMapper);
               User user=new User();
               user.setUsername("zhaoliu");
               user.setAge(21);
             userMapper.addUser(user);
             
             User user2=new User();
               user2.setUsername("wangwu");
               user2.setAge(22);
               userMapper.addUser(user2);
               
             System.out.println("添加成功");
        }catch(Exception e){
            e.printStackTrace();
        }
             
     }
        
     @Test
        public void testSel()  {
           try{
               UserMapper userMapper=(UserMapper) ctx.getBean("userMapper");
              System.out.println( "userMapper=" + userMapper);
              User user=new User();
              user.setUsername("zhaoliu");
              user.setAge(21);
              User oneUser = userMapper.getUser(user);
              
            System.out.println("* oneUser=" + oneUser);
                
           }catch(Exception e){
               e.printStackTrace();
           }
                
        }
     
     @Test
        public void testUpdate(){
        //修改數據
        User user=new User();
          user.setUsername("aaa");
          user.setId( 3);
          
          try{
              UserMapper userMapper=(UserMapper) ctx.getBean("userMapper");
              userMapper.updateUser(user);
              
              System.out.println("修改成功");
          }catch(Exception e){
              e.printStackTrace();
          }
              
     }
     
     @Test
        public void testDel(){
            try{
                  UserMapper userMapper=(UserMapper) ctx.getBean("userMapper");
                  userMapper.deleteUser(9);
                  
                  System.out.println("刪除成功");
              }catch(Exception e){
                  e.printStackTrace();
              }
         
     }
     
}

  

資料參考:

http://qiuqiu0034.iteye.com/blog/1172298

MyBatis 學習總結 05 Mybatis3.x與Spring3.x整合 OLD