Maven管理的Spring + SpringMVC + Mybatis 项目搭建(二、Spring+Mybatis配置)

一、配置maven的pom.xml加载jar包

为了后续开发的方便,将SSM框架所有需要的jar包一并加载进来

  • pom.xml
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    4.0.0
    com.ustc.finance
    USTC
    war
    0.0.1-SNAPSHOT
    USTC Maven Webapp
    http://maven.apache.org

         
          
          4.3.2.RELEASE  
            
          1.7.21  
          1.2.16  
            
          4.12  
            
          3.4.1
            
          1.3.0 
        
    
        
      
          
            junit
             junit
            ${junit.version}
            test
          
    
          
          
            mysql
            mysql-connector-java
            5.1.38
          
    
          
          
              javax.servlet
              jstl
              1.2
          
          
              javax.servlet
              javax.servlet-api
              3.1.0
          
          
              javax.servlet.jsp
              javax.servlet.jsp-api
              2.3.1
          
    
          
          
              log4j  
              log4j  
              ${log4j.version}
          
            
              org.slf4j  
              slf4j-api  
              ${slf4j.version}  
           
            
              org.slf4j  
              slf4j-log4j12  
              ${slf4j.version}  
            
    
            
            
              org.mybatis  
              mybatis  
              ${mybatis.version}  
          
    
          
            
              org.mybatis  
              mybatis-spring  
              ${mybatis-spring.version}  
              
    
          
            
              org.springframework  
              spring-core  
              ${spring.version}  
            
            
              org.springframework  
              spring-webmvc  
              ${spring.version}  
            
            
              org.springframework  
              spring-context  
              ${spring.version}  
            
            
              org.springframework  
              spring-context-support  
              ${spring.version}  
            
            
              org.springframework  
              spring-aop  
              ${spring.version}  
            
            
              org.springframework  
              spring-aspects  
              ${spring.version}  
            
            
              org.springframework  
              spring-tx  
              ${spring.version}  
            
            
              org.springframework  
              spring-jdbc  
              ${spring.version}  
            
            
              org.springframework  
              spring-web  
              ${spring.version}  
           
          
            
              org.springframework  
              spring-test  
              ${spring.version}  
              test  
               
          
          
              USTC
        
      
    

配置好pom.xml之后右键单击工程名:Runs As ->Maven Install 将这些jar包下载至之前配置好的本地仓库

二、创建实体类

此处与Hibernate中实体类相同,都是按照ORM思想将类与数据库中的表做一对一的映射,类名与表名对应、类中 成员变量与表中字段名对应、表中的一对多关系在类中表现为组合关系(一对多时在类中添加Set或者List集合,多对一时在类中添加相应的对象),如图所示(User与StockComment就是一对多的关系):


Maven管理的Spring + SpringMVC + Mybatis 项目搭建(二、Spring+Mybatis配置)_第1张图片

Maven管理的Spring + SpringMVC + Mybatis 项目搭建(二、Spring+Mybatis配置)_第2张图片

当类中存在TreeSet时需要实现Comparable接口并重写compareTo方法(方便TreeSet集合进行排序)。之后自动生成成员变量的Get和Set方法。

三、创建实体类对应的Dao

Dao中主要定义一些基本的数据库访问操作如CRUD,此处注意Dao只是接口,而不是类。而且在Mybati中Dao不需要用类实现,而是通过配置映射文件Mapping.xml来实现Dao接口。

public interface UserDao {
        /**
         * Select from t_user by userID
         * @param userID
         * @return
         */
        public User selectUserByID(int userID);

        /**
         * Select from t_user by userName
         * @param userName
         * @return
         */
        public User selectUserByName(String userName);

        /**
         * Insert a record in t_user 
         * @param user
         * @return
         */
        public int addUser(User user);

        /**
         * Update a record in t_user
         * @param user
         * @return
         */
        public int updateUser(User user);

        /**
         * Delete a record in t_user that dependents on the userID
         * @param userID
         * @return
         */
        public int deleteUserByID(int userID);
    }

四、配置Dao对应的实现UserMapping.xml

        
     
      
        
            
            
            
            
            
            
            
              
              
            
            
             
             
              
        

        
        

        
        
        
        
            INSERT INTO t_user (userName, userPassword,  userRealName, userPhone, userEmail, userGender, userFinance) 
            VALUES (#{userName}, #{userPassword}, #{userRealName}, #{userPhone}, #{userEmail}, #{userGender}, #{userFinance})
        
        
        
            UPDATE t_user SET userName = #{userName}, userPassword = #{userPassword},
          userRealName = #{userRealName}, userPhone = #{userPhone}, userEmail = #{userEmail},
          userGender = #{userGender}, userFinance = #{userFinance} WHERE userID = #{userID}
          

        
        
            DELETE FROM t_user WHERE userID = #{userID}
        
    
  • 在MyBatis中所有的数据库访问操作都需要我们自己实现SQL,这样就可以拥有更高的管理权限和更多的灵活性,可以精确地控制到每一次数据库访问,减少不必要的依赖操作。
  • 标签定义了查询返回结果的存储格式,一般情况下是为实体类中的成员变量与数据库表中的字段做对应,其中column属性的值是数据库字段名,property的值是类中对应的成员变量名,resultMap中的id方便在下面进行查询时指明返回结果使用哪一个resultMap进行存储

  • 当使用MyBatis处理一对多关系时,首先在resultMap中声明关系(一对多的关系使用collection 声明,多对一的关系使用association声明)如下:

    select="com.ustc.finance.dao.UserDao.selectUserByID" column="userID">

  • 首先说明collection :其中的property是指实体类中的集合变量名(TreeSet),ofType指明集合变量(TreeSet)的类型,select指明可以使用哪一个select语句查询出关联对象,column指明关联对象的主键(这里填数据库中的字段名)

  • 然后说明一下association:其实与collection 大同小异,只是ofType换成了javaType

  • 这里需要额外说明一下,在我的测试之下MyBatis不会自动的帮你联表查询,想要实现联表查询的话要么在SQL中直接查两个表,要么自己想一下替代的策略。我所使用的策略是:对于多对一关系,由于每个对象中只存放一条关联数据(比如StockComment中只存放有一个User类的对象),查询起来比较方便,因此在StockComment的所有查询SQL中一并将User查出来;对于一对多关系,由于每个对象中存放有多条关联数据(比如User中存放了一个TreeSet类型的StockComment,存放了一个对象集合),查询起来过于复杂而且容易存在冗余查询(即只需要User自身的信息,但关联查询出了多余的Stock信息),因此我在处理一对多关系时“一”的一方(User)只查询自身表的内容,“多”的一方(StockComment)增加根据userID查询的接口
    public TreeSet selectStockCommentByUserID(@Param("userID") int userID);
    这样当需要查询某个user对应的stockComment时使用该方法就可以实现。

  • 然后说明一下SQL标签