欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring + Mybatis应该如何配置

程序员文章站 2022-03-24 13:00:47
### 1. MYBATIS简介 MYBATIS是持久层框架,大大的简化了持久层开发。 当使用MYBATIS框架时,开发人员不必再编写繁琐的JDBC代码,只需要定义好每个功能对应的抽象方法与需要执行的SQL语句即可! ### 2. 基本使用 #### 2.1. 添加依赖 需要在`pom.xml`中添 ......

### 1. mybatis简介

mybatis是持久层框架,大大的简化了持久层开发。

当使用mybatis框架时,开发人员不必再编写繁琐的jdbc代码,只需要定义好每个功能对应的抽象方法与需要执行的sql语句即可!

### 2. 基本使用

#### 2.1. 添加依赖

需要在`pom.xml`中添加mybatis的依赖:

    <dependency>
        <groupid>org.mybatis</groupid>
        <artifactid>mybatis</artifactid>
        <version>3.4.6</version>
    </dependency>

然后添加mybatis整合spring的依赖:

    <dependency>
        <groupid>org.mybatis</groupid>
        <artifactid>mybatis-spring</artifactid>
        <version>1.3.2</version>
    </dependency>

其底层实现是基于jdbc的,所以,还需要添加`spring-jdbc`的依赖,需要注意的是:此次使用的版本必须与`spring-webmvc`的保持一致:

    <dependency>
        <groupid>org.springframework</groupid>
        <artifactid>spring-jdbc</artifactid>
        <version>4.3.9.release</version>
    </dependency>

根据使用的数据库,添加数据库连接驱动的依赖:

    <dependency>
        <groupid>mysql</groupid>
        <artifactid>mysql-connector-java</artifactid>
        <version>8.0.13</version>
    </dependency>

添加数据源的依赖:

    <dependency>
        <groupid>commons-dbcp</groupid>
        <artifactid>commons-dbcp</artifactid>
        <version>1.4</version>
    </dependency>

#### 2.2. 数据库连接

在`src/main/resources`下创建`db.properties`文件,用于配置数据库连接的相关信息:

#数据库驱动
driver=com.mysql.cj.jdbc.driver
#数据库连接
url=jdbc:mysql://localhost:3306/tedu_ums?useunicode=true&characterencoding=utf-8&servertimezone=asia/shanghai
#数据库用户名
username=root
#数据库密码
password=
#数据库连接池初始连接数
initialsize=3
#数据库连接池最连接线程数
maxactive=5


在项目中准备名为`spring-dao.xml`的spring配置文件,并加载以上数据库的配置文件:

    <!-- 加载数据库的配置文件 -->
    <util:properties id="dbconfig" 
        location="classpath:db.properties" />

然后,将以上读取到的配置值应用于数据源`basicdatasource`中:

    <!-- 配置数据源 -->
    <bean class="org.apache.commons.dbcp.basicdatasource">
        <property name="url" 
            value="#{dbconfig.url}" />
        <property name="driverclassname"
            value="#{dbconfig.driver}" />
        <property name="username"
            value="#{dbconfig.username}" />
        <property name="password"
            value="#{dbconfig.password}" />
        <property name="initialsize"
            value="#{dbconfig.initialsize}" />
        <property name="maxactive"
            value="#{dbconfig.maxactive}" />
    </bean>

以上配置时,各文件之间的关系如下图所示:

Spring + Mybatis应该如何配置

完成后,可以通过单元测试,以测试是否可以正确的获取到数据库的连接:

    public class connectiontestcase {
    
        @test
        public void getconnection() throws sqlexception {
            abstractapplicationcontext ac
                = new classpathxmlapplicationcontext(
                        "spring-dao.xml");
            
            datasource datasource = 
                    ac.getbean("datasource", datasource.class);
            
            system.out.println(datasource.getconnection());
            
            ac.close();
        }
        
    }

#### 2.3. 创建实体类

