mybatis部分
前一天我们将设计好的数据库导入到数据库之中,那么我们接下来需要将通过mybatis的生成代码工具mybatis generator生成我们的持久mapper层。
首先我们需要创建一个maven工程,,然后将依赖加入进去。这是完整的pom.iml设置。
<?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>PESystem</groupId>
<artifactId>PESystem</artifactId>
<version>2.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<!-- spring版本号 -->
<spring.version>4.3.4.RELEASE</spring.version>
</properties>
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.18</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.25</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!--pagehelper分页插件-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.4</version>
</dependency>
<!-- 添加mybatis/spring整合包依赖 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
<!--连接池-->
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.3</version>
</dependency>
<!-- 添加spring核心依赖 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</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-oxm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</plugin>
<plugin>
<groupId>org.mybatis.generator</groupId>
<artifactId>mybatis-generator-maven-plugin</artifactId>
<version>1.3.2</version>
<configuration>
<configurationFile>${basedir}/src/main/resources/generator/generatorConfig.xml</configurationFile>
<verbose>true</verbose>
<overwrite>true</overwrite>
</configuration>
<dependencies>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.18</version>
</dependency>
</dependencies>
</plugin>
</plugins>
</build>
</project>
添加generatorConfig.xml文件
路径一定要和上面configurationfile设置的路径一致。
generatorConfig配置文件配置如下:
<?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>
<context id="testTables" defaultModelType="flat" targetRuntime="MyBatis3">
<property name="beginningDelimiter" value="`"/>
<property name="endingDelimiter" value="`"/>
<commentGenerator>
<!-- 是否去除自动生成的注释 true:是 : false:否 -->
<property name="suppressAllComments" value="true" />
<property name="addRemarkComments" value="true"/>
</commentGenerator>
<!--数据库连接的信息:驱动类、连接地址、用户名、密码 -->
<jdbcConnection driverClass="com.mysql.jdbc.Driver"
connectionURL="jdbc:mysql://localhost:3306/pesystem2.0" userId="root"
password="123456">
</jdbcConnection>
<!-- 默认false,把JDBC DECIMAL 和 NUMERIC 类型解析为 Integer,为 true时把JDBC DECIMAL 和
NUMERIC 类型解析为java.math.BigDecimal -->
<javaTypeResolver>
<property name="forceBigDecimals" value="false" />
</javaTypeResolver>
<!-- targetProject:生成PO类的位置 -->
<javaModelGenerator targetPackage="com.pesystem.po"
targetProject="src/main/java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
<!-- 从数据库返回的值被清理前后的空格 -->
<property name="trimStrings" value="true" />
</javaModelGenerator>
<!-- targetProject:mapper映射文件生成的位置
如果maven工程只是单独的一个工程,targetProject="src/main/java"
若果maven工程是分模块的工程,targetProject="所属模块的名称",例如:
targetProject="ecps-manager-mapper",下同-->
<sqlMapGenerator targetPackage="com.pesystem.mapper"
targetProject="src/main/java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</sqlMapGenerator>
<!-- targetPackage:mapper接口生成的位置 -->
<javaClientGenerator type="XMLMAPPER"
targetPackage="com.pesystem.mapper"
targetProject="src/main/java">
<!-- enableSubPackages:是否让schema作为包的后缀 -->
<property name="enableSubPackages" value="false" />
</javaClientGenerator>
<!-- 指定数据库表,使用%可以把所有的表都生成出来-->
<table tableName="%"></table>
</context>
</generatorConfiguration>
配置来源于网络~~
执行generatorConfig文件
不同的编译软件有不同的方法,我这里执行是通过idea自带插件执行的。
image.png
如果需要其他方法,自行百度。
主要方法:
1 通过maven
2 通过eclipse
3 通过java方法
结果检查
哦对了,差点忘了。设置mapper接口和映射文件的位置一定一定要一致,不然的话,一会儿spring的扫描器是扫不到mapper的,装配那肯定会失败。这里就不得不提到一些规范,推荐使用。(如果你要用基于ibatis的dao层开发的话,就需要通过设置@Repository注解,装配,具体的在这里我没有实现)。
mapper代理的话需要遵循一些规范
1.源码名称XXMapper.java和XXMapper.xml
2.两个文件需要放在同一个目录下
这样的目的,不只是为了spring扫描器能够扫描到,而且就算你不用spring整合,但是如果你不想一个个写映射文件<mapper>标签,那么就用package的方式去设置(也是需要上面写的两点规范)。
当然现在在整合spring就不用写了~~~
![生成的结果.png](https://img.haomeiwen.com/i13539521/0b6cafd270fcfc7b.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
我们可以看出都生成好了,没有遗漏。当然如果你想你也是可以先测试一下,是否好用(自动生成的方法名字我是真的很不喜欢~~)。
#spring部分
###引入spring包,spring和mybatis整合包
通过spring,version更好控制版本
取缔mybatisConfig文件
添加配置文件
jdbc.user=root
jdbc.password=123456
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql://localhost:3306/pesystem2.0
修改配置mybatisconfig配置文件
将环境配置,数据源和mappers可以删除了,交给spring处理。
<?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>
<plugins>
<!-- com.github.pagehelper为PageHelper类所在包名 -->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!-- 使用下面的方式配置参数,后面会有所有的参数介绍 -->
</plugin>
</plugins>
</configuration>
里面还可以放其他东西,这里的分页插件配置忽略它,还没有将mybatis和spring整合。
配置springConfig
在这我们需要做的事情有:
- 配置数据源
- mapper批量扫描,自动装配
- 装配 sqlSessionFaculty,装配mybatisConfig文件。
<?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"
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">
<!-- 加载配置文件 -->
<context:property-placeholder location="classpath:db.properties"/>
<!--设置数据源-->
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="username" value="${jdbc.user}"/>
<property name="password" value="${jdbc.password}"/>
<property name="url" value="${jdbc.jdbcUrl}"/>
<property name="driverClassName" value="${jdbc.driverClass}"/>
<property name="maxActive" value="10"/>
<property name="maxIdle" value="5"/>
</bean>
<!--设置sqlSessionFaculty-->
<bean id="sqlSessionFaculty" class="org.mybatis.spring.SqlSessionFactoryBean">
<!--加载mybatisConfig配置文件-->
<property name="configLocation" value="mybatis/mybatisConfig.xml"/>
<property name="dataSource" ref="dataSource"/>
</bean>
<!--完美整合方式.spring扫描器-->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.pesystem.mapper"/>
</bean>
</beans>
测试
package com.pesystem.mapper;
import com.pesystem.po.FacultyExample;
import org.apache.log4j.Logger;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {"classpath:springConfig/springConfig.xml"})
public class FacultyMapperTest {
//获取日志记录器Logger,名字为本类类名
private static Logger log = Logger.getLogger(String.valueOf(FacultyMapperTest.class));
@Autowired
private FacultyMapper facultyMapper;
@Test
public void testCountByExample(){
log.debug("facultyMapper获取结果:"+facultyMapper);
}
}
测试结果:
测试结果.png
当然不能只是测试获取到对象,我们还需要测试方法能不能正常使用。
测试insert方法:
@Test
public void testInsert(){
Faculty faculty = new Faculty();
faculty.setFacultyName("作者:BarkLuc,不得转载。。。。");
facultyMapper.insert(faculty);
}
但是出现异常
java.lang.AbstractMethodError: org.mybatis.spring.transaction.SpringManagedTransaction.getTimeout()Ljava/lang/Integer;
问题原因:
spring和mybatis的版本不匹配
解决方案:
将spring的版本调整到4.3.4.RELEASE
版本对应:
`
包对应.png
ok,让我们在测试一下。
org.springframework.jdbc.BadSqlGrammarException:
### Error updating database. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'pesystem.faculty' doesn't exist
### The error may involve com.pesystem.mapper.FacultyMapper.insert-Inline
### The error occurred while setting parameters
### SQL: insert into faculty (faculty_id, faculty_name) values (?, ?)
### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Table 'pesystem.faculty' doesn't exist
哎哟,我去~~咋表不见了。看看配置文件原来是自己的数据库名字写错了。
修改后测试:
DEBUG [main] - ==> Preparing: insert into faculty (faculty_id, faculty_name) values (?, ?)
DEBUG [main] - ==> Parameters: null, BarkLuc,不得转载。。。。(String)
DEBUG [main] - <== Updates: 1
啦啦啦,测试成功。
溜了溜了。mybatis的实践就基本到此结束。
喜欢本文,或者本文对你有帮助,可以点个喜欢。
如果有问题,可以在评论区,我们共同讨论3Q~~~~
网友评论