記錄Mybatis第二天(實現增刪改及一些標籤配置)

豆漿味道的奶茶°發表於2020-11-15

回顧:Mybatis的環境搭建流程

  1. 第一步:建立 maven 工程

  2. 第二步:匯入座標

  3. 第三步:編寫必要程式碼(實體類和持久層介面)

  4. 第四步:編寫 SqlMapConfig.xml

  5. 第五步:編寫對映配置檔案

  6. 第六步:編寫測試類

基於代理 Dao 實現 CRUD 操作

使用者的持久層介面IUserDao為:

public interface IUserDao {

    /**
     * 查詢所有使用者
     * @return
     */
    List<User> findAll();

    /**
     * 儲存使用者
     * @param user
     */
    void saveUser(User user);

    /**
     * 更新使用者
     * @param user
     */
    void updateUser(User user);

    /**
     * 根據Id刪除使用者
     * @param userId
     */
    void deleteUser(Integer userId);

    /**
     * 根據id查詢使用者資訊
     * @param userId
     * @return
     */
    User findById(Integer userId);

    /**
     * 根據名稱模糊查詢使用者資訊
     * @param username
     * @return
     */
    List<User> findByName(String username);

    /**
     * 查詢總使用者數
     * @return
     */
    int findTotal();

    /**
     * 根據queryVo中的條件查詢使用者
     * @param vo
     * @return
     */
    List<User> findUserByVo(QueryVo vo);
}

定義使用者實體類user:

public class User implements Serializable {

    private Integer userId;
    private String userName;
    private String userAddress;
    private String userSex;
    private Date userBirthday;

    public Integer getUserId() {
        return userId;
    }

    public void setUserId(Integer userId) {
        this.userId = userId;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getUserAddress() {
        return userAddress;
    }

    public void setUserAddress(String userAddress) {
        this.userAddress = userAddress;
    }

    public String getUserSex() {
        return userSex;
    }

    public void setUserSex(String userSex) {
        this.userSex = userSex;
    }

    public Date getUserBirthday() {
        return userBirthday;
    }

    public void setUserBirthday(Date userBirthday) {
        this.userBirthday = userBirthday;
    }

    @Override
    public String toString() {
        return "User{" +
                "userId=" + userId +
                ", userName='" + userName + '\'' +
                ", userAddress='" + userAddress + '\'' +
                ", userSex='" + userSex + '\'' +
                ", userBirthday=" + userBirthday +
                '}';
    }
}

IUerDao.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">
<mapper namespace="com.itheima.dao.IUserDao">

    <!-- 配置 查詢結果的列名和實體類的屬性名的對應關係 -->
    <resultMap id="userMap" type="uSeR">
        <!-- 主鍵欄位的對應 -->
        <id property="userId" column="id"></id>
        <!--非主鍵欄位的對應-->
        <result property="userName" column="username"></result>
        <result property="userAddress" column="address"></result>
        <result property="userSex" column="sex"></result>
        <result property="userBirthday" column="birthday"></result>
    </resultMap>


    <!-- 查詢所有 -->
    <select id="findAll" resultMap="userMap">
        <!--select id as userId,username as userName,address as userAddress,sex as userSex,birthday as userBirthday from user;-->
        select * from user;
    </select>

