mybatis基础03(接口中的多个参数处理)

情况一:利用了参数的下标
接口中的方法:

public interface UserMapper {
    public List<User> getInfo();
    public List<User> param1(String uname,String uphone);
}

对应的配置(UserMapper.xml)

 <select id="param1" resultType="com.offcn.bean.User">
        select * from user where uname=#{arg0} and uphone=#{arg1}
    </select>

mybatisTest.java中的代码:

 @Test
    public void test2() {

        try {
            String resource = "mybatis-config.xml";
            //将配置文件 读取成为一个输入流对象
            InputStream inputStream = Resources.getResourceAsStream(resource);
            //通过一个输入流对象和sqlSessionFactoryBuilder构建sqlSessionFactory
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            //创建一个会话对象
            SqlSession session = sqlSessionFactory.openSession();

            //帮我们创建接口对象
            //UserMapper mapper = MapperProxy类型的对象
            UserMapper mapper = session.getMapper(UserMapper.class);

            /*情况1:
            当方法中出现多个参数的时候
            */
            List<User> users = mapper.param1("a", "b");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

主要的只有一句:

 /*情况1:
            当方法中出现多个参数的时候
            */
            List<User> users = mapper.param1("a", "b");

情况二:接口中多个参数处理:利用Map集合的key
接口中的方法:

    public List<User> param2(Map<String,Object> map);

对应的配置(UserMapper.xml)

<select id="param2" resultType="com.offcn.bean.User" parameterType="java.util.Map">
        select * from user where uname=#{key1} and uphone=#{key2}
    </select>

mybatisTest.java中的代码:

  /*情况2:
            当方法中出现多个参数的时候:利用Map集合
            */
            Map<String,Object> map = new HashMap<>();
            map.put("key1","aferg");
            map.put("key2","bsdfe");
            List<User> users = mapper.param2(map);

情况三:利用传入对象
接口方法:

public List<User> param3(User user);

对应的配置:(UserMapper.xml)

<select id="param3" resultType="com.offcn.bean.User" parameterType="com.offcn.bean.User">
        select * from user where uname=#{uname} and uphone=#{uphone}
    </select>

mybatisTest.java中的代码:

  /*情况3:
            当方法中出现多个参数的时候:利用传入对象
            */
            User user = new User();
            user.setUname("吕丛林");
            user.setUphone("12343");
            List<User> users = mapper.param3(user);

情况四:利用注解
接口方法:

 public List<User> param4(@Param("uname") String uname,@Param("uphone") String uphone);

对应配置:(UserMapper.xml)

<select id="param4" resultType="com.offcn.bean.User">
        select * from user where uname=#{uname} and uphone=#{uphone}
    </select>

mybatisTest.java中的测试代码:

mapper.param4("吕丛林","12343");

**

Mybatis中的模糊查询

**
模糊查询中使用mybatis提供两个解析标记
1.#{ } :解析成我们的占位符 —>preparedStatement
2.${ } :解析字符串的拼接 —>Statement
模糊查询第一种:1.#{}:占位符
接口方法:

 //模糊查询
    public List<User> getInfo1(String name);

对应配置:(UserMapper.xml)

 <!--模糊查询-->
    <select id="getInfo1" resultType="com.offcn.bean.User">
        select * from user where uname like "%"#{name}"%"
    </select>

mybatisTest.java中的测试代码:

 /*
            * 模糊查询:运用占位符
            * */
            List<User> users = mapper.getInfo1("吕");

模糊查询第二种:2.${ } :字符串的拼接
接口方法:

 //模糊查询2
    public List<User> getInfo2(@Param("name") String name);

对应配置:(UserMapper.xml)

 <!--模糊查询2-->
    <select id="getInfo2" resultType="com.offcn.bean.User">
        select * from user where uname like '%${name}%'
    </select>

mybatisTest.java中的测试代码:

/*
             * 模糊查询2:字符串拼接
             * */
            List<User> users = mapper.getInfo2("吕");

**

模糊查询第三种(concat)推荐

**
接口方法:

//模糊查询3
    public List<User> getInfo3(String name);

对应配置:(UserMapper.xml)

<!--模糊查询3-->
    <select id="getInfo3" resultType="com.offcn.bean.User">
        select * from user where uname like concat('%',concat(#{uname},'%'))
    </select>

mybatisTest.java中的测试代码:

 /*
             * 模糊查询3:字符串拼接
             * */
            List<User> users = mapper.getInfo3("吕");

第四:模糊查询中转义字符应用:
在这里插入图片描述
接口方法:

  //模糊查询4
    public List<User> getInfo4(String name);

对应配置:(UserMapper.xml)

 <!--模糊查询4-->
    <select id="getInfo4" resultType="com.offcn.bean.User">
        select * from user where uname like #{name}
    </select>

mybatisTest.java中的测试代码:

 /*
             * 模糊查询4:转义字符
             * */
            List<User> users = mapper.getInfo4("%吕%");

**

附加内容

**
自定义结果类型
我们定义的属性和当前类型对应数据库表中的字段的名车个不一致,这个时候我们查询数据的结果不匹配的部分就使用当前类型的默认值填充:
在这里插入图片描述
我们需要自己定义一种映射,将表中字段和类中的属性对应在一起

解决当前属性名和查询字段名称不一致的问题:
(1)在 mapper.xml文件中使用resultMap标签新定义一个映射关系类型

(2) 在语句中使用我们标签 select * from user

注释: 在开发中使用resultMap标签处理字段的不匹配比较少,基本字段都是代码生成器。

自动返回主键值

数据库表的某个字段自增长 auto_increment,我们保存数据后,需要在程序中获取我们插入数据的自增长的主键值,解决方案:
(1) 接口
int saveUser(User user);
(2) 对应的mapper配置
A: 使用我们的标签属性返回主键值

insert into user values(#{uid},#{uname},#{uphone})

B: 使用selectKey标签获取主键值


select last_insert_id();

insert into user values(#{uid},#{uname},#{uphone})

(3) 测试
User user = new User();
user.setUname(“ABC”);
user.setUphone(“119”);
int i = mapper.saveUser(user);
System.out.println(user.getUid());

如果我们的主键是uuid(),非自增长的情况,需要在程序中自动获取主键值,我们需要使用标签selectKey
(1) 构建一个表(略)
(2) 构建数据模型
public class Person {
private String id;
private String name;
(3) 构建接口和配置文件

int savePerson(Person person);

Mapper.xml


select uuid(); 函数

insert into person values(#{id},#{name})

selectKey 标签:获取主键值标签
keyColumn: 属性数据库中那个字段是主键
keyProperty: 类中的那个属性是和表中主键字段对应的
resultType: 主键的类型
Order: before after
在我们执行插入sql语句前或者是后执行我们 selectKey标签中的sql

(4) 测试
PersonMapper mapper1 = sqlSession.getMapper(PersonMapper.class);
Person perso = new Person();
perso.setName(“AAAAA”);
mapper1.savePerson(perso);
System.out.println(perso.getId());

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页