SSM框架之_Mybatis入門筆記,詳解快速上手(二):增刪改查篇

CRUD

增刪改操作,執行完sql後,需要提交事務,否則不生效。

查詢不需要提交事務。

通過SqlSession對象提交事務。


參數格式

sql語句中填寫參數的格式:#{}

在sql語句中填寫參數時,如果接口中的參數是類,那麼可以直接寫類中的屬性,如果不是類,接口中的方法參數是什麼,就寫什麼。


select

  • id:對應namespace中的方法名
  • resulteType:sqlj返回值結果的數據類型
  • parameterType:sql參數類型

步驟:

  1. 在接口中定義方法。
  2. 在mapper.xml中定義sql語句。

接口中的方法:

List<User> getUserList();

sql語句

<select id="getUserList" resultType="top.jarvaniv.pojo.User">
	select * from test.temp
</select>

執行:

//    查詢所有用戶
@Test
public void getUserListTest(){
   
     

	SqlSession sqlSession = MyBatisUtils.getSqlSession();
    UserMapper userDao = sqlSession.getMapper(UserMapper.class);
    List<User> userList = userDao.getUserList();

    for (User user : userList) {
   
     
    	System.out.println(user);
    }

    sqlSession.close();	// 一定要關閉資源
}

insert

接口中的方法:

// 插入數據,User類型,返回值是插入了多少數據
int insertUser(User user);

sql語句

<insert id="insertUser" parameterType="top.jarvaniv.pojo.User">
--填參數時,可以直接使用user對象中的屬性名進行調用
    insert into test.temp (id,name) values (#{id},#{name})
</insert>

執行

//    插入用戶
    @Test
    public void insertUserTest(){
   
      
//        在工具類中獲取SqlSession對象
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
//        加載mapper類型,獲取UserMapper接口類型的對象
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        userMapper.insertUser(new User(101,"張三"));

        sqlSession.commit();    // 增刪改 要提交事務

        sqlSession.close(); //最後一定記得要關閉資源
    }

update

接口中的方法:

// 修改數據,根據id值,將數據庫中對應id值的數據改成參數user中的數據,返回值是修改了多少條數據
int updataUser(User user);

sql語句

<update id="updataUser" parameterType="top.jarvaniv.pojo.User">
-- 根據參數user,修改數據表中的數據
    update test.temp set name=#{
   
       name} where id=#{
   
       id}
</update>

執行

//    修改用戶名字
    @Test
    public void updataUserTest(){
   
       
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        int result = userMapper.updataUser(new User(100, "李四"));

        sqlSession.commit();
        if (result > 0 ){
   
       
            System.out.println("修改成功");
        }

        sqlSession.close();
    }

delete

接口中的方法:

// 刪除數據,根據User的id值刪除,返回值是刪除了多少條數據
int deleteUser(int id );

sql語句

<delete id="deleteUser" parameterType="int">
-- 根據用戶id值刪除
-- 直接將方法中的參數傳入進來
    delete from test.temp where id=#{
   
        id}
</delete>

執行

//    根據id刪除用戶
    @Test
    public void deleteUserTest(){
   
        
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
        int result = userMapper.deleteUser(24);
        sqlSession.commit();
        if (result > 0){
   
        
            System.out.println("刪除成功");
        }
        sqlSession.close();
    }

萬能map

如果實體類或者數據庫表字段太多,那麼在插入、修改等操作時,即使僅僅需要修改一個字段,那麼也需要寫很多不需要的字段,很麻煩,因此,可以用map集合,把需要使用的字段存入到map集合中,在執行sql語句時,通過取map集合中的數據,來向sql語句中插入數據。

由多個參數不好操作時,可以用map。


接口中方法:

//    使用map集合修改temp表數據
    int updataOfMapTemp(Map map);

sql語句:

<update id="updataOfMapTemp" parameterType="map">
    --可以直接調用map集合中的鍵
    update test.temp set name=#{name} where id=#{id}
</update>

執行:

//    通過map修改temp表數據
    @Test
    public void updataOfMapTempTest() {
   
          
        SqlSession sqlSession = MyBatisUtils.getSqlSession();
        UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

        Map<String,String> map = new HashMap<>();
        map.put("id","23");
        map.put("name","王五");

        userMapper.updataOfMapTemp(map);

        sqlSession.commit();

        sqlSession.close();
    }

模糊查詢問題

模糊查詢時,模糊的部分(字符)在sql語句中寫死(類似於預編譯),防止sql的依賴注入。




實體類屬性名與數據庫字段名不匹配的問題


問題:

將數據庫中查詢結果存放的數據庫中時,如果類中的屬性名和數據庫字段名不一致(例如:pws與password),那麼,讀取出來的password就是null。


解決方式:

方法一:

在SQL查詢語句中,將數據庫字段起別名爲實體類的屬性名。

將數據庫字段pwd,設置別名password,與實體類的屬性名一致。

<select id="selectUserById" resultType="User">
  select id , name , pwd as password from user where id = #{id}
</select>

這種方式不建議使用。不方便。


方法二:結果集映射(resultMap)

映射實體類與數據庫表字段之間的關係

<!-- 要將查詢的結果映射成一個User對象-->
<resultMap id="UserMap" type="User">
   <!-- id爲主鍵 -->
   <id column="id" property="id"/>
   <!-- column是數據庫表的列名 , property是對應實體類的屬性名 -->
   <result column="name" property="name"/>
   <result column="pwd" property="password"/>
</resultMap>

<!-- resultMap設置使用哪個resultMap映射 -->
<select id="selectUserById" resultMap="UserMap">
  select id , name , pwd from user where id = #{id}
</select>

對於字段名與屬性名相同的字段,可以不用在映射中寫,只需要寫字段名與屬性名不一致的部分。例如:上個例子中的idname,字段名與屬性名是一樣的,就可以在resultMap省略不寫,只映射不同的pwd與password。














發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章