mybatis总结(1)

ORM框架中Mbatis独占一席,因此在web开发中了解Mybatis很重要,所以在这里总结下Mybatis的使用

首先得理解何为ORM(Object  Relational Mapping)即对象关系映射,从名字中就了解到了重点:

  1. 对象:包含 Java对象和数据库对象
  2. 关系:java对象和数据库对象的关系
  3. 映射:通过映射的方式来确定java对象和数据库对象直接的关系(属于数学中的一对一映射)
之所以需要映射是因为编程语言的设计原理和数据库的设计原理的大相径庭,有了以上映射关系那么操作java对象和操作数据库对象就对应起来了,你去操作Java对象也就相当于操作了数据库对象,并且你去操作数据库对象也就相当于操作了Java对象。这样就使得面向于对象的java语言对数据库的操作更加便捷起来。

了解了以上概念则了解了ORM框架所要实现的目的,Java存在多态,ORM也存在多态,Mybatis只是其中的一种实现方法,它的优点为:

  1. 映射关系可以为动态
  2. 原生SQL语句,便于对SQL的优化,提高产品性能
  3. SQL语句与Java类的分离,便于维护
  4. 灵活、轻量的半自动ORM框架

为了从基础了解Mybatis,首先从Java项目中Mybatis的使用开始,这里为maven java工程

IDE:IntelIj idea

POM:

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>3.8.1</version>
      <scope>test</scope>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.4.4</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/log4j/log4j -->
    <dependency>
      <groupId>log4j</groupId>
      <artifactId>log4j</artifactId>
      <version>1.2.17</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>6.0.6</version>
    </dependency>
  </dependencies>

log4j.properties:

log4j.rootLogger = dubug , console
log4j.appender.console = org.apache.log4j.ConsoleAppender  
log4j.appender.console.Target = System.out  
log4j.appender.console.layout = org.apache.log4j.PatternLayout  
log4j.appender.console.layout.ConversionPattern =[%p]-[%c] %m%n 

以上为基本配置,分别为maven提供的jar包依赖、log4j日志系统


Mybatis项目的搭建,需要先了解Mybatis的核心组件
  1. SqlSessionFactoryBuilder:SqlSessionFactory的建造者,用于构造SqlSessionFactory(SqlSession的工厂接口)
  2. SqlSessionFactory:用于构造SqlSession
  3. SqlSession:用于直接发送SQL执行并返回结果语句或者获取Mapper接口来执行SQL语句并返回结果
  4. SQL Mapper:由一个Java接口和XML文件组成,用于发送SQL并返回结果
以上组件顺序基本上是一个SQL语句在Mybatis中执行的大概流程:
  1. SqlSessionFactory的创建:(完成自身信息维护)
    1. SqlSessionFactory是由SqlSessionFactoryBuilder创建:而SqlSessionFactoryBuilder内部维护了一个configuration对象,该对象保存Mybatis的配置信息,SqlSessionFactoryBuilder使用configuration对象来创建SqlSessionFactory接口
    2. SqlSessionFactory有2个实现类:DefaultSqlSessionFactory(使用中)和SqlSessionManager(尚未使用),通过DefaultSqlSessionFactory创建SqlSessionFactory实例
    3. 因此这里需要一个configuration对象,该对象是通过XML配置方式或者Java编码方式创建
  2. SqlSession的创建:
    1. 通过SqlSessionFactory实例创建SqlSession,这里SqlSession是一个接口,有2个实现类:DefaultSqlSession(使用中)和SqlSessionManager(尚未使用),通过DefaultSqlSession创建SqlSession实例
    2. 这里有默认实现,因此不需要任何额外操作
  3. SQL Mapper(映射器)的创建:(完成ORM中的R和M)
    1. 映射器由2部分组成:Java接口、XML文件(或者采用注解的方式将XML对应内容写在Java接口中,由于注解功能有限不推荐此方式)
    2. 映射器的2部分均由用户创建,因此这里需要创建Java接口和XML配置文件
  4. 结果集的封装(完成ORM中的O)
    1. 在对于select语句即数据库有返回的时候需要对结果集进行封装,将数据库对象转为Java对象
    2. 这个Java对象在这里有个专门的名称:POJO(Plain Ordinary Java Object)简单Java对象
    3. 这个对象需要用户创建:因此这里需要一个Java类
  5. 至此:一个对数据库的操作流程大致完成
