MyBatis(一)

MyBatis(一)

简介

  • MyBatis是一款优秀的持久层框架
  • 避免了几乎所有的JDBC代码和手动设置参数以及获取结果集
  • 可以使用简单的XML或注解来配置和映射原生类型、接口和Java的POJO(Plain Old Java Objects)为数据库中的记录
  • 原名iBatis,提供的持久层框架包括SQL Maps和Data Access Objects(DAOs)

持久层

  • 数据持久化就是将程序的数据在持久状态和瞬时状态转化的过程

  • 持久层就是完成持久化工作的代码块

第一个MyBatis程序

准备工作

  • 搭建数据库
create database `mybatis`;
use `mybatis`;

create table `user`(
    `id` int(20) not null primary key,
    `name` varchar(30) default null,
    `pwd` varchar(30) default null
)engine = innodb default charset = utf8;

insert into `user`(`id`, `name`, `pwd`) values
(1, 'nameA', '123456'),
(2, 'nameB', '654321'),
(3, 'nameC', '321456');
  • 新建普通Maven项目,修改Maven路径

  • 导入依赖:MySQL驱动,MyBatis,junit

  • 创建一个模块

  • 编写MyBatis核心配置文件

    • 在src/main/resources/目录下新建mybatis-config.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>
          <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&amp;useUnicode=true&amp;characterEncoding=UTF-8"/>
                      <property name="username" value="root"/>
                      <property name="password" value="123456"/>
                  </dataSource>
              </environment>
          </environments>
      </configuration>
      
  • 编写MyBatis工具类

    • public class MyBatisUtil {
          private static SqlSessionFactory sqlSessionFactory;
      
          static {
              try {
                  //获取SqlSessionFactory对象
                  String resource = "mybatis-config.xml";
                  InputStream inputStream = Resources.getResourceAsStream(resource);
                  sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
      
          //获取SqlSession对象
          public static SqlSession getSqlSession(){
              return sqlSessionFactory.openSession();
          }
      }
      

编写代码

  • pojo实体类:

    • public class User {
          private int id;
          private String name;
          private String pwd;
      
          public User() {
          }
      
          public User(int id, String name, String pwd) {
              this.id = id;
              this.name = name;
              this.pwd = pwd;
          }
      
          public int getId() {
              return id;
          }
      
          public void setId(int id) {
              this.id = id;
          }
      
          public String getName() {
              return name;
          }
      
          public void setName(String name) {
              this.name = name;
          }
      
          public String getPwd() {
              return pwd;
          }
      
          public void setPwd(String pwd) {
              this.pwd = pwd;
          }
      
          @Override
          public String toString() {
              return "User{" +
                      "id=" + id +
                      ", name='" + name + '\'' +
                      ", pwd='" + pwd + '\'' +
                      '}';
          }
      }
      
  • Dao接口转换为UserMapper接口:

    • public interface UserMapper {
          List<User> getUserList();
      }
      
  • 接口实现类由UserDapImpl转换为UserMapper.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">
      
      <!--绑定一个对应的Dao/Mapper接口-->
      <mapper namespace="com.yhr.dao.UserDao">
          <select id="getUserList" resultType="com.yhr.pojo.User">
              select * from mybatis.user;
          </select>
      </mapper>
      
  • UserMapper.xml在核心配置文件mybatis-config.xml中注册:

    • <mappers>
          <mapper resource="com/yhr/dao/UserMapper.xml"/>
      </mappers>
      
  • 注意,如果UserMapper.xml在java目录下,Maven的pom.xml中添加如下配置才能导出:

    • <build>
          <resources>
              <resource>
                  <directory>src/main/java</directory>
                  <includes>
                      <include>**/*.properties</include>
                      <include>**/*.xml</include>
                  </includes>
                  <filtering>false</filtering>
              </resource>
          </resources>
      </build>
      

测试

  • junit单元测试:

    • @Test
      public void test() {
          //获得SqlSession对象
          SqlSession sqlSession = MyBatisUtil.getSqlSession();
          //getMapper获取对象
          UserMapper mapper = sqlSession.getMapper(UserMapper.class);
          List<User> userList = mapper.getUserList();
          for (User user : userList) {
              System.out.println(user);
          }
          //关闭SqlSession
          sqlSession.close();
      }
      

注意点

  • 绑定接口时需要指定命名空间namespace
  • 命名解析需要使用全限定名
  • SqlSessionFactoryBuilder创建完SqlSessionFactory就不需要了,因此就在静态代码块中创建和销毁
  • SqlSessionFactory应该一直存在,且不要重复创建多次(单例模式),因此设置为静态变量
  • SqlSession线程不安全,每个线程都应该有自己的SqlSession实例,每次收到 HTTP 请求,就可以打开一个 SqlSession,返回一个响应后,就关闭
posted @ 2021-01-29 20:46  一天到晚睡觉的鱼  阅读(84)  评论(0)    收藏  举报