每张数据表都应该有1个对应的实体类,所以,创建`cn.tedu.mybatis.entity.user`类,属性的数量与类型请参考数据表的设计:

    public class user implements serializable {

        private static final long serialversionuid = 7323921614984096421l;
    
        private integer id;
        private string username;
        private string password;
        private integer age;
        private string phone;
        private string email;
        // set/get,tostring()
    }

#### 2.4. 创建接口,声明抽象方法

创建`cn.tedu.mybatis.mapper.usermapper`接口,并在接口中声明“插入用户数据”的抽象方法:

    public interface usermapper {
    
        integer addnew(user user);
        
    }


关于抽象方法,在mybatis中,执行的操作如果是增、删、改,返回值均使用`integer`,表示受影响的行数;方法的名称可以自定义,只要不违反java的命名规则即可,另外,不允许在接口中使用重载机制;参数也可以自定义,如果执行的是增加操作,参数应该是与数据表对应的实体类的类型。

#### 2.5. 配置接口所在的包

在mybatis中,通过`mapperscannerconfigurer`类扫描持久层接口的,所以,应该在`spring-dao.xml`文件中进行配置:

    <!-- mapperscannerconfigurer -->
    <bean class="org.mybatis.spring.mapper.mapperscannerconfigurer">
        <!-- 配置接口文件所在的包 -->
        <property name="basepackage"
            value="cn.tedu.mybatis.mapper" />
    </bean>

从ftp下载`somemapper.zip`压缩包,得到`somemapper.xml`文件。

在`src/main/resources`下创建名为`mappers`文件夹,然后将`somemapper.xml`重命名为`usermapper.xml`,并粘贴到`mappers`文件夹下:

Spring + Mybatis应该如何配置

> 其实,这些xml文件的名称并不重要,可以*命名,通常,推荐使用与接口文件相同的名称,便于管理。

然后,编写`usermapper.xml`文件中的内容,首先,根节点必须是`<mapper>`,且根节点的`namespace`表示对应的接口文件,然后,添加子节点,以对应接口中的抽象方法:

Spring + Mybatis应该如何配置

#### 2.7. 配置xml文件的位置与数据源

mybatis通过`sqlsessionfactorybean`获取数据源,并且扫描配置了sql语句的xml文件,最终由mybatis框架来执行sql语句,所以,需要在`spring-dao.xml`中配置`sqlsessionfactorybean`:

    <!-- sqlsessionfactorybean -->
    <bean class="org.mybatis.spring.sqlsessionfactorybean">
        <!-- 数据源,值为以上配置basicdatasource节点的bean-id -->
        <property name="datasource" 
            ref="datasource" />
        <!-- xml文件在哪里 -->
        <property name="mapperlocations" 
            value="classpath:mappers/*.xml" />
    </bean>

#### 2.8. 单元测试

    public class usermappertestcase {
    
        abstractapplicationcontext ac;
        usermapper mapper;
        
        @before
        public void dobefore() {
            ac = new classpathxmlapplicationcontext("spring-dao.xml");
            mapper = ac.getbean("usermapper", usermapper.class);
        }
        
        @after
        public void doafter() {
            ac.close();
        }
        
        @test
        public void addnew() {
            user user = new user();
            user.setusername("刘gb");
            user.setpassword("666");
            integer rows = mapper.addnew(user);
            system.out.println("rows=" + rows);
        }
        
    }

### 3. 查询数据

#### 3.1. 根据id查询某个用户的信息

首先,在`usermapper.java`接口中添加该功能对应的抽象方法:

user findbyid(integer id);

 

> 查询方法的返回可以根据所需要的类型来决定。

然后,在`usermapper.xml`映射文件中添加新的节点配置抽象方法对应的sql语句:

    <select id="findbyid"
        resulttype="cn.tedu.mybatis.entity.user">
        select 
            id, username, 
            password, age, 
            phone, email
        from 
            t_user
        where 
            id=#{id}
    <select>

> 执行查询时,`<select>`节点中必须配置`resulttype`属性(或者是`resultmap`属性)。

以上方法执行时,如果查询到匹配的数据,则返回有效的user对象,如果没有匹配的数据,则返回null。