【MyBatis框架】MyBatis框架介绍与基本使用操作

JDBC编程存在的问题

JDBC编程的完整步骤请参考:JDBC编程,这里以一个JDBC的实例类来说明:

import java.sql.*;

public class JDBC_Demo {
     
    public static void main(String[] args) throws Exception {
     
        Connection connection = null;
        Statement statement = null;
        ResultSet rs = null;
        try {
     
            //加载mysql驱动
            Class.forName("com.mysql.jdbc.Driver");
            //获取连接
            String DB_URL = "jdbc:mysql://localhost:3306/test";
            String USER = "root";
            String PASS = "123456";
            connection = DriverManager.getConnection(DB_URL, USER, PASS);
            //获取Statement
            statement = connection.createStatement();
            String sql = "SELECT * FROM Student where  SID=1  ";
            //执行查询操作
            rs = statement.executeQuery(sql);
            //处理结果集
            while (rs.next()) {
     
                String sid = rs.getString("SID");
                String sname = rs.getString("Sname");
                String ssex = rs.getString("Ssex");
                String sage = rs.getString("Sage");
                System.out.println(sid + ":" + sname + ":" + ssex + ":" + sage);
            }
        } finally {
     
            //关闭资源、释放连接
            if (rs != null)
                rs.close();
            if (statement != null)
                statement.close();
            if (connection != null)
                connection.close();
        }
    }
}

问题分析:

  • 1、在使用JDBC操作数据库前进行连接、操作完成之后关闭连接,造成系统资源浪费,从而影响系统性能,对并发性能有很大的影响。

    • 解决方法: 为了达到连接复用,采用连接池。
  • 2、SQL语句硬编码在Java代码中,需求改变需要改变Java代码本身。

    • 解决方法: 将SQL和Java代码解耦合,将SQL语句放在配置文件中(XML),需求改变只需要修改配置文件即可。
  • 3、使用 preparedStatement 向占有位符号传参数存在硬编码,因为 sql 语句的 where 条件不一定,可能多也可能少,修改 sql 还要修改代码,系统不易维护。

    • 解决方法: 将SQL语句中的占位符及其参数写在一个配置文件中,自动的完成参数的输入。(输入映射)
  • 4、对结果集解析存在硬编码(查询列名),sql 变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成 pojo 对象解析比较方便。

    • 解决方法: 查询的结果和Java对象可以自动完成映射。(输出映射)

主流的持久层框架

MyBatis属于SQL映射框架;而Hibernate属于ORM框架。

1、Hibernate框架

Hibernate是一个全自动ORM(Object Relation Mapping),旨在消除SQL。但这也是把双刃剑,直接造成了herbinate的优化成本高,因为其无法支持定制化SQL。

  • Hibernate由于过于强大,把过多的工作都进行了黑箱操作,当业务逻辑过于复杂时,很难支持定制化SQL就成了硬伤。

【MyBatis框架】MyBatis框架介绍与基本使用操作_第1张图片

2、MyBatis框架(主流)

MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

MyBatis封装了JDBC的很多细节,使开发者只需要关注sql语句本身,无需关注注册驱动,创建连接等繁杂过程。使用了ORM思想实现了结果集的封装。

MyBatis的原理

【MyBatis框架】MyBatis框架介绍与基本使用操作_第2张图片

Mybatis框架的特点
  • sql语句与代码分离,存放于xml配置文件中。

    • 优点:解除sql与程序代码的耦合,便于维护管理。
    • 缺点:降低了代码可读性,而且不利于调试。
  • 查询的结果集与java对象自动映射。

    • 优点:保证名称相同,配置好映射关系即可自动映射;不配置映射关系,通过配置列名=字段名也可完成自动映射。
    • 缺点:对开发人员所写的SQL依赖很强。
  • 需编写原生SQL。

    • 优点:接近JDBC,比较灵活。
    • 缺点:对SQL语句依赖程度很高,并且数据库移植比较麻烦。

【MyBatis框架】MyBatis框架介绍与基本使用操作_第3张图片

MyBatis的基本使用操作

通过实际业务来研究:通过SID查询学生信息。

这里是通过maven来管理MyBatis框架。

1、创建数据库及所操作的表

# 创建数据库
CREATE DATABASE test;