    <!-- 儲存使用者 -->
    <insert id="saveUser" parameterType="user">
        <!-- 配置插入操作後,獲取插入資料的id -->
        <selectKey keyProperty="userId" keyColumn="id" resultType="int" order="AFTER">
            select last_insert_id();
        </selectKey>
        insert into user(username,address,sex,birthday)values(#{userName},#{userAddress},#{userSex},#{userBirthday});
    </insert>

    <!-- 更新使用者 -->
    <update id="updateUser" parameterType="USER">
        update user set username=#{userName},address=#{userAddress},sex=#{userAex},birthday=#{userBirthday} where id=#{userId}
    </update>

    <!-- 刪除使用者-->
    <delete id="deleteUser" parameterType="java.lang.Integer">
        delete from user where id = #{uid}
    </delete>
    
    <!-- 根據id查詢使用者 -->
    <select id="findById" parameterType="INT" resultMap="userMap">
        select * from user where id = #{uid}
    </select>

    <!-- 根據名稱模糊查詢 -->
    <select id="findByName" parameterType="string" resultMap="userMap">
          select * from user where username like #{name}
        <!-- select * from user where username like '%${value}%'-->
   </select>

    <!-- 獲取使用者的總記錄條數 -->
    <select id="findTotal" resultType="int">
        select count(id) from user;
    </select>

    <!-- 根據queryVo的條件查詢使用者 -->
    <select id="findUserByVo" parameterType="com.itheima.domain.QueryVo" resultMap="userMap">
        select * from user where username like #{user.username}
    </select>
</mapper>

其中需要關注的是:resultmap標籤的使用,使用該標籤可以使user類屬性與資料庫列名產生對應關係,可以不完全一樣,從而把resulttype=全限定類名替換為resultmap=id。

<resultMap id="userMap" type="uSeR">
        <!-- 主鍵欄位的對應 -->
        <id property="userId" column="id"></id>
        <!--非主鍵欄位的對應-->
        <result property="userName" column="username"></result>
        <result property="userAddress" column="address"></result>
        <result property="userSex" column="sex"></result>
        <result property="userBirthday" column="birthday"></result>
    </resultMap>

而其中parametertype標籤為什麼無需使用全限定類名呢?

  • 是因為在SqlMapConfig中配置了標籤,使
    com.itheima.domain包下所有的類都起了別名,別名為類名,且不區分大小寫。
<typeAliases>
        <!--typeAlias用於配置別名。type屬性指定的是實體類全限定類名。alias屬性指定別名,當指定了別名就再區分大小寫 
        <typeAlias type="com.itheima.domain.User" alias="user"></typeAlias>-->

        <!-- 用於指定要配置別名的包,當指定之後,該包下的實體類都會註冊別名,並且類名就是別名,不再區分大小寫-->
        <package name="com.itheima.domain"></package>
    </typeAliases>

SqlMapConfig.xml配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!-- 配置properties
        可以在標籤內部配置連線資料庫的資訊。也可以通過屬性引用外部配置檔案資訊
        resource屬性: 常用的
            用於指定配置檔案的位置,是按照類路徑的寫法來寫,並且必須存在於類路徑下。
        url屬性:
            是要求按照Url的寫法來寫地址
            URL:Uniform Resource Locator 統一資源定位符。它是可以唯一標識一個資源的位置。
            它的寫法:
                http://localhost:8080/mybatisserver/demo1Servlet
                協議      主機     埠       URI

            URI:Uniform Resource Identifier 統一資源識別符號。它是在應用中可以唯一定位一個資源的。
    -->
    <properties url="file:///D:/IdeaProjects/day02_eesy_01mybatisCRUD/src/main/resources/jdbcConfig.properties">
       <!-- <property name="driver" value="com.mysql.jdbc.Driver"></property>
        <property name="url" value="jdbc:mysql://localhost:3306/eesy_mybatis"></property>
        <property name="username" value="root"></property>
        <property name="password" value="1234"></property>-->
    </properties>

    <!--使用typeAliases配置別名,它只能配置domain中類的別名 -->
    <typeAliases>
        <!--typeAlias用於配置別名。type屬性指定的是實體類全限定類名。alias屬性指定別名,當指定了別名就再區分大小寫 
        <typeAlias type="com.itheima.domain.User" alias="user"></typeAlias>-->

        <!-- 用於指定要配置別名的包,當指定之後,該包下的實體類都會註冊別名,並且類名就是別名,不再區分大小寫-->
        <package name="com.itheima.domain"></package>
    </typeAliases>

    <!--配置環境-->
    <environments default="mysql">
        <!-- 配置mysql的環境-->
        <environment id="mysql">
            <!-- 配置事務 -->
            <transactionManager type="JDBC"></transactionManager>

            <!--配置連線池-->
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}"></property>
                <property name="url" value="${jdbc.url}"></property>
                <property name="username" value="${jdbc.username}"></property>
                <property name="password" value="${jdbc.password}"></property>
            </dataSource>
        </environment>
    </environments>
    <!-- 配置對映檔案的位置 -->
    <mappers>
        <!--<mapper resource="com/itheima/dao/IUserDao.xml"></mapper>-->
        <!-- package標籤是用於指定dao介面所在的包,當指定了之後就不需要在寫mapper以及resource或者class了 -->
        <package name="com.itheima.dao"></package>
    </mappers>
</configuration>

最後的測試類MybatiTest.java為:

public class MybatisTest {

