• MyBatis——【第三章】管理关系映射及spring集成


    目录

    一、mybatis与spring集成

    1.添加相关依赖      注:spring 5.0.1.RELEASE有冲突

       1.1 添加spring相关依赖(5.0.2.RELEASE) 

       1.2 添加mybatis相关依赖

       1.3 spring整合mybatis(1.3.1)

       1.4 添加dbcp2连接池

       1.5 添加日志配置(2.9.1)

       1.6 其他

     以下有一些是目前不需要的(但是大部分都是)自己仔细看然后提取需要的部分

    2.创建spring配置文件applicationContext

       2.1 注解式开发

       2.2 引入外部jdbc配置文件

        2.3 配置dbcp2数据库连接池

       2.4 spring和mybatis整合

       2.5 注解式事物配置

       2.6 开启动态代理

    3.注解式开发

    4.Spring Test+Junit完美组合

       4.1 在工程的pom文件中增加spring-test的依赖

          4.2 创建BaseTestCase,并在该类上加上两个注解

          4.3 使用idean的junit插件(JUnitGenerator V2.0)生成测试用例

    5.修改分页代码:

    二、关联关系映射

    1、什么是关联关系?

    2、关联关系的分类:

    2.1、将数据表导入数据库中

    2.2、通过mybatis-generator插件生成dao、mapper、model

    2.3、修改Customer、Order实体类

    2.4、配置mybatis关联映射

     2. 4.1 一对多

     2.4.2 多对一 

    补充驼峰命名法                         


    一、mybatis与spring集成


    1.添加相关依赖
       
       注:spring 5.0.1.RELEASE有冲突

     

       1.1 添加spring相关依赖(5.0.2.RELEASE)
           
    spring-core
           spring-beans
           spring-context
           spring-orm
           spring-tx
           spring-aspects
           spring-web

       1.2 添加mybatis相关依赖
           mybatis核心:mybatis(3.4.5)
           Mybatis分页:pagehelper(5.1.2)

       1.3 spring整合mybatis(1.3.1)
           mybatis-spring

       1.4 添加dbcp2连接池
           commons-dbcp2(2.1.1)
           commons-pool2(2.4.3)

       1.5 添加日志配置(2.9.1)
           log4j-core
           log4j-api
           log4j-web

       1.6 其他
           junit(4.12)
           javax.servlet-api(4.0.0)

       注:使用mybatis-generator插件,pom文件添加支持   

     以下有一些是目前不需要的(但是大部分都是)自己仔细看然后提取需要的部分

    1. "1.0" encoding="UTF-8"?>
    2. <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    3. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    4. <modelVersion>4.0.0modelVersion>
    5. <groupId>com.zkinggroupId>
    6. <artifactId>mybatis01artifactId>
    7. <version>1.0-SNAPSHOTversion>
    8. <packaging>warpackaging>
    9. <name>mybatis01 Maven Webappname>
    10. <url>http://www.example.comurl>
    11. <properties>
    12. <project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
    13. <maven.compiler.source>1.8maven.compiler.source>
    14. <maven.compiler.target>1.8maven.compiler.target>
    15. <junit.version>4.12junit.version>
    16. <servlet.version>4.0.1servlet.version>
    17. <mybatis.version>3.4.5mybatis.version>
    18. <mysql.version>5.1.44mysql.version>
    19. <log4j2.version>2.9.1log4j2.version>
    20. properties>
    21. <dependencies>
    22. <dependency>
    23. <groupId>junitgroupId>
    24. <artifactId>junitartifactId>
    25. <version>${junit.version}version>
    26. <scope>testscope>
    27. dependency>
    28. <dependency>
    29. <groupId>javax.servletgroupId>
    30. <artifactId>javax.servlet-apiartifactId>
    31. <version>${servlet.version}version>
    32. dependency>
    33. <dependency>
    34. <groupId>org.mybatisgroupId>
    35. <artifactId>mybatisartifactId>
    36. <version>${mybatis.version}version>
    37. dependency>
    38. <dependency>
    39. <groupId>mysqlgroupId>
    40. <artifactId>mysql-connector-javaartifactId>
    41. <version>${mysql.version}version>
    42. dependency>
    43. <dependency>
    44. <groupId>org.apache.logging.log4jgroupId>
    45. <artifactId>log4j-coreartifactId>
    46. <version>${log4j2.version}version>
    47. dependency>
    48. <dependency>
    49. <groupId>org.apache.logging.log4jgroupId>
    50. <artifactId>log4j-apiartifactId>
    51. <version>${log4j2.version}version>
    52. dependency>
    53. <dependency>
    54. <groupId>org.apache.logging.log4jgroupId>
    55. <artifactId>log4j-webartifactId>
    56. <version>${log4j2.version}version>
    57. dependency>
    58. <dependency>
    59. <groupId>org.projectlombokgroupId>
    60. <artifactId>lombokartifactId>
    61. <version>1.18.12version>
    62. <scope>providedscope>
    63. dependency>
    64. <dependency>
    65. <groupId>com.github.pagehelpergroupId>
    66. <artifactId>pagehelperartifactId>
    67. <version>5.1.2version>
    68. dependency>
    69. dependencies>
    70. <build>
    71. <finalName>mybatis01finalName>
    72. <plugins>
    73. <plugin>
    74. <groupId>org.apache.maven.pluginsgroupId>
    75. <artifactId>maven-compiler-pluginartifactId>
    76. <version>3.7.0version>
    77. <configuration>
    78. <source>${maven.compiler.source}source>
    79. <target>${maven.compiler.target}target>
    80. <encoding>${project.build.sourceEncoding}encoding>
    81. configuration>
    82. plugin>
    83. <plugin>
    84. <groupId>org.mybatis.generatorgroupId>
    85. <artifactId>mybatis-generator-maven-pluginartifactId>
    86. <version>1.3.2version>
    87. <dependencies>
    88. <dependency>
    89. <groupId>mysqlgroupId>
    90. <artifactId>mysql-connector-javaartifactId>
    91. <version>${mysql.version}version>
    92. dependency>
    93. dependencies>
    94. <configuration>
    95. <overwrite>trueoverwrite>
    96. configuration>
    97. plugin>
    98. plugins>
    99. build>
    100. project>

    2.创建spring配置文件applicationContext

       2.1 注解式开发
       开启注解
     

    1.  
    2.    
    3.    <context:annotation-config/>
    4.    
    5.    <context:component-scan base-package="com.zking.oa"/>

       2.2 引入外部jdbc配置文件
     

     <context:property-placeholder location="classpath:jdbc.properties"/>


      2.3 配置dbcp2数据库连接池

    1. <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
    2. destroy-method="close">
    3. <property name="driverClassName" value="${jdbc.driver}"/>
    4. <property name="url" value="${jdbc.url}"/>
    5. <property name="username" value="${jdbc.username}"/>
    6. <property name="password" value="${jdbc.password}"/>
    7. <property name="initialSize" value="10"/>
    8. <property name="maxTotal" value="100"/>
    9. <property name="maxIdle" value="50"/>
    10. <property name="minIdle" value="10"/>
    11. <property name="maxWaitMillis" value="-1"/>
    12. bean>

       2.4 spring和mybatis整合
       

    1. <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
    2. <property name="dataSource" ref="dataSource"/>
    3. <property name="mapperLocations" value="classpath*:com/zking/ssm/**/mapper/*.xml"/>
    4. <property name="typeAliasesPackage" value="com/zking/ssm/**/model"/>
    5. <property name="plugins">
    6. <array>
    7. <bean class="com.github.pagehelper.PageInterceptor">
    8. <property name="properties">
    9. <value>
    10. helperDialect=mysql
    11. value>
    12. property>
    13. bean>
    14. array>
    15. property>
    16. bean>
    17. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    18. <property name="basePackage" value="com/zking/ssm/**/mapper"/>
    19. <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
    20. bean>

       2.5 注解式事物配置

    1.   <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    2.         <property name="dataSource" ref="dataSource" />
    3.     bean>
    4.     <tx:annotation-driven transaction-manager="transactionManager" />

       2.6 开启动态代理
       

    3.注解式开发

       @Repository:将Mapper类声明为Bean
       @
    Service:通常作用在业务层
       @
    Controller:通常作用在控制层,将在Spring MVC中使用
       @
    Component:是一个泛化的概念,仅仅表示spring中的一个组件(Bean),可以作用在任何层次

       @Scope:模式声明(singleton|prototype)

       @Autowired:将自动在Spring上下文与其匹配(默认是类型匹配)的Bean,并自动注入到相应的地方
       @
    Resource:后面没有任何内容,默认通过name属性去匹配bean,找不到再按type去匹配,任何一个不匹配都将报错

       问题:@Autowired和@Resource两个注解的区别:
       1)@
    Autowired默认按照byType方式进行bean匹配,@Resource默认按照byName方式进行bean匹配
       2)@
    Autowired是Spring的注解,@Resource是J2EE的注解,这个看一下导入注解的时候这两个注解的包名就一清二楚了
       Spring属于第三方的,J2EE是Java自己的东西,因此,建议使用@Resource注解,以减少代码和Spring之间的耦合。

       @Transactional
       注:个人感觉注解式事务比以前的声明式事务更加麻烦,要写的东西更多
       


    4.Spring Test+Junit完美组合

       4.1 在工程的pom文件中增加spring-test的依赖
       

    1.  <dependency>
    2.        <groupId>org.springframeworkgroupId>
    3.        <artifactId>spring-testartifactId>
    4.        <version>${spring.version}version>
    5.      dependency>

          4.2 创建BaseTestCase,并在该类上加上两个注解
       @RunWith(SpringJUnit4ClassRunner.class)
       @ContextConfiguration(locations={"classpath:applicationContext.xml"})

       4.3 使用idean的junit插件(JUnitGenerator V2.0)生成测试用例
       注1:还需要修改相关配置,详情参考资料:“IDEA Junit4配置.mht”
       注2:快捷键,Ctrl + Shift + T

       4.4 在执行单元测试时,为了避免产生脏数据,可将测试单元设置成事务回滚
       @Rollback(value = true|false)//true回滚事务,false提交事务
       @Transactional(transactionManager = "transactionManager")

    5.修改分页代码:

       使用AOP编程解决分页代码重复的问题
       注1:AOP注解式开发
       注2:AOP分页实现“PageBeanAspect.java”

       注:dbcp是apache上的一个java 连接池项目
              现在分成了3个大版本,不同的版本要求的JDK不同:
              DBCP 2 compiles and runs under Java 7 only (JDBC 4.1)
              DBCP 1.4 compiles and runs under Java 6 only (JDBC 4)
              DBCP 1.3 compiles and runs under Java 1.4-5 only (JDBC 3)

    二、关联关系映射

    1、什么是关联关系?


    关联关系是指类之间的引用关系,如果类A与类B关联,那么类A将被定义成类B的属性。例如:
     

    1. package com.zking.ssm.model;
    2. import java.util.ArrayList;
    3. import java.util.List;
    4. /**
    5. * 一个客户对应多个订单
    6. */
    7. public class Customer {
    8. private Integer customerId;
    9. private String customerName;
    10. //什么是关联关系,如果A与B关联,那么B将被A的属性
    11. //类A 客户(一方)
    12. //类B 订单(多方)
    13. //建立实体层面的关联关系映射
    14. private List orders=new ArrayList<>();
    15. public Customer(Integer customerId, String customerName) {
    16. this.customerId = customerId;
    17. this.customerName = customerName;
    18. }
    19. public void setOrders(List orders) {
    20. this.orders = orders;
    21. }
    22. public List getOrders() {
    23. return orders;
    24. }
    25. public Customer() {
    26. super();
    27. }
    28. public Integer getCustomerId() {
    29. return customerId;
    30. }
    31. public void setCustomerId(Integer customerId) {
    32. this.customerId = customerId;
    33. }
    34. public String getCustomerName() {
    35. return customerName;
    36. }
    37. public void setCustomerName(String customerName) {
    38. this.customerName = customerName;
    39. }
    40. @Override
    41. public String toString() {
    42. return "Customer{" +
    43. "customerId=" + customerId +
    44. ", customerName='" + customerName + '\'' +
    45. ", orders=" + orders +
    46. '}';
    47. }
    48. }

     sql语句:

    1. <select id="queryCustomerAll" resultMap="oneToMany">
    2. select * from t_customer c left join t_order o on c.customer_id=o.cid
    3. select>

    2、关联关系的分类:

    (一对一,一对多,多对一,多对多)
    一对多:一本书对应多种书本类型,例如:西游记 -> 神话、古典、名著
    多对一:多本书指向一种书本类型,例如:西游记、山海经、聊斋志异 -> 神话  
    多对多:永远视为两个一对多
    一个人负责多个项目开发,例如:张三负责 A B C
    一个项目由多个人来开发,例如:A项目由张三、李四、王五来开发

    2.1、将数据表导入数据库中

    2.2、通过mybatis-generator插件生成dao、mapper、model

        1)配置mybatis-generator插件生成文件位置
       2)修改generatorConfig.xml配置文件的生成目录(mapper和model)及对应生成关系

    mybatis-generator插件如下:

    1. "1.0" encoding="UTF-8" ?>
    2. generatorConfiguration PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
    3. "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd" >
    4. <generatorConfiguration>
    5. <properties resource="jdbc.properties"/>
    6. <classPathEntry location="E:\computer_load\apache-maven-3.5.4\mvn_repository\mysql\mysql-connector-java\5.1.44\mysql-connector-java-5.1.44.jar"/>
    7. <context id="infoGuardian">
    8. <commentGenerator>
    9. <property name="suppressAllComments" value="true"/>
    10. <property name="suppressDate" value="true"/>
    11. commentGenerator>
    12. <jdbcConnection driverClass="${jdbc.driver}"
    13. connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"/>
    14. <javaTypeResolver>
    15. <property name="forceBigDecimals" value="false"/>
    16. javaTypeResolver>
    17. <javaModelGenerator targetPackage="com.zking.ssm.model"
    18. targetProject="src/main/java">
    19. <property name="enableSubPackages" value="false"/>
    20. <property name="constructorBased" value="true"/>
    21. <property name="trimStrings" value="false"/>
    22. <property name="immutable" value="false"/>
    23. javaModelGenerator>
    24. <sqlMapGenerator targetPackage="com.zking.ssm.mapper"
    25. targetProject="src/main/resources">
    26. <property name="enableSubPackages" value="false"/>
    27. sqlMapGenerator>
    28. <javaClientGenerator targetPackage="com.zking.ssm.mapper"
    29. targetProject="src/main/java" type="XMLMAPPER">
    30. <property name="enableSubPackages" value="false"/>
    31. javaClientGenerator>
    32. context>
    33. generatorConfiguration>

       

    2.3、修改Customer、Order实体类
       1)实现序列化接口
       2)建立实体映射关联关系(一对多、多对一)
       #一对多:一个客户对应多个订单
       private List orders=new ArrayList();

       #多对一:多个订单对应一个客户(一个订单对应一个客户)
       private Customer customer;
       

    2.4、配置mybatis关联映射

     2. 4.1 一对多

    1.  <resultMap id="one2many" type="Customer">
    2.         <id column="customer_id" property="customerId"/>
    3.         <result column="customer_name" property="customerName"/>
    4.        
    5.        
    6.         <collection property="orders" ofType="Order">
    7.             <id column="order_id" property="orderId"/>
    8.             <result column="order_no" property="orderNo"/>
    9.         collection>
    10.     resultMap>

       注意事项,使用左外连接而非内连接!!!

     2.4.2 多对一
       

    1. <resultMap id="many2one" type="Order">
    2.         <id column="order_id" property="orderId"/>
    3.         <result column="order_no" property="orderNo"/>
    4.         <result column="cid" property="cid"/>
    5.        
    6.        
    7.         <association property="customer" javaType="Customer">
    8.             <id column="customer_id" property="customerId"/>
    9.             <result column="customer_name" property="customerName"/>
    10.         association>
    11.    resultMap>


     补充驼峰命名法:

     加油小伙伴们!

     

     

     

  • 相关阅读:
    21级数据结构与算法实验8——排序
    ps找不到msvcp140.dll怎么办?亲测5个有效的修复方法分享
    18uec++多人游戏【服务器为两个角色发枪,并能在线开枪】
    Fourier分析入门——第10章——直接数据分析
    Codeforces Global Round 21 D. Permutation Graph
    pytorch环境搭建到pycharm项目映射配置(成功后回顾性记录/自用)
    CC002:ContextCapture倾斜摄影建模流程
    java计算机毕业设计Web企业差旅在线管理系统源码+mysql数据库+系统+lw文档+部署
    易基因|宏病毒组测序技术介绍
    Django基于类视图实现增删改查
  • 原文地址:https://blog.csdn.net/m0_62019369/article/details/125675191