MyBatis映射文件的使用

本文详细介绍MyBatis框架的使用,包括映射文件配置、主键获取、参数处理、SQL预编译与注入防护等核心功能。并通过实例演示增删改查操作。

0.前言

使用MyBatis会节省很多代码,只需要写一个接口,并且在映射文件中写sql语句,就能很快速的完成需求。先来看一个简单的增删改查。
接口:

public interface AdminMapper {
    void insert(Admin admin);
    void delete(Integer id);
    void update(Admin admin);
    Admin getAdmin(Integer id);
}

程序:

public class TestMain {
    public SqlSessionFactory getSqlSessionFactory() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream resourceAsStream = Resources.getResourceAsStream(resource);
        return new SqlSessionFactoryBuilder().build(resourceAsStream);
    }
    @Test
    public void Test_1() throws IOException {
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        SqlSession openSession = sqlSessionFactory.openSession();
        try {
            AdminMapper mapper = openSession.getMapper(AdminMapper.class);
            //增加一个admin
            Admin admin = new Admin(null,"xiaoming","123456");
            mapper.insert(admin);
            //获取一个admin
            Admin admin1 = mapper.getAdmin(1);
            System.out.println(admin.toString());
            //删除
            mapper.delete(6);
            //更新
            Admin admin2 = new Admin(1,"jjjj","123456");
            mapper.update(admin2);
            openSession.commit();
        } finally {
            openSession.close();
        }
    }
}

映射配置文件:

<?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.liulu.mybatis.dao.AdminMapper">
    <select id="getAdmin" resultType="com.liulu.mybatis.domain.Admin">
    select * from admin where id = #{id}
  </select>
    <insert id="insert" >
        insert into admin(username,password)
        value (#{username},#{password})
    </insert>
    <delete id="delete">
        delete from admin
        where id = #{id}
    </delete>
    <update id="update">
        update admin
        set username = #{username},
            password = #{password}
        where id = #{id}
    </update>
</mapper>

本文主要讲映射文件的使用,也算是一个复习的笔记,在官方文档中也有介绍:http://www.mybatis.org/mybatis-3/zh/sqlmap-xml.html

1.insert获取主键的值

在jdbc中获取主键的值可以使用statement.getGenreatedKeys()方法来获取,在MyBatis中对映射文件进行相应的配置就可以自动的封装在javaBean中了。useGeneratedKeys=“true”:表示使用自增主键属性, keyProperty=“id”:将自增的主键赋值给id

<insert id="insert" useGeneratedKeys="true" keyProperty="id">
        insert into admin(username,password)
        value (#{username},#{password})
</insert>

执行这段代码将会得到自增的主键。

AdminMapper mapper = openSession.getMapper(AdminMapper.class);
//增加一个admin
Admin admin = new Admin(null,"alu4r","123456");
mapper.insert(admin);
System.out.println(admin.getId());

2.参数的处理

当接口中定义了多个方法时,将不能使用#{…}的方式:

<select id="getAdmin" resultType="com.liulu.mybatis.domain.Admin">
 	select * from admin where id = #{id} and username = #{username}
</select>

这样使用将会出现异常:
在这里插入图片描述
提示找不到参数id,在xml中只能写成paramx的形式。比如
在这里插入图片描述
需要这样使用才不会出错。

2.1 使用注解@Param(“…”)

**如果需要写成#{id}、#{usernaem}**的方式就需要在接口声明方法的时候这样做:

Admin getAdmin(@Param("id") Integer id,@Param("username") String username);

2.2 使用java Bean

新建一个类,数据成员写相应的属性

public class ParamBean {
    Integer id;
    String username;
    public ParamBean(Integer id, String username) {
        this.id = id;
        this.username = username;
    }
}
_____________________________________________________
@Test
public void Test_1() throws IOException {
    String resource = "mybatis-config.xml";
    InputStream resourceAsStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream);
    SqlSession openSession = sqlSessionFactory.openSession();
    try {
        AdminMapper mapper = openSession.getMapper(AdminMapper.class);
        //增加一个admin
        Admin admin = mapper.getAdmin(new ParamBean(7,"alu4rP"));
        System.out.println(admin.toString());
        openSession.commit();
    } finally {
        openSession.close();
    }
}

这个java Bean被称作数据传输对象TO
此外当传入的参数是一个map的时候,在映射文件中写sql的时候可以使用 "#{map中的key} "就可以直接获取键对应的值。那么如果传的是一个List或者数组,那么我们需要通过#{list[0]}或者#{array[0]}来引用

3.#和$的区别

在这里插入图片描述
在这里插入图片描述
通过测试我们可以发现#是已占位符的方式来预编译sql语句的,而KaTeX parse error: Expected 'EOF', got '#' at position 7: 则不是,使用#̲可以防止sql注入。此外我们在…,比如有多个表2016_info、2017_info、2018_info,使用${year}_info来拼接表名,而且sql中不允许使用#的方式来为表名做占位符。

4.查询返回类型

当需要返回一个List的时候,resultType中设置list包装的类型,myBatis会自动把他转为list。
在这里插入图片描述

当返回Map<String,Admin>时,需要设置key由什么来充当:
在这里插入图片描述

5.reslutMap

他的作用就是定义映射规则、级联的更新。定义结果映射集的关系,也就是sql到javaBean的关系。通过官方文档有以下几个标签:
在这里插入图片描述
结果映射写在这里
在这里插入图片描述

6.结束语

主要把比较重要的列出来,具体使用的时候可以直接看文档。
不对之处!请多指教。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值