Mybatis二

1 Mybatis的映射文件

1.1 #和$的区别?

1.1.1 #和$的相同点

  • 都是可以从map中获取值或者pojo对象的值

1.1.2 #和$的不同点

  • #{}以预编译的形式,将参数设置到sql语句中。
  • ${}取出的值直接拼接在sql语句中,但是可能会有SQL注入问题。
  • 示例:

    • EmployeeMapper.java  
package com.xuweiwei.mybatis.mapper;

import com.xuweiwei.mybatis.pojo.Employee;
import org.apache.ibatis.annotations.Param;

public interface EmployeeMapper {

    Employee fineEmployeeByIdAndName(@Param("id") Integer id, @Param("lastName") String lastName);

}
    • EmployeeMapper.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">
<!--namespace命名空间  指定接口的全类名-->
<mapper namespace="com.xuweiwei.mybatis.mapper.EmployeeMapper">

    <select id="fineEmployeeByIdAndName" resultType="com.xuweiwei.mybatis.pojo.Employee">
        select * from employee where id = ${id} and last_name = #{lastName}
    </select>
</mapper>
    • 测试  

package com.xuweiwei.mybatis.test;

import com.xuweiwei.mybatis.mapper.EmployeeMapper;
import com.xuweiwei.mybatis.pojo.Employee;
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 org.junit.Test;

import java.io.IOException;
import java.io.InputStream;

public class MybatisTest {

    /**
     * 测试增加
     * @throws IOException
     */
    @Test
    public void test() throws IOException {
        /**
         * 创建SqlSessionFactory对象
         */
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        /**
         * 创建SqlSession
         */
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);

        Employee employee = employeeMapper.fineEmployeeByIdAndName(1, "许威威");

        System.out.println(employee);

        sqlSession.close();
    }

}

  • ${}的应用场景:
  • ①分库分表的时候,可以使用${}
select * from ${year}_salary;
  • ②排序
select * from employee order by ${orderColumn} ${order}
  • ③表名
select * from ${tableName}

1.2 select返回

1.2.1 select返回List集合

  • 如果select语句返回的是List集合之类的,在select标签中的resultType只需要写List集合中元素的类型即可。
  • 示例:

    • EmployeeMapper.java  
package com.xuweiwei.mybatis.mapper;

import com.xuweiwei.mybatis.pojo.Employee;

import java.util.List;

public interface EmployeeMapper {

    List<Employee> findEmployeeListLikeLastName(String lastName);

}
    • EmployeeMapper.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">
<!--namespace命名空间  指定接口的全类名-->
<mapper namespace="com.xuweiwei.mybatis.mapper.EmployeeMapper">

    <select id="findEmployeeListLikeLastName" resultType="com.xuweiwei.mybatis.pojo.Employee">
        select * from employee where last_name like #{lastName}
    </select>
</mapper>
    • 测试  

package com.xuweiwei.mybatis.test;

import com.xuweiwei.mybatis.mapper.EmployeeMapper;
import com.xuweiwei.mybatis.pojo.Employee;
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 org.junit.Test;

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

public class MybatisTest {

    /**
     * 测试增加
     * @throws IOException
     */
    @Test
    public void test() throws IOException {
        /**
         * 创建SqlSessionFactory对象
         */
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        /**
         * 创建SqlSession
         */
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
        List<Employee> employeeList = employeeMapper.findEmployeeListLikeLastName("%许%");
        for (Employee employee : employeeList) {
            System.out.println(employee);
        }

        sqlSession.close();
    }
}

  • 示例:对应的注解写法:
package com.xuweiwei.mybatis.mapper;

import com.xuweiwei.mybatis.pojo.Employee;
import org.apache.ibatis.annotations.ResultType;
import org.apache.ibatis.annotations.Select;

import java.util.List;

public interface EmployeeMapper {

