<mapper namespace="HelloMybatis.TestDao">
<insert id="insertTest">
insert into t_test values (#{id},#{name});
insert>
mapper>
import java.util.List;
//定义操作test表的接口
public interface TestDao
{
//插入数据的方法
//参数test表示要插入数据库的数据
//返回值int表示执行insert语句后影响数据库的行数
public int insertTest(Test test);
}
package HelloMybatis;
//用于保存t_test表中一列数据的类
public class Test
{
private Integer id;
private String name;
public Integer getId() {
return id;
}
public String getName() {
return name;
}
public void setId(Integer id) {
this.id = id;
}
public void setName(String name) {
this.name = name;
}
public String toString() {
return "Test{" +
"id=" + id +
", name='" + name + '\'' +
'}';
}
}
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.InputStream;
import java.util.List;
public class TestInsert
{
//测试方法,测试insert语句的功能
@org.junit.Test
public void testInsert() throws Exception
{
//访问mybatis读取t_test中的数据
//1.定义mybatis主配置文件的名称,从类路径的根开始(target/classes之后的)
String config = "mybatis.xml";
//2.读取这个config表示的文件
InputStream in = Resources.getResourceAsStream(config);
//3.创建SqlSessionFactoryBuilder对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//4.创建SqlSessionFactory对象
SqlSessionFactory factory = builder.build(in);
//5.获取SqlSession对象
SqlSession sqlSession = factory.openSession();
//6.指定要执行的sql语句的标识
//sql映射文件中的namespace+"."+标签的id值
String sqlId = "HelloMybatis.TestDao" + "." + "insertTest";
//7.执行sql语句,通过sqlId找到语句
Test t = new Test();
t.setId(1003);
t.setName("王五");
int nums = sqlSession.insert(sqlId, t);
//提交事务
//mybatis默认不提交事务,只有提交事务后才会真正插入数据
sqlSession.commit();
//8.输出结果
System.out.println("插入数据库的行数为:" + nums);
//9.关闭sqlSession对象
sqlSession.close();
}
}
Resources是mybatis中的一个类,负责读取主配置文件
InputStream in = Resources.getResourceAsStream(“xxx.xml”);
SqlSessionFactoryBuilder,用于创建SqlSessionFactory对象用于创建SqlSessionFactory对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
(1)SqlSessionFactory是一个重量级对象
程序创建这个对象耗时较长,使用资源比较多。整个项目中只需要一个
(2)SqlSessionFactory是一个接口,它的一个实现类为DefaultSqlSessionFactory
(3)SqlSessionFactory的作用:获取SqlSession对象
SqlSession sqlSession = factory.openSession();
openSession()方法:
(1)openSession():无参数,获取的是非自动提交事务的sqlSession
(2)openSession(boolean):openSession(true),获取自动提交事务的sqlSession
openSession(false),获取非自动提交事务的sqlSession
SqlSession是一个接口,里面定义了很多操作事务的方法
例如:selectOne(),selectList(),insert(),update(),delete(),commit(),rollback()
SqlSession接口的实现类:DefaultSqlSession
使用要求:由于SqlSession对象不是线程安全的,因此在执行sql语句之前,需要使用openSession()方法获取SqlSession对象,执行完sql语句之后需要关闭(执行close方法)
需要这样操作才能保证线程安全
未使用动态代理
import org.junit.Test;
import java.util.List;
public class TestMybatis
{
@Test
public void testSelectTests()
{
/**
* 方法:List tests = test.selectTests();的调用
* 1,dao对象,类型是TestDao,全限定名称是:HelloMybatis.TestDao
* 全限定名称和namespace是一样的
*
* 2.方法名称:selectTests();,这个方法名就是mapper文件中的id值selectTests
*
* 3.通过返回值也可以确定Mybatis要调用的SqlSession的方法
* 如果返回值是List,则调用selectList()方法
* 如果返回值是int,则根据mapper文件中的标签确定是调用insert或是update方法
* 4,mybatis中的动态代理
* mybatis根据dao的方法调用,获取执行sql语句的信息
* mybatis根据具体的dao接口,创建出一个dao接口的实现类,并创建这个类的对象
* 完成SqlSession调用方法,访问数据库
* */
TestDao test = new TestDaoImpl();
List<customDAO.Test> tests = test.selectTests();
tests.forEach(test1 -> System.out.println(test1));
}
}
使用动态代理
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class TestMybatis
{
@Test
public void testSelectTests()
{
/**
* 使用mybatis的动态代理机制,使用SqlSession.getMapper(dao接口)方法
* 这个方法能获取dao接口对应的实现类对象
**/
SqlSession sqlSession = MybatisUtil.getSqlSession();
TestDao testDao = sqlSession.getMapper(TestDao.class);
//调用dao的方法,执行数据库的操作
List<customDAO.Test> tests = testDao.selectTests();
tests.forEach(test1 -> System.out.println(test1));
}
}
可以通过工具类直接获取SqlSession,避免了很多重复代码
package HelloMybatis;
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.InputStream;
//工具类,获取SqlSession
public class MybatisUtil
{
private static SqlSessionFactory factory = null;
static
{
String config = "mybatis.xml";
try
{
InputStream in = Resources.getResourceAsStream(config);
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
factory = builder.build(in);
}
catch (Exception e)
{
e.printStackTrace();
}
}
public static SqlSession getSqlSession()
{
SqlSession sqlSession = null;
if(factory != null)
{
sqlSession = factory.openSession();
}
return sqlSession;
}
}