MyBatis_XML映射文件

4. XML - 映射文件

MyBatis 的真正强大在于它的语句映射,MyBatis 致力于减少使用成本,让用户能更专注于 SQL 代码。

SQL 映射文件只有很少的几个顶级元素(只列出常用元素):

  • select – 映射查询语句。
  • insert – 映射插入语句。
  • update – 映射更新语句。
  • delete – 映射删除语句。
  • sql – 可被其它语句引用的可重用语句块。
  • resultMap – 描述如何从数据库结果集中加载对象,是最复杂也是最强大的元素。
4.1. select

查询语句是 MyBatis 中最常用的元素之一,能把数据存到数据库中价值并不大,还要能重新取出来才有用,多数应用也都是查询比修改要频繁。前面我们写了一个比较简单的select

<select id="selectOne" parameterType="int" resultType="com.czxy.mybatis.model.User">
    SELECT
    uid,
    username,
    birthday,
    phone,
    sex,
    address
    FROM `user`
    WHERE uid = #{aa}
</select>

这个语句名为selectOne,接受一个 int(或 Integer)类型的参数,并返回一个 User类型的对象.

    @Test
    public void selectOne()throws IOException {
   
        //配置文件位置
        String resource = "mybatis-config.xml";
        //读取配置文件
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //通过配置文件创建SessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //SqlSession 提供了在数据库执行 SQL 命令所需的所有方法。
        //可以通过 SqlSession 实例来直接执行已映射的 SQL 语句
        //读取数据库连接
        SqlSession sqlSession = sqlSessionFactory.openSession();

        //通过 namespace.id的方式确定要执行的SQL片段
        User user = sqlSession.selectOne("test.selectOne",12);
        System.out.println(user);
        //用完后必须管理连接
        sqlSession.close();
    }
4.1.1. 参数符号

注意参数符号:#{aa}

这就告诉 MyBatis 创建一个预处理语句(PreparedStatement)参数,在 JDBC 中,这样的一个参数在 SQL 中会由一个“?”来标识,

这样做更安全,更迅速,通常也是首选做法,因为参数会被双引号 “” 包裹,避免SQL注入,上述语句对应的SQL:

#<!-- #{id}表示占位符:获取传递的参数    ${id}原封不动的拼接-->
   
SELECT
    uid,
    username,
    birthday,
    phone,
    sex,
    address
FROM `user`
WHERE uid = "10"

参数符号还有另外一种方式: ${id}

有时你就是想直接在 SQL 语句中直接插入一个不转义的字符串。 比如 ORDER BY 子句,这时候你可以:

ORDER BY ${columnName}
-- mapper
SELECT 
  uid,
  username,
  birthday,
  phone,
  sex,
  address
FROM `user`
ORDER BY ${columnName} DESC

-- 对应的SQL
SELECT 
  uid,
  username,
  birthday,
  phone,
  sex,
  address
FROM `user`
ORDER BY uid DESC -- 这里的列名就没有被双引号包裹
4.1.2. 参数类型

parameterType 用于明确参数类型,可以指定这条语句的参数类的全限定名或别名。

这个属性是可选的,因为 MyBatis 可以通过类型处理器(TypeHandler)推断出具体传入语句的参数,默认值为未设置(unset)

  • 参数只有一个
    • int / java.lang.Integer
    • string
    • float
    • double
    • date
  • 参数有多个
    • parameterType=“map” / java.util.HashMap
    • user / com.czxy.mybatis.model.User
  • 使用map和pojo类型传参

UserMapper.xml

<!--参数是map类型  需求:根据手机号或者性别进行查询-->
<select id="listUser" parameterType="map" resultType="user">
    SELECT
    uid,
    username,
    birthday,
    phone,
    sex,
    address
    FROM `user`
    WHERE sex = #{sex}
    AND phone like #{phone}
</select>

MyBatisTest类

@Test
public void listUser() throws IOException {
   
    String resource = "mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
    //通过sqlSession获取与数据库的会话连接,完成各种SQL的执行
    SqlSession sqlSession = sqlSessionFactory.openSession();

    //准备查询参数
    //1. pojo类型
    //User user = new User();
    //user.setPhone("%"+888+"%");
    //user.setSex("1");

    //2.map类型参数,注意key必须和占位符名称一致#{key},否则获取不到参数
    HashMap<String, Object> map = new HashMap<>();
    map.put("phone","%"+888+"%");
    map.put("sex","1");

    //通过 namespace.id的方式确定要执行的SQL片段
    //List<User> list = sqlSession.selectList("test.listUser", user);
    List<User> list = sqlSession.selectList("test.listUser", map);

    for (User u : list) {
   
        System.out.println(u);
    }
    //用完后必须管理连接
    sqlSession.close()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值