    @ResultType(Employee.class)
    @Select(" select * from employee where id = #{id} ")
    List<Employee> findEmployeeListLikeLastName(String lastName);

}

1.2.2 select返回Map

  • map中的key就是列名,value就是对应的值。
  • 示例:

    • EmployeeMapper.java  
package com.xuweiwei.mybatis.mapper;

import java.util.Map;

public interface EmployeeMapper {

    Map<String,Object> selectEmployeeById(Integer id);

}
    • EmployeeMapper.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">
<!--namespace命名空间  指定接口的全类名-->
<mapper namespace="com.xuweiwei.mybatis.mapper.EmployeeMapper">

    <select id="selectEmployeeById" resultType="java.util.Map">
        select * from employee where id = #{id}
    </select>

</mapper>
    • 测试  

package com.xuweiwei.mybatis.test;

import com.xuweiwei.mybatis.mapper.EmployeeMapper;
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 org.junit.Test;

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

public class MybatisTest {

    /**
     * 测试增加
     *
     * @throws IOException
     */
    @Test
    public void test() throws IOException {
        /**
         * 创建SqlSessionFactory对象
         */
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        /**
         * 创建SqlSession
         */
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
        Map<String, Object> map = employeeMapper.selectEmployeeById(1);

        for (Map.Entry<String, Object> m : map.entrySet()) {
            System.out.println("key:" + m.getKey());
            System.out.println("value:" + m.getValue());
        }

        sqlSession.close();
    }

}

  • 示例:对应的注解写法
package com.xuweiwei.mybatis.mapper;

import org.apache.ibatis.annotations.ResultType;
import org.apache.ibatis.annotations.Select;

import java.util.Map;

public interface EmployeeMapper {

    @ResultType(Map.class)
    @Select("select * from employee where id = #{id}")
    Map<String,Object> selectEmployeeById(Integer id);

}
  • Map中的key是主键,value是对应的对象
  • 示例:

    • EmployeeMapper.java  
package com.xuweiwei.mybatis.mapper;

import com.xuweiwei.mybatis.pojo.Employee;
import org.apache.ibatis.annotations.MapKey;

import java.util.Map;

public interface EmployeeMapper {

    /**
     * 使用注解MapKey告诉Mybatis那个是key
     * @return
     */
    @MapKey("id")
    Map<Integer, Employee> findEmployeeMap();

}
    • EmployeeMapper.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">
<!--namespace命名空间  指定接口的全类名-->
<mapper namespace="com.xuweiwei.mybatis.mapper.EmployeeMapper">

    <!--这边的resultType实际测试下来既可以是Map中元素Employee也可以是java.util.Map-->
    <select id="findEmployeeMap" resultType="com.xuweiwei.mybatis.pojo.Employee">
        select * from employee
    </select>

</mapper>
    • 测试  

package com.xuweiwei.mybatis.test;

import com.xuweiwei.mybatis.mapper.EmployeeMapper;
import com.xuweiwei.mybatis.pojo.Employee;
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 org.junit.Test;

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

public class MybatisTest {

    /**
     * 测试增加
     *
     * @throws IOException
     */
    @Test
    public void test() throws IOException {
        /**
         * 创建SqlSessionFactory对象
         */
        String resource = "mybatis-config.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        /**
         * 创建SqlSession
         */
        SqlSession sqlSession = sqlSessionFactory.openSession(true);
        EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
        Map<Integer, Employee> employeeMap = employeeMapper.findEmployeeMap();
        System.out.println(employeeMap);

        sqlSession.close();
    }

}

  • 示例:对应的注解写法
package com.xuweiwei.mybatis.mapper;

import com.xuweiwei.mybatis.pojo.Employee;
import org.apache.ibatis.annotations.MapKey;
import org.apache.ibatis.annotations.ResultType;
import org.apache.ibatis.annotations.Select;

import java.util.Map;

public interface EmployeeMapper {

