Mybatis(2)---insert语句,主要类介绍,mybatis动态代理,mybatis工具类

一、Mybatis执行insert语句

1.sql映射文件

<?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="HelloMybatis.TestDao">
    <!--
        insert:插入语句
    -->
    <insert id="insertTest">
        <!--这里的#{id}代表传进来对象的属性值-->
        insert into t_test values (#{id},#{name});
    </insert>
</mapper>

2.接口文件

import java.util.List;

//定义操作test表的接口
public interface TestDao
{
    
    
    //插入数据的方法
    //参数test表示要插入数据库的数据
    //返回值int表示执行insert语句后影响数据库的行数
    public int insertTest(Test test);
}

3.用于保存数据库一列的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 + '\'' +
                '}';
    }
}

4.test文件夹下的测试类

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();
    }
}

二、主要类介绍

1.Resources

Resources是mybatis中的一个类,负责读取主配置文件

InputStream in = Resources.getResourceAsStream(“xxx.xml”);

2.SqlSessionFactoryBuilder

SqlSessionFactoryBuilder,用于创建SqlSessionFactory对象用于创建SqlSessionFactory对象

SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);

3.SqlSessionFactory

(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

4.SqlSession

SqlSession是一个接口,里面定义了很多操作事务的方法
例如:selectOne(),selectList(),insert(),update(),delete(),commit(),rollback()
SqlSession接口的实现类:DefaultSqlSession
使用要求:由于SqlSession对象不是线程安全的,因此在执行sql语句之前,需要使用openSession()方法获取SqlSession对象,执行完sql语句之后需要关闭(执行close方法)
需要这样操作才能保证线程安全

三、Mybatis中的动态代理

未使用动态代理

import org.junit.Test;

import java.util.List;

public class TestMybatis
{
    
    
    @Test
    public void testSelectTests()
    {
    
    
        /**
         * 方法:List<customDAO.Test> 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));
    }
}

四、Mybatis工具类

可以通过工具类直接获取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;
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_46841376/article/details/114490742