前些天發現了一個巨牛的人工智能學習網站,通俗易懂,風趣幽默,忍不住分享一下給大家。點擊跳轉到教程。
傳參方式
使用不同的傳參方式:
使用@Param
之前博文中的項目使用了這種簡單的傳參方式:
? ? @Insert("INSERT INTO T_USER(NAME, PASSWORD, PHONE) VALUES(#{name}, #{password}, #{phone})")int insert(@Param("name") String name, @Param("password") String password, @Param("phone") String phone);
理解: @Param中定義了name對應了sql中的#{name}, password 對應了sql中的#{password}, phone 對應了sql中的 #{phone}。
使用Map
通過Map對象來傳遞參數:? ?
@Insert("INSERT INTO T_USER(NAME, PASSWORD, PHONE) VALUES(" +"#{name, jdbcType=VARCHAR}, #{password, jdbcType=VARCHAR}, #{phone, jdbcType=VARCHAR})")int insertByMap(Map<String, Object> map);
對于Insert語句中需要的參數,我們只需要在map中填入同名的內容即可,具體如下面代碼所示:
Map<String, Object> map = new HashMap<>();map.put("name","王五");map.put("password","23423");map.put("phone", "13400000000");userMapper.insertByMap(map);
使用對象
如果我們使用普通的java對象作為查詢條件的參數:
@Insert("INSERT INTO T_USER(NAME, PASSWORD, PHONE) VALUES(#{name}, #{password}, #{phone})")int insertByUser(User user);
只需要語句中的#{name}、#{age}就分別對應了User對象中的name和age屬性。
? ? User u = new User();u.setName("趙六");u.setPassword("12312312");u.setPhone("13888888888");userMapper.insertByUser(u);
增刪改查
MyBatis針對不同的數據庫操作分別提供了不同的注解來進行配置,在之前的示例中演示了@Insert,下面針對User表做一組最基本的增刪改查作為示例:? ?
@Select("SELECT * FROM T_USER WHERE PHONE = #{phone}")User findUserByPhone(@Param("phone") String phone);@Insert("INSERT INTO T_USER(NAME, PASSWORD, PHONE) VALUES(#{name}, #{password}, #{phone})")int insertByUser(User user);@Update("UPDATE T_USER SET NAME = #{name}, PASSWORD = #{password} WHERE PHONE = #{phone}")void update(User user);@Delete("DELETE FROM T_USER WHERE ID = #{id}")void delete(Integer id);
進行測試:
package com.winterchen;import com.winterchen.domain.User;
import com.winterchen.mapper.UserMapper;
import org.junit.Assert;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.transaction.annotation.Transactional;import java.util.HashMap;
import java.util.Map;@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootMybatisDemo2ApplicationTests {@Autowiredprivate UserMapper userMapper;@Test@Transactionalpublic void test3(){userMapper.insert("張三", "123456", "18600000000");User u = userMapper.findUserByPhone("18600000000");Assert.assertEquals("123456", u.getPassword());u.setName("趙六");u.setPassword("12312312");userMapper.update(u);u = userMapper.findUserByPhone("18600000000");Assert.assertEquals("12312312", u.getPassword());userMapper.delete(u.getId());u = userMapper.findUserByPhone("18600000000");Assert.assertEquals(null, u);}
}
注意:當使用@Transactional進行了事務管理,在單元測試結束之后會自動回滾,所以,測試跑完之后數據庫中沒有數據。所以只要測試通過了就沒有問題了。
返回結果綁定
對于增、刪、改操作相對變化較小。而對于“查”操作,我們往往需要進行多表關聯,匯總計算等操作,那么對于查詢的結果往往就不再是簡單的實體對象了,往往需要返回一個與數據庫實體不同的包裝類,那么對于這類情況,就可以通過@Results和@Result注解來進行綁定,具體如下:
? ? @Results({@Result(property = "name", column = "NAME"),@Result(property = "password", column = "PASSWORD"),@Result(property = "phone", column = "PHONE")})@Select("SELECT NAME, PASSWORD, PHONE FROM T_USER")List<User> findAll();
在上面代碼中,@Result中的property屬性對應User對象中的成員名,column對應SELECT出的字段名。在該配置中故意沒有查出id屬性,只對User對應中的name,password,phone對象做了映射配置,這樣可以通過下面的單元測試來驗證查出的id為null,而其他屬性不為null:
@Test@Transactionalpublic void test4(){userMapper.insert("張三", "123456", "18600000000");userMapper.insert("李四", "123456", "13500000000");List<User> list = userMapper.findAll();Assert.assertEquals(2, list.size());}
---------------------?
轉自:https://blog.csdn.net/winter_chen001/article/details/78623700?
?