MyBatis学习笔记——HelloWorld

全局配置文件

有数据源一些运行环境信息,使用这个配置文件,可以创建一个SqlSessionFactory对象。
sql映射文件的配置也在该全局文件中配置。
代码如下:

<?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>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url"
                    value="jdbc:mysql://localhost:3306/mybatis?useSSL=false" />
                <property name="username" value="root" />
                <property name="password" value="root" />
            </dataSource>
        </environment>
    </environments>

    <!-- 将我们写好的sql映射文件(EmployeeMapper.xml)一定要注册到全局配置文件(mybatis-config.xml)中 -->
    <mappers>
        <mapper resource="EmployeeMapper.xml" />
    </mappers>
</configuration>

说明:
<configuration>标签中,配置了数据库的信息;
<mapppers>标签中,配置了sql映射文件,将其注册到全局文件中,即根据该全局文件生成的SqlSessionFactory对象包含了这个映射。

编写sql映射文件

EmployeeMapper.xml,该文件定义了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="com.shen.mybaties.EmployeeMapper">
<!-- 
    namespase:名称空间
    id:唯一标识
    resultType:返回值类型
    #{id}:从传递过来的参数中取出id值
 -->
  <select id="selectEmp" resultType="com.shen.mybaties.bean.Employee">
    select id,last_name lastName,email,gender from tbl_employee where id = #{id}
  </select>
</mapper>

其中:
(1)namespase:命名空间,防止id冲突,类似于包名。
(2)id:唯一标识,调用的时候使用该标识。
(3)resultType:返回值类型,使用全类名,MyBatis帮我们将结果自动转换成对应的bean(需要有setter方法)。
(4)sql中的#{id}:传递过来的参数

编写测试类

(1)根据官方文档,首先我们需要构建一个SqlSessionFactory对象。
(2)使用SqlSessionFactory对象创建一个SqlSession对象
(3)使用SqlSession对象执行已映射的 SQL 语句。
(4)使用完,需要关闭SqlSession对象。
代码如下:

/**
     * 1. 根据xml配置文件(全局配置文件)创建一个SqlSessionFactory对象
     *  有数据源一些运行环境信息
     * 2. sql映射文件,配置了每一个sql,以及sql的封装规则等.
     * 3. 将sql映射文件注册在全局配置文件中
     * 4. 写代码
     *      1). 根据全局配置文件得到SqlSessionFactory
     *      2). 使用sqlSession工程,获取到sqlSession对象使用它来执行增删改查
     *          一个sqlSession就是代表和数据库一次会话,用完关闭
     *      3). 使用swl的唯一标志来告诉MyBatis执行哪个sql,sql都是保存在sql映射文件中的.
     */
    @Test
    public void test() throws IOException {
        String resource = "mybaties.xml";
        InputStream inputStream = Resources.getResourceAsStream(resource);
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        // 2、获取sqlSession示例,能直接执行已经映射的sql语句
        SqlSession openSession = sqlSessionFactory.openSession();
        try {
            // arg1:唯一标识,namespace+id
            // arg2:传递的参数
            Employee employee = openSession.selectOne("com.shen.mybaties.EmployeeMapper.selectEmp", "1");
            System.out.println(employee);
        } finally {
            openSession.close();
        }
    }

接口式编程

编写一个接口

public interface EmployeeMapper {

    public Employee getEmpById(Integer id);
}

绑定接口和方法

编写好接口后,需要修改我们的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="com.shen.mybaties.dao.EmployeeMapper">
<!-- 
    namespase:名称空间,指定为接口的全类名
    id:唯一标识,改为对应的方法名
    resultType:返回值类型
    #{id}:从传递过来的参数中取出id值

    public Employee getEmpById(Integer id);
 -->
  <select id="getEmpById" resultType="com.shen.mybaties.bean.Employee">
    select id,last_name lastName,email,gender from tbl_employee where id = #{id}
  </select>
</mapper>

有两点需要注意:
(1)命名空间的变化:命名空间改为接口类的全类名
(2)sql语句的id的变化:id改为接口类的方法名
有了这两点,MyBatis会自动帮我们进行绑定。

编写新的测试方法

    @Test
    public void test2() throws IOException {
        // 1. 获取SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        // 2. 获取sqlSession示例,能直接执行已经映射的sql语句
        SqlSession openSession = sqlSessionFactory.openSession();
        try {
            // 3. 获取接口的实现类对象
            // 会为接口自动的创建一个代理对象,代理对象去执行增删改查方法
            EmployeeMapper employeeMapper = openSession.getMapper(EmployeeMapper.class);

            Employee employee = employeeMapper.getEmpById(1);

            System.out.println(employeeMapper.getClass());
            System.out.println(employee);

        } finally {
            openSession.close();
        }
    }

注意:
(1)把获取sqlSessionFactory的方法提取出来,代码复用。
(2)注释3中,不是直接获取Employee对象,而是先获取一个Mapper类(接口实现类),直接调用该接口的sql方法,即可获取该对象。
通过调试输出观察,openSession获取的employeeMapper实际上是一个代理对象

好处

1、解耦
2、不用担心易错的字符串字面值以及强制类型转换,这里的接口方法已经规定了入参类型,返回值类型,这样我们可以更好地避免人为错误。

推荐使用接口式编程

小结

  1. 基于接口式编程
    原生: Dao ======> DaoImpl
    mybatis: Mapper ======> xxMapper.xml
  2. SqlSession代表和数据库的一次会话:用完必须关闭;
  3. SqlSession和connection一样,都是非线程安全的,不能写成成员变量,每次使用应该获取新的对象。
  4. mapper接口没有实现类,但是mybatis会为这个接口生成一个代理对象,需要将接口和xml进行绑定。
    获取方式:
    EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class);
  5. 两个重要的配置文件:
    1). mybatis的全局配置文件:包含数据库连接池信息,事务管理信息等,系统运行环境信息,以及注册sql映射信息。
    2). sql映射文件:保存了每一个sql语句的映射信息。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值