mybatis基礎03(介面中的多個引數處理)

qq_41976407發表於2020-09-23

情況一:利用了引數的下標
介面中的方法:

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());

相關文章