首页 > 代码库 > mybatis之增删改查

mybatis之增删改查

在与数据库连接的时候

需要把与数据库连接的代码放在静态代码块中

从XML中构建SqlSessionFactory,再从SqlSessionFactory构建获取SqlSession

private static SqlSessionFactory factory;

static{
  InputStream in = null;
  try {
    in = Resources.getResourceAsStream("mybatis.xml");
    LogManager.getLogger().debug("加载mybatis配置文件成功...");
  } catch (IOException e) {
    LogManager.getLogger().debug("加载mybatis配置文件失败...");
  }

  factory = new SqlSessionFactoryBuilder().build(in);
  LogManager.getLogger().debug("根据mybatis配置文件信息构建SqlSessionFactory实例对象成功...");
}

/**
* 获得数据库会话连接,默认手动事务
* 需要手动结束事务 rollback 或者 commit   //rollback  在数据库里做修改后 ( update ,insert , delete)未commit 之前 使用rollback 可以恢复数据到修改之前
* @return
*/

public static SqlSession getSession(){

  SqlSession session = factory.openSession();
  LogManager.getLogger().debug("根据SqlsessionFactory生产手动事务Sqlsession实例对象成功...");
  return session;
}

/**
* 获得数据库会话连接,默认自动事务
* @return
*/
public static SqlSession getAutoTransactionSession(){
  SqlSession session = factory.openSession(true);  // 
SqlSession org.apache.ibatis.session.SqlSessionFactory.openSession(boolean autoCommit)  为true的时候会自动提交,不需要手动。

  LogManager.getLogger().debug("根据SqlsessionFactory生产自动事务Sqlsession实例对象成功...");
  return session;
}

配置mybatis.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="db.properties"/> <!-- 加载外部的属性文件,使用${key}取到 -->

  <typeAliases>
  <!-- <typeAlias type="" alias=""/> -->
    <package name="com.yc.mybatis.entity"/> <!-- 对包中的所有类命别名,别名为类名 -->
  </typeAliases>

  <environments default="development">
    <environment id="development">
      <transactionManager type="JDBC" />
      <dataSource type="POOLED">
        <property name="driver" value="http://www.mamicode.com/${jdbc.driverClassName}" />
        <property name="url" value="http://www.mamicode.com/${jdbc.url}" />
        <property name="username" value="http://www.mamicode.com/${jdbc.username}" />
        <property name="password" value="http://www.mamicode.com/${jdbc.password}" />
      </dataSource>
    </environment>
  </environments>

  <mappers>
    <mapper resource="Mapper/BlogMapper.xml"/> <!-- 注册映射文件 -->
  </mappers>
</configuration>

BlogMapper类

import com.yc.mybatis.entity.Blog;

/**
* 映射接口:与映射文件相对应的接口
* @author Administrator
*
*/
public interface BlogMapper {
  //与映射文件中的sql语句映射
  Blog getBlogById(int id);

  //插入操作
  int insertBlog(Blog blog);

  //修改操作
  int updateBlogById(Blog blog);

  //删除操作
  int delBlogById(int id);

  //查询所有
  List<Blog> findAllBlogs();
}

对应的BlogMapper.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.yc.mybatis.mapper.BlogMapper">

  <!-- id与映射口中的方法名一致
    resultType与映射接口中方法的返回类型
    parameterType与映射接口中方法的参数列表的参数类型一致
    #{xx} xx与映射接口中方法的参数列表的参数名一致
  -->

  <select id="getBlogById" resultType="Blog"
    parameterType="int">
    select * from blog where id = #{id}
  </select>

  <insert id="insertBlog" parameterType="Blog">
    insert into blog values(#{id},#{author},#{title})
  </insert>

  <update id="updateBlogById" parameterType="Blog">
    update blog set author=#{author},title=#{title} where id=#{id}
  </update>

  <delete id="delBlogById" parameterType="int">
    delete from blog where id=#{id}
  </delete>

  <select id="findAllBlogs" resultType="Blog">
    select * from blog
  </select>
</mapper>

使用junit框架进行测试

测试类如下:

package com.yc.mybatis.util;

import static org.junit.Assert.*;

import java.sql.Connection;
import java.util.List;

import org.apache.ibatis.session.SqlSession;
import org.junit.Test;

import com.yc.mybatis.entity.Blog;
import com.yc.mybatis.mapper.BlogMapper;

public class MybatisUtilTest {

  @Test
  public void testGetConn() {
    SqlSession session = MybatisUtil.getSession();
    Connection con = MybatisUtil.getSession().getConnection();
    MybatisUtil.close(session);
    assertNotNull("数据库连接失败",con);
  }

  @Test //查询
  public void testGetBlog(){
    SqlSession session = MybatisUtil.getSession();
    BlogMapper bm = session.getMapper(BlogMapper.class);
    Blog blog = bm.getBlogById(2);
    System.out.println("==>" + blog);
    MybatisUtil.close(session);
    assertNotNull(blog);
  }

  @Test //插入
  public void testInsert(){
    SqlSession session = MybatisUtil.getSession();
    //默认启动了事务,需要手动结束事务 rollback 或者 commit
    BlogMapper bm = session.getMapper(BlogMapper.class);
    Blog blog = new Blog(3,"jdsf","gloria");
    int result = bm.insertBlog(blog);
    //session.rollback(); 在数据未commit之前,对数据库的insert,del,update操作,使数据库回到修改之前的状态。
    session.commit();
    MybatisUtil.close(session);
    assertEquals(1, result);
  }

  @Test
  public void testInsert02(){
    //启动了自动事务,不需要commit或者rollback
    SqlSession session = MybatisUtil.getAutoTransactionSession();
    BlogMapper bm = session.getMapper(BlogMapper.class);
    Blog blog = new Blog(5,"这是第四条","自信");
    int result = bm.insertBlog(blog);
    MybatisUtil.close(session);
    assertEquals(1, result);
  }

  @Test //报错说 initializationError是因为没有 @Test标识
  public void testUpdate(){
    SqlSession session = MybatisUtil.getAutoTransactionSession();
    BlogMapper bm = session.getMapper(BlogMapper.class);
    Blog blog = new Blog(1,"Candy","工作不容易");
    int result = bm.updateBlogById(blog);
    MybatisUtil.close(session);
    assertEquals(1, result);
  }

  @Test
  public void testDelBlog(){
    SqlSession session = MybatisUtil.getAutoTransactionSession();
    BlogMapper bm = session.getMapper(BlogMapper.class);
    //int id = 1;
    int result = bm.delBlogById(2);
    MybatisUtil.close(session);
    assertEquals(1, result);
  }

  @Test
  public void testFindAll(){
    SqlSession session = MybatisUtil.getAutoTransactionSession();
    BlogMapper bm = session.getMapper(BlogMapper.class);
    List<Blog> blogs = bm.findAllBlogs();
    System.out.println(blogs);
    MybatisUtil.close(session);
    assertNotNull(blogs);
  }
}

到此为止,基于mybatis的简单增删改查就基本能操作了

在插入数据的时候因为启动的是手动事务,然后没有采取commit/rollback,控制台显示更新了一条内容但数据库查不到内容

在写测试方法的时候忘记写@Test所以在测试的时候报错说initializationError

还有写sql语句的时候习惯在后面加上一个分号,但是在BlogMapper.xml中不需要加分号

不然会报错说未知符号

 

mybatis之增删改查