mybatis之增删改查
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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="${jdbc.driverClassName}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${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之增删改查的主要内容,如果未能解决你的问题,请参考以下文章