1. 程式人生 > 實用技巧 >Mybatis-CRUD

Mybatis-CRUD

CRUD

目錄

1. namespace

namespace中的包名要和Dao/Mapper介面的包名一致!

2. select

選擇,查詢語句

1. id

就是對應的namespace中的方法名

2. resultType

SQL語句執行的返回值

3. parameterType

引數型別(方法的引數)

其中,基本的引數型別直接寫,而自定義的物件的型別需要寫完整的包名以及類路徑

只有一個基本引數型別的情況下,可以直接在sql中取到!

多個引數用Map或者註解!

3. CRUD

UserMapper介面

package com.wang.dao;

import com.wang.pojo.User;

import java.util.List;

public interface UserMapper {
    //查詢全部使用者
    List<User> getUserList();

    //根據ID查詢使用者
    User getUserById(int id);

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

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

    //刪除一個使用者
    int deleteUser(int id);
}

UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace=繫結一個對應的Dao/Mapper介面-->
<mapper namespace="com.wang.dao.UserMapper">
    <!--select查詢語句, id=方法的名字, resultType=返回的型別,寫集合的泛型-->
    <select id="getUserList" resultType="com.wang.pojo.User">
        select * from mybatis.user;
    </select>

    <select id="getUserById" parameterType="int" resultType="com.wang.pojo.User">
        select * from mybatis.user where id = #{id};
    </select>

    <!--insert,物件中的屬性可以直接取出來-->
    <insert id="addUser" parameterType="com.wang.pojo.User">
        insert into mybatis.user (id, name, pwd) VALUES (#{id},#{name},#{pwd});
    </insert>

    <!--update-->
    <update id="updateUser" parameterType="com.wang.pojo.User">
        update mybatis.user set name = #{name}, pwd = #{pwd} where id = #{id};
    </update>

    <!--delete-->
    <delete id="deleteUser" parameterType="int">
        delete from mybatis.user where id = #{id};
    </delete>
</mapper>

測試類

package com.wang.dao;

import com.wang.pojo.User;
import com.wang.utils.MybatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

public class UserMapperTest {

    @Test
    public void test(){
        //第一步: 獲取sqlSession物件
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        try {
            //第一步: 獲取sqlSession物件
            sqlSession = MybatisUtils.getSqlSession();

            //方式一: 執行SQL
            //面向介面程式設計,向getMapper傳遞一個對應的介面的class,用反射
            UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
            //從得到的mapper物件中取出對應的方法,不用關心其實現
            List<User> userList = userMapper.getUserList();

            //方法二:
            //List<User> userList = sqlSession.selectList("com.wang.dao.UserDao.getUserList");

            for (User user : userList) {
                System.out.println(user);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //關閉sqlSession
            sqlSession.close();
        }


    }

    @Test
    public void testGetUserById() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.getUserById(1);
        System.out.println(user);

        sqlSession.close();
    }

    //增刪改必須要提交事務!
    @Test
    public void testAddUser() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();

        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = new User(4, "王麻子", "123456789");
        int num = mapper.addUser(user);
        if (num > 0) {
            System.out.println("插入成功!");
        }

        //提交事務
        sqlSession.commit();

        sqlSession.close();
    }

    @Test
    public void TestUpdateUser() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        User user = new User(4, "趙六", "987654");
        int num = mapper.updateUser(user);
        if (num > 0) {
            System.out.println("修改成功!");
        }

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

    @Test
    public void TestDeleteUser() {
        SqlSession sqlSession = MybatisUtils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);

        int num = mapper.deleteUser(4);
        if (num > 0) {
            System.out.println("刪除成功!");
        }

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

4. 注意點

1. 增刪改一定要提交事務

sqlSession.commit()

2. xml中的變數寫法為#{}

{}中寫pojo對應的變數名

3. 標籤不要匹配錯

4. 名稱空間路徑寫.

5. resource繫結mapper需要使用路徑,寫/

6. 程式配置檔案必須符合規範

7. maven資源沒有匯出的問題

由於Maven是約定大於配置,為了讀取到不在resource目錄下的資源,需要在Maven的pom.xml中加入如下的程式碼

父工程和子工程都要加!

<build>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
                <include>**/*.properties</include>
            </includes>
        </resource>

        <resource>
            <directory>src/main/resources</directory>
            <includes>
                <include>**/*.xml</include>
                <include>**/*.properties</include>
            </includes>
        </resource>
    </resources>
</build>

5. 萬能的Map

有時候,資料庫的欄位過多而要修改的欄位很少的時候,使用Map ==> 傳遞一個Map物件給對應的方法,鍵值對為String,Object,分別為欄位名和要修改的引數的值

UserMap介面

//萬能的Map
int addUser2(Map<String,Object> map);

UserMap.xml

其中,欄位名可以和資料庫中的欄位不一致,在使用時使用定義的欄位名!

引數型別寫map!

<!--使用map進行insert操作-->
<insert id="addUser2" parameterType="map">
    insert into mybatis.user (id, name, pwd) VALUES (#{userId},#{userName},#{password});
</insert>

測試類

//增刪改必須要提交事務!
@Test
public void testAddUser2() {
    SqlSession sqlSession = MybatisUtils.getSqlSession();

    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    HashMap<String, Object> map = new HashMap<>();
    map.put("userId", 4);
    map.put("userName", "王麻子");
    map.put("password", "123456789");
    int num = mapper.addUser2(map);
    if (num > 0) {
        System.out.println("插入成功!");
    }

    //提交事務
    sqlSession.commit();

    sqlSession.close();
}

6. 模糊查詢

UserMap介面

//模糊查詢
List<User> getUserLike(String value);

UserMap.xml

<!--模糊查詢-->
<select id="getUserLike" resultType="com.wang.pojo.User">
    select * from mybatis.user where name like #{value}
</select>

測試類

Java程式碼執行的時候傳遞萬用字元%,這樣比較安全

不要在sql中拼接%,非要拼接的話要寫"%",這樣可以防止sql注入

//模糊查詢
@Test
public void testGetUserLike() {
    SqlSession sqlSession = MybatisUtils.getSqlSession();

    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    List<User> users = mapper.getUserLike("%王%");
    for (User user : users) {
        System.out.println(user);
    }

    sqlSession.close();
}