    private InputStream in;
    private SqlSession sqlSession;
    private IUserDao userDao;

    @Before//用於在測試方法執行之前執行
    public void init()throws Exception{
        //1.讀取配置檔案,生成位元組輸入流
        in = Resources.getResourceAsStream("SqlMapConfig.xml");
        //2.獲取SqlSessionFactory
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        //3.獲取SqlSession物件
        sqlSession = factory.openSession();
        //4.獲取dao的代理物件
        userDao = sqlSession.getMapper(IUserDao.class);
    }

    @After//用於在測試方法執行之後執行
    public void destroy()throws Exception{
        //提交事務
        sqlSession.commit();
        //6.釋放資源
        sqlSession.close();
        in.close();
    }

    /**
     * 測試查詢所有
     */
    @Test
    public void testFindAll(){
        //5.執行查詢所有方法
        List<User> users = userDao.findAll();
        for(User user : users){
            System.out.println(user);
        }

    }

    /**
     * 測試儲存操作
     */
    @Test
    public void testSave(){
        User user = new User();
        user.setUserName("modify User property");
        user.setUserAddress("北京市順義區");
        user.setUserSex("男");
        user.setUserBirthday(new Date());
        System.out.println("儲存操作之前:"+user);
        //5.執行儲存方法
        userDao.saveUser(user);

        System.out.println("儲存操作之後:"+user);
    }

    /**
     * 測試更新操作
     */
    @Test
    public void testUpdate(){
        User user = new User();
        user.setUserId(50);
        user.setUserName("mybastis update user");
        user.setUserAddress("北京市順義區");
        user.setUserSex("女");
        user.setUserBirthday(new Date());

        //5.執行儲存方法
        userDao.updateUser(user);
    }

    /**
     * 測試刪除操作
     */
    @Test
    public void testDelete(){
        //5.執行刪除方法
        userDao.deleteUser(48);
    }

    /**
     * 測試刪除操作
     */
    @Test
    public void testFindOne(){
        //5.執行查詢一個方法
        User  user = userDao.findById(50);
        System.out.println(user);
    }

    /**
     * 測試模糊查詢操作
     */
    @Test
    public void testFindByName(){
        //5.執行查詢一個方法
        List<User> users = userDao.findByName("%王%");
//        List<User> users = userDao.findByName("王");
        for(User user : users){
            System.out.println(user);
        }
    }

    /**
     * 測試查詢總記錄條數
     */
    @Test
    public void testFindTotal(){
        //5.執行查詢一個方法
        int count = userDao.findTotal();
        System.out.println(count);
    }


    /**
     * 測試使用QueryVo作為查詢條件
     */
    @Test
    public void testFindByVo(){
        QueryVo vo = new QueryVo();
        User user = new User();
        user.setUserName("%王%");
        vo.setUser(user);
        //5.執行查詢一個方法
        List<User> users = userDao.findUserByVo(vo);
        for(User u : users){
            System.out.println(u);
        }
    }
}

其中還有個使用QueryVo類為查詢條件的QueryVo類為:

public class QueryVo {

    private User user;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }
}

相關文章