1. 程式人生 > 實用技巧 >3、MyBatis初級教程之CURD操作

3、MyBatis初級教程之CURD操作

4、CURD操作

1、查詢

  • 根據使用者 Id查詢使用者
  1. 在UserMapper中新增對應方法
public interface UserMapper {
    List<User> getUserList();

    List<User> getUserListById(int id); 
} 

2、在UserMapper.xml中新增Select語句

 <select id="getUserListById" resultType="com.feng.pojo.User" parameterType="int">
      select * from User where id=#{id}
  </select>

3、測試類中測試

    @Test
    public  void  testgetUserById()
    {
        SqlSession sqlSession = MyBatisUtil.getSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        List<User> userList = userMapper.getUserListById(1);
        for (User user : userList) {
            System.out.println(user);
        }
        sqlSession.close();
    }
  • 根據使用者名稱和密碼獲取使用者

思路一:直接在方法中傳遞引數(註解)

1、在介面方法的引數前加 @Param屬性

2、Sql語句編寫的時候,直接取@Param中設定的值即可,不需要單獨設定引數型別

//通過密碼和名字查詢使用者
User selectUserByNP(@Param("username") String username,@Param("pwd") Stringpwd);

/*
   <select id="selectUserByNP" resultType="com.feng.pojo.User">
     select * from user where name = #{username} and pwd = #{pwd}
   </select>
*/

思路二:使用萬能的Map

1、在介面方法中,引數直接傳遞Map;

User selectUserByMP(Map<String,Object> map);

2、編寫sql語句的時候,需要傳遞引數型別,引數型別為map

<select id="selectUserByMP" parameterType="map" resultType="com.deng.pojo.User">
select * from user where name = #{username} and pwd = #{pwd}
</select>

3、在使用方法的時候,Map的 key 為 sql中取的值即可,沒有順序要求!

Map<String, Object> map = new HashMap<String, Object>();
map.put("username","小明");
map.put("pwd","123456");
User user = mapper.selectUserByNP2(map);

總結:如果引數過多,我們可以考慮直接使用Map實現,如果引數比較少,直接傳遞引數即可

2、增加

1、在UserMapper介面中新增對應的方法

//新增一個使用者
int addUser(User user);

2、在UserMapper.xml中新增insert語句

<insert id="addUser" parameterType="com.feng.pojo.User">
    insert into user (id,name,pwd) values (#{id},#{name},#{pwd})
</insert>

3、測試

@Test
public void testAddUser() {
   SqlSession session = MybatisUtils.getSession();
   UserMapper mapper = session.getMapper(UserMapper.class);
   User user = new User(5,"王五","zxcvbn");
   int i = mapper.addUser(user);
   System.out.println(i);
   session.commit(); //提交事務,重點!不寫的話不會提交到資料庫
   session.close();
}

注意點:增、刪、改操作需要提交事務!

3、更新

我們一般使用update標籤進行更新操作,它的配置和select標籤差不多!

需求:修改使用者的資訊

1、同理,編寫介面方法

//修改一個使用者
int updateUser(User user);

2、編寫對應的配置檔案SQL

<update id="updateUser" parameterType="com.feng.pojo.User">
  update user set name=#{name},pwd=#{pwd} where id = #{id}
</update>

3、測試

@Test
public void testUpdateUser() {
   SqlSession session = MybatisUtils.getSession();
   UserMapper mapper = session.getMapper(UserMapper.class);
   User user = mapper.selectUserById(1);
   user.setPwd("asdfgh");
   int i = mapper.updateUser(user);
   System.out.println(i);
   session.commit(); //提交事務,重點!不寫的話不會提交到資料庫
   session.close();
}

4、刪除

我們一般使用delete標籤進行刪除操作,它的配置和select標籤差不多!

需求:根據id刪除一個使用者

1、同理,編寫介面方法

//根據id刪除使用者
int deleteUser(int id);

2、編寫對應的配置檔案SQL

<delete id="deleteUser" parameterType="int">
  delete from user where id = #{id}
</delete>

3、測試

@Test
public void testDeleteUser() {
   SqlSession session = MybatisUtils.getSession();
   UserMapper mapper = session.getMapper(UserMapper.class);
   int i = mapper.deleteUser(5);
   System.out.println(i);
   session.commit(); //提交事務,重點!不寫的話不會提交到資料庫
   session.close();
}

小結:

  • 所有的增刪改操作都需要提交事務!
  • 介面所有的普通引數,儘量都寫上@Param引數,尤其是多個引數時,必須寫上!
  • 有時候根據業務的需求,可以考慮使用map傳遞引數!
  • 為了規範操作,在SQL的配置檔案中,我們儘量將Parameter引數和resultType都寫上!

思考題

模糊查詢like語句該怎麼寫?

第1種:在Java程式碼中新增sql萬用字元。

string wildcardname = “%smi%”;
list<name> names = mapper.selectlike(wildcardname);

<select id=”selectlike”>
select * from foo where bar like #{value}
</select>

第2種:在sql語句中拼接萬用字元,會引起sql注入

string wildcardname = “smi”;
list<name> names = mapper.selectlike(wildcardname);

<select id=”selectlike”>
    select * from foo where bar like "%"#{value}"%"
</select>