    @MapKey("id")
    @ResultType(Map.class)
    @Select(" select * from employee ")
    Map<Integer, Employee> findEmployeeMap();

}

1.2.3 select自定义结果集--resultMap

  • resultMap不能和resultType一起使用。

原文地址:https://www.cnblogs.com/xuweiweiwoaini/p/10171458.html

时间: 2024-10-11 03:20:13

Mybatis二的相关文章

Mybatis(二) 全局配置文件详解

这节来说说全局配置文件的东西,非常简单.看一遍就懂了. --WH 一.全部配置内容 SqlMapConfig.xml的配置内容和顺序如下,顺序不能乱.现在来对这些属性的意思一一进行讲解. 二.properties 作用:引用java属性文件中的配置信息,比如,加载连接数据库的各种属性的配置文件. db.properties 1 <!-- 2 properties:引用java属性文件中的配置信息 3 比如加载连接数据库的帐号密码等信息的properties配置文件. 4 使用${}可以引用已经加

mybatis(二)执行CRUD操作的两种方式配置和注解

一.使用MyBatis对表执行CRUD操作——基于XML的实现 1.定义sql映射xml文件 userMapper.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

框架学习笔记之Mybatis(二)

一.动态sql 通过mybatis提供的标签,实现sql语句的拼接. 1.where <select id="findUserList" parameterType="user" resultType="user"> select * from user <!--使用where可以自动处理第一个and--> <where> <if test="id!=null and id!=''"&

mybatis二(参数处理)

1.单个参数 mybatis不会做特殊处理. #{参数名/任意名}:取出参数值. 2.多个参数 mybatis会做特殊处理. 多个参数会被封装成 一个map. key:param1...paramN,或者参数的索引也可以. value:传入的参数值. #{}就是从map中获取指定的key的值: 多个参数传递的时候要使用命名参数的形式: 3.命名参数:明确指定封装参数时map的key:@Param("id") 多个参数会被封装成 一个map, key:使用@Param注解指定的值 val

mybatis(二):config配置

一.properties引入外部配置文件:resource:引入类路径下的资源. <properties resource="dbconfig.properties"></properties> 二.settings包含很多重要的设置项,可以设置是否开启缓存,延迟加载,驼峰命名规则等:name:设置项名:value:false或true. <settings> <setting name="mapUnderscoreToCamelCa

MyBatis(二) resultMap使用

1.问题引出: 在做映射时候,之前,按照表DDL的字段名,设置java对象的属性.但是,在实际应用无法完全保证表字段名与java类属性完全一致,而且java类应该保持驼峰格式的规范风格.对于类似字段user_id等的情况,不能较好的处理.这时,需要使用resultMap标签来将,DDL的字段名和java类属性名一一对应起来. 下面实现一个使用resultMap做映射的实例,来阐述其使用方法: 2.resultMap使用,resultMap和resultType的不同使用场景: 在表的Mapper

Spring整合MyBatis(二)源码分析

在Spring配置Mybatis的文件中我们可以看到如下代码: <!-- 扫描dao --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <property name="basePackage" value="org.tarena.note.dao"> </property> MapperScannerConfig

mybatis(二)

这次接着上次写增删改查吧. 现将上节的方法改造一下,改造测试类. package cn.my.test; import java.io.IOException; import java.io.InputStream; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; impor

Mybatis(二)总结

1. 输入映射(就是映射文件中可以传入哪些参数类型) 1)基本类型 2)pojo类型 3)Vo类型2. 输出映射(返回的结果集可以有哪些类型) 1)基本类型 2)pojo类型 3)List类型3. 动态sql:动态的拼接sql语句,因为sql中where条件有可能多也有可能少 1)where:可以自动添加where关键字,还可以去掉第一个条件的and关键字 2)if:判断传入的参数是否为空 3)foreach:循环遍历传入的集合参数 4)sql:封装查询条件,以达到重用的目的 4. 对单个对象的