MyBatis框架学习(二)——查询、封装、事务管理以及分页查询

1. 查询操作

1.1 查询全部

  • DAO中定义查询全部的接口。
public interface BookDAO {
    public int insertBook(Book book);
    public int deleteBook(int book_num);
    public List<Book> selectAll();
}
  • BookMapper.xml 文件中定义实现。
<select id="selectAll">
    select * from novels.books
</select>
  • 如果不知道类中每个变量与数据库中每一列的对应关系,可以使用 resultMap 标签,写了resultMap 标签后,可以在查询中指定相关的 resultMap ,不写 resultMap 的话,就必须在 select 标签中写 resultType
<resultMap id="BookMap" type="com.mr.things.Book">
    <id column="num" property="num"/>
    <result column="name" property="book_name"/>
    <result column="author" property="author"/>
</resultMap>

<select id="selectAll"  resultMap="BookMap">
    select * from novels.books
</select>

resultMap标签前面是数据库中的列名,后面是数据库中列名对应的类中的属性名。

  • 单元测试
@Test
public void selectAll() {
    try {
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(is);
        SqlSession sqlSession = factory.openSession();
        BookDAO bookDAO = sqlSession.getMapper(BookDAO.class);

        List<Book> books = bookDAO.selectAll();

        for(Book book : books){
            System.out.println(book);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }
}

1.2 查询单个

  • DAO中定义查询单个的接口。
public interface BookDAO {
    public int insertBook(Book book);
    public int deleteBook(int book_num);
    public List<Book> selectAll();
    public Book selectOne(int book_num);
}
  • BookMapper.xml 文件中定义接口实现。
<select id="selectOne" resultMap="BookMap">
    select * from novels.books where num=#{num}
</select>

resultMap标签前面是数据库中的列名,后面是数据库中列名对应的类中的属性名。

  • 单元测试
@Test
@Test
public void selectOne() {
    try {
        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        SqlSessionFactory factory = builder.build(is);
        SqlSession sqlSession = factory.openSession();
        BookDAO bookDAO = sqlSession.getMapper(BookDAO.class);

        Book book = bookDAO.selectOne(3);

        System.out.println(book);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

3. 封装

在包下建立一个 Utils 的包,放入我们封装的类,类中代码如下:

public class MyBatisUtil {

    private static SqlSessionFactory factory;
    private static final ThreadLocal<SqlSession> local = new ThreadLocal<SqlSession>();

    static{
        try {
            InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
            SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
            factory = builder.build(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static SqlSessionFactory getFactory(){
        return factory;
    }

    private static SqlSession getSqlSession(boolean isAutoCommit){
        SqlSession sqlSession = local.get();
        if(sqlSession == null ){
            sqlSession = factory.openSession(isAutoCommit);
            local.set(sqlSession);
        }
        return sqlSession;
    }

    //手动事务管理
    public static SqlSession getSqlSession(){
        return getSqlSession(false);
    }

    //自动事务提交
    public static <T extends Object>T getMapper(Class<T> c){
        SqlSession sqlSession = getSqlSession(true);
        return sqlSession.getMapper(c);
    }

}

3. 事务提交

3.1 手动提交事务

  • sqlSession.commit();提交事务
  • sqlSession.rollback();事务回滚
    测试类中进行事务管理如下:
@Test
public void insertStudent() {
    SqlSession sqlSession = MyBatisUtil.getSqlSession();
    //1.当我们获取sqlSession对象时,就默认开启了事务
    try{
        //通过会话获取DAO对象
        StudentDAO studentDAO = sqlSession.getMapper(StudentDAO.class);
        //测试StudentDAO中的方法
        Student student = new Student(0, "10005", "Lily", "女", 21);
        int i = studentDAO.insertStudent(student);
        //2.操作完成并成功之后,需要手动提交
        sqlSession.commit();
    }catch (Exception e){
        //3.当操作出现异常,调用rollback进行回滚
        sqlSession.rollback();
    }
}

3.2 自动提交

通过 SqlSessionFactory 调用 openSession 方法获取 SqlSession 对象时,可以通过参数设置事务是否自动提交:

  • 如果参数设置为 true ,表示自定提交事务: factory.openSession(true);
  • 如果参数设置为 false ,或者不设置参数,表示手动提交:factory.openSession();/factory.openSession(false);
    测试代码
@Test
public void deleteBook() {
    BookDAO studentDAO = MyBatisUtil.getMapper(BookDAO.class);
    int i = studentDAO.deleteBook(11);
}

4. 分页查询

4.1 添加依赖

添加 pagehelper 依赖,添加示例:

<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.10</version>
</dependency>

4.2 配置插件

在主配置文件 mybatis-config.xml 中对插件进行配置。

<plugins>
    <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>

<plugins> 标签的位置在 <properties> 标签和 <environments> 标签之间。

4.3 分页示例

@Test
public void testListStudentsByPage() {
    BookDAO bookDAO = MyBatisUtil.getMapper(BookDAO.class); //sqlSession
    PageHelper.startPage(2,4);
    List<Book> books = bookDAO.selectAll();
    PageInfo<Book> pageInfo = new PageInfo<Book>(books);
    //pageInfo中就包含了数据及分页信息
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值