美文网首页
从零搭建数据库持久层(二)mybatis和spring整合

从零搭建数据库持久层(二)mybatis和spring整合

作者: 探索的影子 | 来源:发表于2018-08-14 19:03 被阅读0次

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~~~~

相关文章

网友评论

      本文标题:从零搭建数据库持久层(二)mybatis和spring整合

      本文链接:https://www.haomeiwen.com/subject/pqyvbftx.html