通过以上分析:了解到Mybatis的搭建需要:

  1. configuration对象的配置:通过XML完成
  2. 映射器的配置:通过Java接口和XML完成
  3. 结果集的封装:通过Java类完成

这里将完成一个简单的示例:

数据库对象:

-- ----------------------------
-- Table structure for student
-- ----------------------------
DROP TABLE IF EXISTS `student`;
CREATE TABLE `student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(255) DEFAULT NULL,
  `source` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

1.configuration配置:MybatisConfig.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?serverTimezone=UTC" />
                <property name="username" value="root" />
                <property name="password" value="123456" />
            </dataSource>
        </environment>
    </environments>
<mappers>
<mapper resource="IStudentDao.xml"/>
</mappers>
</configuration>

2.映射器的配置:

1).Java接口

package sean.student.dao;

import sean.student.domain.StudentDomain;
import sean.student.entity.Student;

import java.util.List;

public interface IStudentDao {
      List<Student>  getStudentPageList(StudentDomain studentDomain);
}
2).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">
<mapper namespace="sean.student.dao.IStudentDao">
    <select id="getStudentPageList" parameterType="sean.student.domain.StudentDomain" resultType="sean.student.entity.Student">
        select id,name,source from student
    </select>
</mapper>
3.结果集封装:POJO对象

package sean.student.entity;

public class Student {
    private String name;
    private String id;
    private Integer source;

    public String getName() {
        return name;
    }

    public String getId() {
        return id;
    }

    public Integer getSource() {
        return source;
    }

    public void setName(String name) {
        this.name = name;
    }

    public void setId(String id) {
        this.id = id;
    }

    public void setSource(Integer source) {
        this.source = source;
    }
}
二次封装:

package sean.student.domain;

import sean.student.entity.Student;

public class StudentDomain {
    private Student student;

    public Student getStudent() {
        return student;
    }

    public void setStudent(Student student) {
        this.student = student;
    }
}

测试类:

package sean.student.dao;

import junit.framework.TestCase;
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 sean.student.domain.StudentDomain;
import sean.student.entity.Student;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

public class IStudentDaoTest extends TestCase {

   public void test() throws IOException {
       String resource= "mybatisConfig.xml";
       InputStream in= Resources.getResourceAsStream(resource);
       SqlSessionFactory factory= new SqlSessionFactoryBuilder().build(in);
       SqlSession sqlSession=factory.openSession();
       IStudentDao iStudentDao=sqlSession.getMapper(IStudentDao.class);
       List<Student> studentList=iStudentDao.getStudentPageList(new StudentDomain());
       for (int i = 0; i < studentList.size(); i++) {
           System.out.printf(studentList.get(i).getName()+"\n");
       }
   }
}
控制台:
[DEBUG]-[org.apache.ibatis.datasource.pooled.PooledDataSource] Created connection 1361289747.
[DEBUG]-[org.apache.ibatis.transaction.jdbc.JdbcTransaction] Setting autocommit to false on JDBC Connection [com.mysql.cj.jdbc.ConnectionImpl@5123a213]
[DEBUG]-[sean.student.dao.IStudentDao.getStudentPageList] ==>  Preparing: select id,name,source from student 
[DEBUG]-[sean.student.dao.IStudentDao.getStudentPageList] ==> Parameters: 
[DEBUG]-[sean.student.dao.IStudentDao.getStudentPageList] <==      Total: 3
Tom
John
Alice
至此:一个Mybatis的简单流程完成
下一节将对以上文件进行介绍,以及各文件存放位置的推荐












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值