目录
一、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文件添加支持
以下有一些是目前不需要的(但是大部分都是)自己仔细看然后提取需要的部分
代码语言:javascript复制<?xml version="1.0" encoding="UTF-8"?>
<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.zking</groupId>
<artifactId>mybatis01</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<name>mybatis01 Maven Webapp</name>
<!-- FIXME change it to the project's website -->
<url>http://www.example.com</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<!-- junit servlet -->
<junit.version>4.12</junit.version>
<servlet.version>4.0.1</servlet.version>
<!-- mybatis -->
<mybatis.version>3.4.5</mybatis.version>
<!--mysql-->
<mysql.version>5.1.44</mysql.version>
<!--log4j2-->
<log4j2.version>2.9.1</log4j2.version>
</properties>
<dependencies>
<!-- junit servlet -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>${servlet.version}</version>
</dependency>
<!--mybatis-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>${mybatis.version}</version>
</dependency>
<!--mysql-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<!--记得修改mybatis.cfg.xml添加如下内容-->
<!--<setting name="logImpl" value="LOG4J2"/>-->
<!--核心log4j2jar包-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>${log4j2.version}</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>${log4j2.version}</version>
</dependency>
<!--web工程需要包含log4j-web,非web工程不需要-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-web</artifactId>
<version>${log4j2.version}</version>
</dependency>
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.12</version>
<scope>provided</scope>
</dependency>
<!--pagehelper -->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>
</dependencies>
<build>
<finalName>mybatis01</finalName>
<plugins>
<!--第一步就是配置maven-compiler-plugin插件-->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
<configuration>
<source>${maven.compiler.source}</source>
<target>${maven.compiler.target}</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
</dependencies>
<configuration>
<overwrite>true</overwrite>
</configuration>
</plugin>
</plugins>
</build>
</project>
2.创建spring配置文件applicationContext
2.1 注解式开发 开启注解
代码语言:javascript复制 <!--1. 注解式开发 -->
<!-- 注解驱动 -->
<context:annotation-config/>
<!-- 用注解方式注入bean,并指定查找范围:com.zking.ssh2及子子孙孙包-->
<context:component-scan base-package="com.zking.oa"/>
2.2 引入外部jdbc配置文件
代码语言:javascript复制 <context:property-placeholder location="classpath:jdbc.properties"/>
2.3 配置dbcp2数据库连接池
代码语言:javascript复制<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
<!--初始连接数-->
<property name="initialSize" value="10"/>
<!--最大活动连接数-->
<property name="maxTotal" value="100"/>
<!--最大空闲连接数-->
<property name="maxIdle" value="50"/>
<!--最小空闲连接数-->
<property name="minIdle" value="10"/>
<!--设置为-1时,如果没有可用连接,连接池会一直无限期等待,直到获取到连接为止。-->
<!--如果设置为N(毫秒),则连接池会等待N毫秒,等待不到,则抛出异常-->
<property name="maxWaitMillis" value="-1"/>
</bean>
2.4 spring和mybatis整合
代码语言:javascript复制<!--4. spring和MyBatis整合 -->
<!--1) 创建sqlSessionFactory-->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<!-- 指定数据源 -->
<property name="dataSource" ref="dataSource"/>
<!-- 自动扫描XxxMapping.xml文件,**任意路径 -->
<property name="mapperLocations" value="classpath*:com/zking/ssm/**/mapper/*.xml"/>
<!-- 指定别名 -->
<property name="typeAliasesPackage" value="com/zking/ssm/**/model"/>
<!--配置pagehelper插件-->
<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<value>
helperDialect=mysql
</value>
</property>
</bean>
</array>
</property>
</bean>
<!--2) 自动扫描com/zking/oa/**/mapper下的所有XxxMapper接口(其实就是DAO接口),并实现这些接口,-->
<!-- 即可直接在程序中使用dao接口,不用再获取sqlsession对象-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<!--basePackage 属性是映射器接口文件的包路径。-->
<!--你可以使用分号或逗号 作为分隔符设置多于一个的包路径-->
<property name="basePackage" value="com/zking/ssm/**/mapper"/>
<property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
</bean>
2.5 注解式事物配置
代码语言:javascript复制 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
2.6 开启动态代理 <aop:aspectj-autoproxy/>
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的依赖
代码语言:javascript复制 <dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</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的属性。例如:
代码语言:javascript复制package com.zking.ssm.model;
import java.util.ArrayList;
import java.util.List;
/**
* 一个客户对应多个订单
*/
public class Customer {
private Integer customerId;
private String customerName;
//什么是关联关系,如果A与B关联,那么B将被A的属性
//类A 客户(一方)
//类B 订单(多方)
//建立实体层面的关联关系映射
private List<Order> orders=new ArrayList<>();
public Customer(Integer customerId, String customerName) {
this.customerId = customerId;
this.customerName = customerName;
}
public void setOrders(List<Order> orders) {
this.orders = orders;
}
public List<Order> getOrders() {
return orders;
}
public Customer() {
super();
}
public Integer getCustomerId() {
return customerId;
}
public void setCustomerId(Integer customerId) {
this.customerId = customerId;
}
public String getCustomerName() {
return customerName;
}
public void setCustomerName(String customerName) {
this.customerName = customerName;
}
@Override
public String toString() {
return "Customer{"
"customerId=" customerId
", customerName='" customerName '''
", orders=" orders
'}';
}
}
sql语句:
代码语言:javascript复制<select id="queryCustomerAll" resultMap="oneToMany">
select * from t_customer c left join t_order o on c.customer_id=o.cid
</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插件如下:
代码语言:javascript复制<?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="jdbc.properties"/>
<!--指定数据库jdbc驱动jar包的位置-->
<classPathEntry location="E:computer_loadapache-maven-3.5.4mvn_repositorymysqlmysql-connector-java5.1.44mysql-connector-java-5.1.44.jar"/>
<!-- 一个数据库一个context -->
<context id="infoGuardian">
<!-- 注释 -->
<commentGenerator>
<property name="suppressAllComments" value="true"/><!-- 是否取消注释 -->
<property name="suppressDate" value="true"/> <!-- 是否生成注释代时间戳 -->
</commentGenerator>
<!-- jdbc连接 -->
<jdbcConnection driverClass="${jdbc.driver}"
connectionURL="${jdbc.url}" userId="${jdbc.username}" password="${jdbc.password}"/>
<!-- 类型转换 -->
<javaTypeResolver>
<!-- 是否使用bigDecimal, false可自动转化以下类型(Long, Integer, Short, etc.) -->
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!-- 01 指定javaBean生成的位置 -->
<!-- targetPackage:指定生成的model生成所在的包名 -->
<!-- targetProject:指定在该项目下所在的路径 -->
<javaModelGenerator targetPackage="com.zking.ssm.model"
targetProject="src/main/java">
<!-- 是否允许子包,即targetPackage.schemaName.tableName -->
<property name="enableSubPackages" value="false"/>
<!-- 是否对model添加构造函数 -->
<property name="constructorBased" value="true"/>
<!-- 是否针对string类型的字段在set的时候进行trim调用 -->
<property name="trimStrings" value="false"/>
<!-- 建立的Model对象是否 不可改变 即生成的Model对象不会有 setter方法,只有构造方法 -->
<property name="immutable" value="false"/>
</javaModelGenerator>
<!-- 02 指定sql映射文件生成的位置 -->
<sqlMapGenerator targetPackage="com.zking.ssm.mapper"
targetProject="src/main/resources">
<!-- 是否允许子包,即targetPackage.schemaName.tableName -->
<property name="enableSubPackages" value="false"/>
</sqlMapGenerator>
<!-- 03 生成XxxMapper接口 -->
<!-- type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper对象 -->
<!-- type="MIXEDMAPPER",生成基于注解的Java Model 和相应的Mapper对象 -->
<!-- type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口 -->
<javaClientGenerator targetPackage="com.zking.ssm.mapper"
targetProject="src/main/java" type="XMLMAPPER">
<!-- 是否在当前路径下新加一层schema,false路径com.oop.eksp.user.model, true:com.oop.eksp.user.model.[schemaName] -->
<property name="enableSubPackages" value="false"/>
</javaClientGenerator>
<!-- 配置表信息 -->
<!-- schema即为数据库名 -->
<!-- tableName为对应的数据库表 -->
<!-- domainObjectName是要生成的实体类 -->
<!-- enable*ByExample是否生成 example类 -->
<!--<table schema="" tableName="t_book" domainObjectName="Book"-->
<!--enableCountByExample="false" enableDeleteByExample="false"-->
<!--enableSelectByExample="false" enableUpdateByExample="false">-->
<!--<!– 忽略列,不生成bean 字段 –>-->
<!--<!– <ignoreColumn column="FRED" /> –>-->
<!--<!– 指定列的java数据类型 –>-->
<!--<!– <columnOverride column="LONG_VARCHAR_FIELD" jdbcType="VARCHAR" /> –>-->
<!--</table>-->
</context>
</generatorConfiguration>
2.3、修改Customer、Order实体类 1)实现序列化接口 2)建立实体映射关联关系(一对多、多对一) #一对多:一个客户对应多个订单 private List<Order> orders=new ArrayList<Order>();
#多对一:多个订单对应一个客户(一个订单对应一个客户) private Customer customer;
2.4、配置mybatis关联映射
2. 4.1 一对多
代码语言:javascript复制 <resultMap id="one2many" type="Customer">
<id column="customer_id" property="customerId"/>
<result column="customer_name" property="customerName"/>
<!-- 一对多的关系 -->
<!-- property: 指的是集合属性的值, ofType:指的是集合中元素的类型 -->
<collection property="orders" ofType="Order">
<id column="order_id" property="orderId"/>
<result column="order_no" property="orderNo"/>
</collection>
</resultMap>
注意事项,使用左外连接而非内连接!!!
2.4.2 多对一
代码语言:javascript复制<resultMap id="many2one" type="Order">
<id column="order_id" property="orderId"/>
<result column="order_no" property="orderNo"/>
<result column="cid" property="cid"/>
<!-- 多对一的关系 -->
<!-- property: 指的是属性的值, javaType:指的是属性的类型-->
<association property="customer" javaType="Customer">
<id column="customer_id" property="customerId"/>
<result column="customer_name" property="customerName"/>
</association>
</resultMap>