#创建表
CREATE TABLE `Student` (
  `SID` int(11) NOT NULL,
  `Sname` varchar(25) NOT NULL,
  `Ssex` varchar(4) DEFAULT NULL,
  `Sage` int(11) DEFAULT NULL,
  PRIMARY KEY (`SID`),
  UNIQUE KEY `SID` (`SID`),
  KEY `idx_name` (`Sname`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

#数据
mysql> select * from Student;
+-----+----------+------+------+
| SID | Sname    | Ssex | Sage |
+-----+----------+------+------+
|   1 | zhaol    | nan  |   21 |
|   2 | qiandian | nan  |   20 |
|   3 | sunfen   | nan  |   21 |
|   4 | wulan    | nv   |   18 |
|   5 | CJ1210   | 1    |   11 |
|   6 | LG1213   | NULL |    2 |
|   7 | CJ1210   | 1    | NULL |
|   8 | GY1803   | NULL | NULL |
+-----+----------+------+------+

2、引入依赖

<dependency>    
  <groupId>mysqlgroupId>    
  <artifactId>mysql-connector-javaartifactId>    
  <version>5.1.32version>    
dependency> 
    
<dependency>    
     <groupId>org.mybatisgroupId>    
     <artifactId>mybatisartifactId>    
     <version>3.4.1version>    
dependency>   

3、全局的配置文件(mybatis-config.xml)

这里主要修改驱动名和数据库名,数据库账号密码等。格式较为固定。

  • 将StudentMapper.xml文件路径配置上。



<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/test"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            dataSource>
        environment>
    environments>
    
    <mappers>
        <mapper resource="mapper/StudentMapper.xml"/>
    mappers>
configuration>
  • 相关配置信息可查看:MyBatis官网配置信息

4、POJO类(Student.java)

//数据库中Student表对应的映射Java对象类
public class Student {
     
   private Integer SID;
   private String Sname;
   private String Ssex;
   private Integer Sage;
  //省略getter和setter方法
}

5、Mapper接口文件(StudentMapper.java)

public interface StudentMapper {
     
    /**
     * 通过SID查询数据实体
     * @param sid
     * @return
     */
    public Student selectStudentByID(int sid);
}

6、配置Mapper.xml文件(StudentMapper.xml)


 

<mapper namespace="com.tulun.MybatisDemo.StudentMapper">
    
    <select id="selectStudentByID" resultType="com.tulun.MybatisDemo.Student">
        select * from Student where SID = #{sid}
    select>
mapper>
  • 相关配置信息可查看:MyBatis官网配置信息

  • #{ }:占位符,向占位符中输入参数时,可以自动完成Java类型和数据库类型的映射

  • ${ }:取值符将参数原封不动的取出来,与sql语句拼接。(缺点,不能防止sql注入)

  • 两种方式都可以获取JavaBean中的属性,都使用了OGNL表达式。

7、添加日志

  • 日志依赖jar包
  
<dependency>  
    <groupId>log4jgroupId>  
    <artifactId>log4jartifactId>  
    <version>1.2.17version>  
dependency>  
  • 日志配置文件
    • 创建log4j.properties文件
## debug 级别  
log4j.rootLogger=DEBUG,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=%d{yyyy-MM-dd-HH\:mm\:ss,SSS} [%t]  [%c] [%p] - %m%n  
log4j.logger.com.mybatis=DEBUG  /  

##输出sql 语句  
log4j.logger.java.sql.Connection=DEBUG  
log4j.logger.java.sql.Statement=DEBUG  
log4j.logger.java.sql.PreparedStatement=DEBUG 

8、执行查询操作

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.IOException;
import java.io.InputStream;

public class MybatisTLDemo {
     
    public static void main(String[] args) throws IOException {
     
        //mybatis配置文件
        String resource = "mybatis-config.xml";
        //通过mybatis提供的Resources类来得到配置文件流
        InputStream inputStream = Resources.getResourceAsStream(resource);
        //创建会话工厂,传输mybatis配置文件信息
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
        //通过工厂得到SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //通过反射机制来获取对应mapper实例
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        //调用mapper实例下方法
        Student student = mapper.selectStudentByID(1);
        System.out.println(student);
    }
}

9、执行结果

【MyBatis框架】MyBatis框架介绍与基本使用操作_第4张图片

  • 日志分析
日志信息 日志分析
Opening JDBC Connection 打开JDBC链接
Created connection 22660280 创建连接
Setting autocommit to false on JDBC Connection 事务自动提交失败
Preparing: select * from Student where SID = ? SQL语句

你可能感兴趣的:(#,MyBatis框架)