Java框架之mybatis(三)——mybatis實現分頁、項目優化:實現事務自動提交、使用註解開發

mybatis分頁的實現

mysql的分頁語句

select * from user limit #{startIndex},#{pageSize};
# startIndex : 起始位置 ,默認是0開始
# pageSize :頁面大小
# 如何計算出當前頁面
currentPage = (currentPage-1)* pageSize 

使用limit實現分頁【掌握】

1.使用limit實現分頁【掌握】
UserDao編寫:

//查詢全部用戶實現分頁
List<User> selectUserByLimit(Map<String,Integer> map);

2.編寫對應mapper映射文件的方法
【參數我們可以使用map封裝,方便參數傳遞】

<select id="selectUserByLimit" parameterType="Map" resultType="User">
    select * from mybatis.user limit #{startIndex},#{pageSize}
</select>

3.測試
【模擬分頁數據:currentPage,pageSize】

@Test
public void selectUserByLimit(){

    //創建sqlSession
    SqlSessionFactory sqlSessionFactory = MyBatisUtils.getSqlSessionFactory();
    SqlSession sqlSession = sqlSessionFactory.openSession();

    //準備數據
    int currentPage = 2;//當前是第幾頁
    int pageSize = 2; //頁面大小

    Map<String, Integer> map = new HashMap<String, Integer>();
    map.put("startIndex",(currentPage-1)*pageSize);
    map.put("pageSize",pageSize);

    //測試
    UserDao mapper = sqlSession.getMapper(UserDao.class);
    List<User> users = mapper.selectUserByLimit(map);

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

    sqlSession.close();//關閉連接

}

案例實現:
項目結構:
在這裏插入圖片描述
UserDao層編寫:

package com.kuang.dao;

import com.kuang.pojo.User;

import java.util.List;
import java.util.Map;

public interface UserDao {

    //查詢全部用戶實現分頁
    List<User> selectUserByLimit(Map<String,Integer> map);

}


對應的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">

<mapper namespace="com.kuang.dao.UserDao">


    <select id="selectUserByLimit" parameterType="Map" resultType="User">
        select * from mybatis.user limit #{startIndex},#{pageSize}
    </select>

    <select id="selectUserByRowBounds" resultType="User">
        select * from mybatis.user
    </select>

</mapper>

測試結果:
在這裏插入圖片描述
總共分了兩頁當前顯示第二頁用戶;

使用RowBounds實現分頁(瞭解)

1.寫接口

//查詢全部用戶實現分頁使用RowBounds
List<User> selectUserByRowBounds();

2.寫Mapper映射文件

<select id="selectUserByRowBounds" resultType="User">
    select * from mybatis.user
</select>

3.編寫測試代碼

@Test
public void selectUserByRowBounds(){
    //創建sqlSession
    SqlSessionFactory sqlSessionFactory = MyBatisUtils.getSqlSessionFactory();
    SqlSession sqlSession = sqlSessionFactory.openSession();

    int currentPage = 2; //當前頁
    int pageSize = 2; //頁面大小

    RowBounds rowBounds = new RowBounds((currentPage - 1) * pageSize, pageSize);

    //注意點;使用RowBounds就不能使用getMapper了
    //selectList: 接收一個List
    //selectMap: 接收一個Map
    //selectOne : 接收只有一個對象的時候

    List<User> users = sqlSession.selectList("com.kuang.dao.UserDao.selectUserByRowBounds", null, rowBounds);

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


}

測試結果:
在這裏插入圖片描述
總共輸出兩頁,顯示爲第一頁面用戶;

limit 和 rowBounds區別

  • rowBounds 本質就是封裝了limit
  • limit 是在SQL層面實現分頁
  • rowBounds 在代碼層面實現分頁

優化項目(事務自動提交)

思考?我們之前的代碼,還能在優化嗎?

日誌,工具類,配置文件,別名… 事務

mybaits開發人員也想到了,有一個構造器,可以實現事務自動提交。

openSession(true); //openSession構造器如果參數爲true,則事務會自動提交。我們就不用每次都commit;


事務優化:自動提交事務

//獲得一個帶事務自動提交功能的SqlSession公共的方法
public static SqlSession getSqlSession(){
    //自動提交事務
    return sqlSessionFactory.openSession(true);
}

別名優化:pojo包下類自動設置別名

<!--配置別名-->
<typeAliases>
    <!--<typeAlias type="com.kuang.pojo.User" alias="User"/>-->
    <package name="com.kuang.pojo"/>
</typeAliases>

mapper映射文件路徑修改

<mappers>
    <!--class對應的是一個接口類-->
    <!--resource對應的是一個接口類的映射文件-->
    <mapper class="com.kuang.dao.UserDao"/>
</mappers>

項目實現

1.項目結構:
在這裏插入圖片描述
2.myBatisUitils文件編寫

package com.kuang.utils;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;


//mybatis的工具類,重複的代碼的提純
public class MyBatisUtils {

    //類變量不需要設置默認值;
    private static SqlSessionFactory sqlSessionFactory;

    static {

        //在maven中,所有的資源文件一般都放在resources目錄下,我們可以直接拿到。
        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    //設置SqlSessionFactory公共的方法
    public static SqlSessionFactory getSqlSessionFactory(){
        return sqlSessionFactory;
    }

    //獲得一個帶事務自動提交功能的SqlSession公共的方法
    public static SqlSession getSqlSession(){
        //自動提交事務
        return sqlSessionFactory.openSession(true);
    }


}

3.userDaoTest文件編寫:

package com.kuang.dao;

import com.kuang.pojo.User;
import com.kuang.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import java.util.List;

public class UserDaoTest {

