二、mybatis:CRUD操作

CRUD操作

本文參考自狂神博客(點擊打開
namespace
1.將上面案例中的UserMapper接口改名爲 UserDao;
2.將UserMapper.xml中的namespace改爲爲UserDao的路徑
3.再次測試
結論:
配置文件中namespace中的名稱爲對應Mapper接口或者Dao接口的完整包名,必須一致!

select

  • select標籤是mybatis中最常用的標籤之一

  • select語句有很多屬性可以詳細配置每一條SQL語句
    id

  • 命名空間中唯一的標識符

  • 接口中的方法名與映射文件中的SQL語句ID一 一對應

  • parameterType

  • 傳入SQL語句的參數類型 。【萬能的Map,可以多嘗試使用】

  • resultType

  • SQL語句返回值類型。【完整的類名或者別名】
    需求:根據id查詢用戶
    1.在UserMapper中添加對應方法

public interface UserMapper {
    //查詢全部用戶
    List<User> selectUser();
    //根據id查詢用戶
    User selectUserById(int id);
}

2.在UserMapper.xml中添加Select語句

<select id="selectUserById" resultType="com.kuang.pojo.User">
  select * from user where id = #{id}
</select>

3.測試類中測試

@Test
public void tsetSelectUserById() {
    SqlSession session = MybatisUtils.getSession();  //獲取SqlSession連接
    UserMapper mapper = session.getMapper(UserMapper.class);
    User user = mapper.selectUserById(1);
    System.out.println(user);
    session.close();
}

思路一:直接在方法中傳遞參數

1.在接口方法的參數前加 @Param屬性
2.Sql語句編寫的時候,直接取@Param中設置的值即可,不需要單獨設置參數類型

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

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

思路二:使用萬能的Map
1.在接口方法中,參數直接傳遞Map;

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

2.編寫sql語句的時候,需要傳遞參數類型,參數類型爲map

<select id="selectUserByNP2" parameterType="map" resultType="com.kuang.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實現,如果參數比較少,直接傳遞參數即可

insert

我們一般使用insert標籤進行插入操作,它的配置和select標籤差不多!
需求:給數據庫增加一個用戶
1.在UserMapper接口中添加對應的方法

//添加一個用戶
int addUser(User user);

2.在UserMapper.xml中添加insert語句

<insert id="addUser" parameterType="com.kuang.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();
}

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

update

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

需求:修改用戶的信息

1.同理,編寫接口方法

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

2.編寫對應的配置文件SQL

<update id="updateUser" parameterType="com.kuang.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();
}

delete

我們一般使用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();
}

map

 //萬能的Map
    int addUser2(Map<String ,Object> map);
 <insert id="addUser2" parameterType="map">
        insert into mybatis.user (id,name,pwd) values (#{userId},#{userName },#{passWord});
    </insert>
@Test
    public void addUser2(){
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserDao mapper = sqlSession.getMapper(UserDao.class);//傳進去接口.class文件
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("userId",6);
        map.put("userName","Hello");
        map.put("passWord","3333");
        mapper.addUser2(map);

        sqlSession.commit();
        sqlSession.close();
    }

Map傳遞參數,直接在SQL中取出key即可!(parameterType=“map”)
對象傳遞參數,直接在sql中取對象的屬性即可!(parameterType=“Object”)
只有一個基本類型參數的情況下,可以直接在sql中取到!
多個參數用map,或者註解
小結:

  • 所有的增刪改操作都需要提交事務!
  • 接口所有的普通參數,儘量都寫上@Param參數,尤其是多個參數時,必須寫上!
  • 有時候根據業務的需求,可以考慮使用map傳遞參數!
  • 爲了規範操作,在SQL的配置文件中,我們儘量將Parameter參數和resultType都寫上!
    ##思考題
    模糊查詢like語句該怎麼寫?

第1種:在Java代碼中添加sql通配符。

string wildcardname =%%;
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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章