sping mybatis使用XML和注解进行映射器的实现

68 篇文章 0 订阅
40 篇文章 0 订阅

映射器的实现

映射器的主要作用就是将SQL查询到的结果映射为一个POJO,或者将POJO的数据插入数据库中。本节介绍两种实现映射器的方式,XML方式和注解方式。

一、XML方式

项目情况截图

 

定义POJO

新建maven工程,导入依赖,

<?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">
    <parent>
        <artifactId>springtest09</artifactId>
        <groupId>com.shrimpking</groupId>
        <version>1.0-SNAPSHOT</version>
    </parent>
    <modelVersion>4.0.0</modelVersion>

    <artifactId>springmybatis-02-test</artifactId>

    <dependencies>
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.3.0</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.12</version>
        </dependency>
    </dependencies>

    <build>
        <resources>
            <resource>
                <directory>src/main/java</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
            <resource>
                <directory>src/main/resources</directory>
                <includes>
                    <include>**/*.properties</include>
                    <include>**/*.xml</include>
                </includes>
                <filtering>false</filtering>
            </resource>
        </resources>
    </build>
</project>

在实现映射器之前需要定义一个POJO,具体代码如下:

Role.java

package com.shrimpking.code01.pojo;

public class Role
{
    private long id;
    private String roleName;
    private String note;

    public Role()
    {
    }

    public Role(long id, String roleName, String note)
    {
        this.id = id;
        this.roleName = roleName;
        this.note = note;
    }

    public long getId()
    {
        return id;
    }

    public void setId(long id)
    {
        this.id = id;
    }

    public String getRoleName()
    {
        return roleName;
    }

    public void setRoleName(String roleName)
    {
        this.roleName = roleName;
    }

    public String getNote()
    {
        return note;
    }

    public void setNote(String note)
    {
        this.note = note;
    }

    @Override
    public String toString()
    {
        return "Role{" + "id=" + id + ", roleName='" + roleName + '\'' + ", note='" + note + '\'' + '}';
    }
}

 数据库,建表

create table w_role(
	id int not null auto_increment primary key,
	role_name varchar(50) not null,
	note varchar(50) null
)

insert into w_role values(null,'worker','worker');
insert into w_role values(null,'worker2','worker');
insert into w_role values(null,'worker3','worker');
insert into w_role values(null,'worker4','worker');

采用XML方式实现映射器

采用XML方式定义映射器分为两个部分:接口和XML。先定义一个映射器接口,代码如下:

RoleMapper.java

package com.shrimpking.code01.mapper;

import com.shrimpking.code01.pojo.Role;

/**
 * @author user1
 */
public interface RoleMapper
{
    public Role getRole(long id);
}

采用XML方式创建映射器,代码如下:

RoleMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.shrimpking.code01.mapper.RoleMapper">
    <select id="getRole" parameterType="long" resultType="role">
        select id,
        role_name as roleName,
        note
        from w_role
        where id = #{id}
    </select>

</mapper>

有了这两个文件,就完成了一个映射器的定义。

XML文件中,<mapper>元素的属性namespace对应的是一个接口的全限定名,于是MyBatis上下文就可以通过它找到对应的接口。

在mybatis.xml中配置数据库连接,以及mapper映射的关系。

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

    <!--  起别名  -->
    <typeAliases>
        <package name="com.shrimpking.code01.pojo"/>
    </typeAliases>

    <!--  环境  -->
    <environments default="development">
        <environment id="development">
            <!-- 默认事务管理           -->
            <transactionManager type="JDBC"/>
            <!-- 默认的数据库连接            -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=utf-8&amp;useSSL=false&amp;serverTimeZone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="mysql123"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="com/shrimpking/code01/mapper/RoleMapper.xml"/>
    </mappers>
</configuration>

编写测试类

RoleTest.java

package com.shrimpking.code01;

import com.shrimpking.code01.mapper.RoleMapper;
import com.shrimpking.code01.pojo.Role;
import com.shrimpking.utils.DaoUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.io.IOException;