    @Test
    public void getUserList(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();//帶自動提交事務

        UserDao mapper = sqlSession.getMapper(UserDao.class);

        List<User> userList = mapper.getUserList();

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

        sqlSession.close();//關閉sqlSession;

    }

    @Test
    public void getUserById(){

        SqlSession sqlSession = MyBatisUtils.getSqlSession();//帶自動提交事務

        UserDao mapper = sqlSession.getMapper(UserDao.class);

        User user = mapper.getUserById(1);

        System.out.println(user);

        sqlSession.close();//關閉sqlSession;

    }

    @Test
    public void addUser(){

        SqlSession sqlSession = MyBatisUtils.getSqlSession();//帶自動提交事務
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        User user = new User(5, "阿貓", "like-dog");
        int i = mapper.addUser(user);
        System.out.println(i);

        sqlSession.close();//關閉sqlSession;

    }

    @Test
    public void updateUser(){

        SqlSession sqlSession = MyBatisUtils.getSqlSession();//帶自動提交事務
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        User user = new User(5, "阿狗", "like-cat");
        int i = mapper.updateUser(user);
        System.out.println(i);

        sqlSession.close();//關閉sqlSession;

    }

    @Test
    public void deleteUser(){

        SqlSession sqlSession = MyBatisUtils.getSqlSession();//帶自動提交事務
        UserDao mapper = sqlSession.getMapper(UserDao.class);

        int i = mapper.deleteUser(5);
        System.out.println(i);

        sqlSession.close();//關閉sqlSession;

    }

}

面向接口編程

提出的原因:解耦,方便拓展,提高代碼的複用性,上層不用管下層實現,只用去調用對應的接口即可。規範性好。

面向過程編程:隨着系統越來越大,我們無法使用面向過程的思想滿足。面對對象。

面向對象編程:所有系統耦合性高,所有的功能都是由許許多多不同的對象去完成的。隨着系統越來越大。

接口 & 抽象類

面向接口編程:約束開發人員操作,而且方便擴展以及規劃。

更深層次的分離:定義與實現的一個分離;

接口可以反映一個開發人員的水平高低以及對系統架構理解;

使用註解開發

早期的,mybatis都是使用xml進行配置的,直到註解的出現,註解可以替代一些xml中的配置。

連xml配置都不要了!

CRUD的註解:

  • @insert()
  • @delete()
  • @update()
  • @select()

UserDao.java

package com.kuang.dao;

import com.kuang.pojo.User;
import org.apache.ibatis.annotations.*;

import java.util.List;

public interface UserDao {

    //查詢全部用戶
    @Select("select * from user")
    List<User> getUserList();

    //通過ID查詢用戶
    @Select("select * from user where id = #{id}")
    User getUserById(@Param("id") int id);

    //添加用戶
    @Insert("insert into user(id,name,pwd) values (#{id},#{name},#{pwd})")
    int addUser(User user);

    //修改用戶信息
    @Update("update user set name = #{name}, pwd = #{pwd} where id = #{id}")
    int updateUser(User user);

    //刪除用戶
    @Delete("delete from user where id =#{uid}")
    int deleteUser(@Param("uid") int id);

}

mybatis核心文件
之前不使用註解:
在這裏插入圖片描述
使用註解:
在這裏插入圖片描述
mybatis-config.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="database.properties"/>

    <!--Mybatis設置-->
    <settings>
        <!--默認日誌實現-->
        <!--<setting name="logImpl" value="STDOUT_LOGGING"/>-->

        <!--Log4j實現-->
        <setting name="logImpl" value="LOG4J"/>
    </settings>

    <!--配置別名-->
    <typeAliases>
        <!--<typeAlias type="com.kuang.pojo.User" alias="User"/>-->
        <package name="com.kuang.pojo"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <!--class對應的是一個接口類-->
        <!--resource對應的是一個接口類的映射文件-->
        <mapper class="com.kuang.dao.UserDao"/>
    </mappers>

</configuration>

測試類

package com.kuang.dao;

import com.kuang.pojo.User;
import com.kuang.utils.MyBatisUtils;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import sun.rmi.server.UnicastServerRef;

import java.util.List;


public class UserDaoTest {

    @Test
    public void getUserList(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();//帶自動提交事務

        UserDao mapper = sqlSession.getMapper(UserDao.class);

        List<User> userList = mapper.getUserList();

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

        sqlSession.close();//關閉sqlSession;

    }

    @Test
    public void getUserById(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();//帶自動提交事務

        UserDao mapper = sqlSession.getMapper(UserDao.class);

        User user = mapper.getUserById(1);

        System.out.println(user);

        sqlSession.close();//關閉sqlSession;

    }
    

    @Test
    public void addUser(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();//帶自動提交事務
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        User user = new User(5, "阿貓", "like-dog");
        int i = mapper.addUser(user);
        System.out.println(i);

        sqlSession.close();//關閉sqlSession;

    }

    @Test
    public void updateUser(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();//帶自動提交事務
        UserDao mapper = sqlSession.getMapper(UserDao.class);
        User user = new User(5, "阿狗", "like-cat");
        int i = mapper.updateUser(user);
        System.out.println(i);

        sqlSession.close();//關閉sqlSession;

    }

    @Test
    public void deleteUser(){
        SqlSession sqlSession = MyBatisUtils.getSqlSession();//帶自動提交事務
        UserDao mapper = sqlSession.getMapper(UserDao.class);

        int i = mapper.deleteUser(5);
        System.out.println(i);

        sqlSession.close();//關閉sqlSession;

    }
}

注意事項

  1. 開啓事務自動提交了
  2. @param參數儘量都寫上,如果有多個參數,就必須填寫。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章