Mapper代理开发案例及MyBatis核心

3 篇文章 0 订阅
1 篇文章 0 订阅
文章介绍了MyBatis中使用Mapper代理开发的优势,如解决硬编码问题和简化SQL执行。详细阐述了如何通过定义Mapper接口和配置XML文件实现Mapper代理,避免编写接口实现类,使代码更清晰。同时,解释了配置Mapper接口和SQL映射文件的命名规则,以及核心配置文件的内容和作用。
摘要由CSDN通过智能技术生成

引入

总结,使用mapper代理开发的好处就是可以解决开发中硬编码的问题和简化后期的SQL执行。使用这种方式可以不用写接口的实现类,免除了复杂的方法,使得代码更加清晰易懂按照以前的DAO 开发模式 ,我们有一个写了一个接口类 然后需要写这接口的实现类,现在就是MyBATis 通过帮我们生成了这个实现了。而我们要做的就是配置好这实现类的 XML。

在不使用mapper开发时,我们需要将名称空间和SQL的id传入到sqlSession的参数里面去,而且我们发现里面的参数是写死的,这就是硬编码问题:

SqlSession sqlSession = sqlSessionFactory.openSession();
List<User> users = sqlSession.selectList("test.selectAll");//这里的参数

在Mapper的配置文件里,将来写了很多SQL语句时你还需要一个个查找其id,相当麻烦。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="test">
    <select id="selectAll" resultType="sdut.jsjxy.pojo.User">
        select * from tb_user;
    </select>
</mapper>

如果使用mapper代理开发,则如下代码替换为:

UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> users = userMapper.selectAll();//这里的方法

UserMapper会成为一个接口,一旦获取mapper之后,则可以直接调用其SQL方法。

Mapper代理开发要求

  • 定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置在同一目录下

  • 设置SQL映射文件的namespace属性为Mapper接口全限定名

  • 在Mapper 接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致

  • 通过SqISession的getMapper方法获取Mapper接口的代理对象并调用对应方法完成sql的执行

解析要求

第一步完成之后的开发目录:

设置属性名:

这里的namespace的路径名应该改成接口的路径

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="sdut.jsjxy.mapper.UserMapper">//这里的路径
    <select id="selectAll" resultType="sdut.jsjxy.pojo.User">
        select * from tb_user;
    </select>
</mapper>

在接口里面返回一个User实体类对象,并且是List类型的(我们这里的案例是查询所有,故必须要返回一个集合类型)。

所以Mapper接口里面的代码应为:

public interface UserMapper {

    List<User> selectAll();
}

配置工作都已完成,我们新建一个main方法测试一下。

package sdut.jsjxy;

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 sdut.jsjxy.mapper.UserMapper;
import sdut.jsjxy.pojo.User;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class MyBatisDemo2 {
    public static void main(String[] args) throws IOException {

        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        SqlSession sqlSession = sqlSessionFactory.openSession();

        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        List<User> users = userMapper.selectAll();//前面提到的


        System.out.println(users);
        sqlSession.close();

    }
}

输出结果为:


MyBatis核心

核心配置文件

我们回归头来分析一下mybatis的配置文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://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.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&amp;serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
<!--        <mapper resource="sdut/jsjxy/mapper/UserMapper.xml"/>-->
        <package name="sdut.jsjxy.mapper"/>
    </mappers>

</configuration>

<environments>环境信息

这里是配置数据库信息的地方,我们可以在里面配置多种数据库的连接信息,例如在实际开发中会有生产库和测试库。添加新的环境只需要修改<environment>里面信息即可,比如基本的修改数据库的名称等。通过default属性切换不同的environment。

<typeAliases>类型别名

在mybatsi的范围内为某一个具体的类型设置一个别名,并可以用别名来表示。

<typeAliases>
    <typeAlias type="sdut.jsjxy.pojo.User"/>
</typeAliases>

这里面的type属性就是设置起别名的类型,其中还有一个aligs属性是设置别名的名称,例如aligs="abc"的含义就是把type里的类型名称用"abc"来替代。这个属性大多数情况下是不用写的如果不写的话,那别名启动设置为他的类名切不区分大小写,这里就是"user"或"User"。这是映射文件里的SQL语句的代码就是:

<select id="selectAll" resultType="user">
    select * from tb_user;
</select>

即替换了resultType的属性值为别名,不用写一串路径了。

<mappers>映射文件的引入

这里可以用包的方式引入映射文件。之前我们是用<mapper resource = "">的方式引入,当我们的映射文件一多就需要一个个找了,是十分麻烦的。我们使用包扫描方式引入映射文件,就可以利用IDE的自动补全功能快速引入。

<mappers>
    <package name="sdut.jsjxy.mapper"/>//使用包扫描自动补全
</mappers>

但使用包扫描的前提是mapper接口和映射文件所在的包必须一致,mapper接口的名字和映射文件的名字必须一致,这一点我们之前创建文件时就做好了。(见上面的目录图片)所以以后我们把映射文件都创建在resources的mapper包下就好了。

设置核心配置的模板

到这里mapper的核心配置文件已经讲解完了,那么之后在创建时也拥有了相应的模板,我们在idea里创建一个模板即可。这里给大家展示一下我的模板(注意我的mysql是8.0以上的版本,其他版本写法有所不同),其中[]里的内容是可以换的,大家换成自己的即可,还有数据库账号密码啥的。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "https://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <typeAliases>
        <typeAlias type="[类型路径]"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!--数据库连接信息-->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/[数据库名]?useSSL=false&amp;serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <package name="[映射文件所在包名]"/>
    </mappers>

</configuration>

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值