返回介绍

9.1 MyBatis 独立使用

发布于 2025-04-22 22:09:15 字数 5828 浏览 0 评论 0 收藏

尽管我们接触更多的是 MyBatis 与 Spring 的整合使用,但是 MyBatis 有它自己的独立使用方法,了解其独立使用的方法套路对分析 Spring 整合 MyBatis 非常有帮助,因为 Spring 无非就是将这些功能进行封装以简化我们的开发流程。MyBatis 独立使用包括以下几步。

(1)建立 PO。

用于对数据库中数据的映射,使程序员更关注于对 Java 类的使用而不是数据库的操作。

public class User {

private Integer id;

  private String name;

  private Integer age;

  //省略 set/get 方法

  public User(String name, Integer age) {

super();

  this.name = name;

  this.age = age;

 }

  public User() {

  super();

  } //必须要有这个无参构造方法,不然根据 UserMapper.xml 中的配置,在查询数据库时,将不能反射构造出

 User 实例

}

(2)建立 Mapper。

数据库操作的映射文件,也就是我们常常说的 DAO,用于映射数据库的操作,可以通过配置文件指定方法对应的 SQL 语句或者直接使用 Java 提供的注解方式进行 SQL 指定。

public interface UserMapper {

  public void insertUser(User user);

  public User getUser(Integer id);

}

(3)建立配置文件。

配置文件主要用于配置程序中可变性高的设置,一个偏大的程序一定会存在一些经常会变化的变量,如果每次变化都需要改变源码那会是非常糟糕的设计,所以,我们看到各种各样的框架或者应用的时候都免不了要配置配置文件,MyBatis 中的配置文件主要封装在 configuration 中,配置文件的基本结构如图 9-1 所示。

figure_0242_0041

图 9-1 配置文件结构

configuration:根元素。

properties:定义配置外在化。

settings:一些全局性的配置。

typeAliases:为一些类定义别名。

typeHandlers:定义类型处理,也就是定义 Java 类型与数据库中的数据类型之间的转换关系。

objectFactory:用于指定结果集对象的实例是如何创建的。

plugins:MyBatis 的插件,插件可以修改 MyBatis 内部的运行规则。

environments:环境。

environment:配置 MyBatis 的环境。

transactionManager:事务管理器。

dataSource:数据源。

mappers:指定映射文件或映射类。

读者如果对上面的各个配置具体使用方法感兴趣,可以进一步查阅相关资料,这里只举出最简单的实例以方便读者快速回顾 MyBatis。

<?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>

 <settings>

   <!-- changes from the defaults for testing -->

   <setting name="cacheEnabled" value="false" />

   <setting name="useGeneratedKeys" value="true" />

   <setting name="defaultExecutorType" value="REUSE" />

 </settings>

 <typeAliases>

   <typeAlias alias="User" type="bean.User"/>

 </typeAliases>

  <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/lexueba"/>

     <property name="username" value="root"/>

     <property name="password" value="haojia0421xixi"/>

   </dataSource>

  </environment>

 </environments>

 <mappers>

   <mapper resource="resource/UserMapper.xml" />

 </mappers>

</configuration>

(4)建立映射文件。

对应于 MyBaits 全局配置中的 mappers 配置属性,主要用于建立对应数据库操作接口的 SQL 映射。MyBatis 会将这里设定的 SQL 与对应的 Java 接口相关联,以保证在 MyBatis 中调用接口的时候会到数据库中执行相应的 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="Mapper.UserMapper">

<!-- 这里 namespace 必须是 UserMapper 接口的路径,不然要运行的时候要报错 “is not known to the

MapperRegistry”-->

  <insert id="insertUser" parameterType="User" >

   insert into user(name,age) values(#{name},#{age})

   <!--这里 sql 结尾不能加分号,否则报“ORA-00911”的错误 -->

 </insert>

  <!-- 这里的 id 必须和 UserMapper 接口中的接口方法名相同,不然运行的时候也要报错 -->

  <select id="getUser" resultType="User" parameterType="java.lang.Integer" >

   select * from user where id=#{id}

 </select>

</mapper>

(5)建立测试类。

至此我们已经完成了 MyBatis 的建立过程,接下来的工作就是对之前的所有工作进行测试,以便直接查看 MyBatis 为我们提供的效果。

public class MyBatisUtil {

  private final static SqlSessionFactory sqlSessionFactory;

  static {

   String resource = "resource/mybatis-config.xml";

   Reader reader = null;

   try {

    reader = Resources.getResourceAsReader(resource);

   } catch (IOException e) {

   System.out.println(e.getMessage());

  }

   sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);

 }

  public static SqlSessionFactory getSqlSessionFactory() {

   return sqlSessionFactory;

 }

}

public class TestMapper {

  static SqlSessionFactory sqlSessionFactory = null;

  static {

   sqlSessionFactory = MyBatisUtil.getSqlSessionFactory();

 }

 @Test

  public void testAdd() {

   SqlSession sqlSession = sqlSessionFactory.openSession();

   try {

    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

    User user = new User("tom",new Integer(5));

   userMapper.insertUser(user);

   sqlSession.commit();//这里一定要提交,不然数据进不去数据库中

   } finally {

   sqlSession.close();

  }

 }

 @Test

  public void getUser() {

   SqlSession sqlSession = sqlSessionFactory.openSession();

   try {

    UserMapper userMapper = sqlSession.getMapper(UserMapper.class);

    User user = userMapper.getUser(1);

    System.out.println("name: "+user.getName()+"|age: "+user.getAge());

   } finally {

   sqlSession.close();

  }

 }

}

注意,这里在数据库设定了 id 自增策略,所以插入的数据会直接在数据库中赋值,当执行测试后如果数据表为空,那么在表中会出现一条我们插入的数据,并会在查询时将此数据查出。

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。