public class RoleTest
{
    @Test
    public void testGetRole() throws IOException
    {
        SqlSession sqlSession = DaoUtils.getSqlSession("code01/mybatis.xml");
        RoleMapper mapper = sqlSession.getMapper(RoleMapper.class);
        Role role = mapper.getRole(1L);
        System.out.println(role);
        sqlSession.close();
    }
}

 DaoUtils.java

package com.shrimpking.utils;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.Reader;

/**
 * @author user1
 */
public class DaoUtils
{
    private static Reader reader;
    private static SqlSessionFactory sqlSessionFactory;

    public static SqlSession getSqlSession(String config) throws IOException
    {
        try
        {
            reader = Resources.getResourceAsReader(config);
            //
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);

        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            reader.close();
        }
        return sqlSessionFactory.openSession();
    }
}

运行截图

 

二、注解方式

 项目情况截图

定义pojo

 Role.java

package com.shrimpking.code02.pojo;

public class Role
{
    private long id;
    private String roleName;
    private String note;

    public Role()
    {
    }

    public Role(long id, String roleName, String note)
    {
        this.id = id;
        this.roleName = roleName;
        this.note = note;
    }

    public long getId()
    {
        return id;
    }

    public void setId(long id)
    {
        this.id = id;
    }

    public String getRoleName()
    {
        return roleName;
    }

    public void setRoleName(String roleName)
    {
        this.roleName = roleName;
    }

    public String getNote()
    {
        return note;
    }

    public void setNote(String note)
    {
        this.note = note;
    }

    @Override
    public String toString()
    {
        return "Role{" + "id=" + id + ", roleName='" + roleName + '\'' + ", note='" + note + '\'' + '}';
    }
}

 数据库

create table w_role(
	id int not null auto_increment primary key,
	role_name varchar(50) not null,
	note varchar(50) null
)

insert into w_role values(null,'worker','worker');
insert into w_role values(null,'worker2','worker');
insert into w_role values(null,'worker3','worker');
insert into w_role values(null,'worker4','worker');

采用注解方式实现映射器

除采用XML方式定义映射器外,还可以采用注解方式定义映射器,它只需要一个接口就可以通过MyBatis的注解来注入SQL语句,代码如下:

RoleMapper.java

package com.shrimpking.code02.mapper;

import com.shrimpking.code01.pojo.Role;
import org.apache.ibatis.annotations.Select;

/**
 * @author user1
 */
public interface RoleMapper
{
    @Select("select id,role_name as roleName,note from w_role where id = #{id}")
    public Role getRole(long id);
}

在mybaits.xml中配置数据源和映射关系。

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

    <!--  环境  -->
    <environments default="development">
        <environment id="development">
            <!-- 默认事务管理           -->
            <transactionManager type="JDBC"/>
            <!-- 默认的数据库连接            -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/test?useUnicode=true&amp;characterEncoding=utf-8&amp;useSSL=false&amp;serverTimeZone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="mysql123"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper class="com.shrimpking.code02.mapper.RoleMapper"/>
    </mappers>
</configuration>

采用注解方式创建映射器完全等同于采用XML方式创建映射器。如果同时采用两种方式定义,XML方式将会覆盖注解方式,所以MyBatis官方推荐使用XML方式。此外,XML方式可以相互引入,而注解不可以,所以在复杂场景下,采用XML方式会更加灵活和方便。

编写测试类

RoleTest.java

package com.shrimpking.code02;

import com.shrimpking.code01.pojo.Role;
import com.shrimpking.code02.mapper.RoleMapper;
import com.shrimpking.utils.DaoUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.io.IOException;

public class RoleTest
{
    @Test
    public void test() throws IOException
    {
        SqlSession sqlSession = DaoUtils.getSqlSession("code02/mybatis.xml");
        RoleMapper mapper = sqlSession.getMapper(RoleMapper.class);
        Role role = mapper.getRole(2L);
        System.out.println(role);
        sqlSession.close();
    }
}

运行截图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虾米大王

有你的支持,我会更有动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值