【MyBatis】MyBatis框架介绍


1、JDBC编程和存在问题

  • JDBC编程详解前面已经写过了这里就不细说了,详情请点击:JDBC编程
public class JDBCDemo {
    /**
     * 1、引入依赖驱动包
     *    mysql-connector-java
     * 2、加载驱动
     *    Class.forName("");
     * 3、连接数据库,获取Connection
     *    url:jdbc:mysql/ip+port(3306)/数据库名
     *    username:
     *    password:
     *   Connection connection = DriverManager.getConnetion();
     *
     * 4、获取Statement对象
     * Statement statement = connection.createStatement();
     *
     * 5、执行数据库的操作(CRUD)
     *   statement.executorQuery();
     *
     * 6、获取结果集:ResultSet
     *
     * 7、关闭资源
     * statement.close();
     * connection.close();
     */

    //第一步:导入jar包

    //第二步:说明JDBC驱动的名称和数据库的地址
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    static final String DB_URL = "jdbc:mysql://localhost:3306/test";

    //第三步:说明数据库的认证账户及密码
    static final String USER = "root";
    static final String PASS = "123456";

    public static void main(String[] args) {
        //第四步:加载数据库驱动.通常使用Class.forClass(String driverName);加载
        try {
            Class.forName(JDBC_DRIVER);
        } catch (ClassNotFoundException e) {
            //这里会发生类没有找到的异常!
            e.printStackTrace();
        }
        //第五步:获得数据库连接
        try {
            //获取连接
            Connection connection =  DriverManager.getConnection(DB_URL,USER,PASS);
            //第六步:执行查询语句
            Statement statement = connection.createStatement();
            String sql = "SELECT * FROM Student where  SID=1  ";
            ResultSet rs =statement.executeQuery(sql);

            while (rs.next())
            {
                String title = rs.getString("SID");
                String author = rs.getString("Sname");
                System.out.println(title+":"+author);
            }
            //第七步:关闭连接资源
            rs.close();
            statement.close();
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
            //这里会发生SQL异常,因为我们提供的的账户和密码不一定能连接成功
        }
    }

JDBC 存在的问题:
在这里插入图片描述
总结如下:

  • 1、数据库链接创建,释放频繁的操作造成系统的资源浪费,从而影响系统性能。
    • 解决方法: (复用链接),通过连接池来解决,mybatis也能够进行链接的复用。
  • 2、SQL语句在代码中硬编码,造成代码不易维护,实际的应用SQL变化是很大,SQL的改变时要引起java代码的改变
    • 解决方法:SQL和java代码分离,SQL语句防止在配置文件中(xml),需求改变仅需要改变配置文件即可 。
  • 3、对结果集的解析存在硬编码(查询列名),SQL改变导致解析代码也会发生改变,系统是不易维护
    • 解决方法:数据库中的数据映射成Java对象

2、MyBatis介绍

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

参考mybatis资料:MyBatis参考文档

3、MyBatis原理

在这里插入图片描述
Mybatis框架的特点

1、SQL语句与代码分离,存放于xml配置文件中。

  • 优点:解除SQL与程序代码的耦合,便于维护管理。
  • 缺点:降低了代码可读性,而且不利于调试。

2、查询的结果集与java对象自动映射。

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

3、需编写原生SQL。

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

4、MyBatis使用

(1)引入依赖

<dependency>    
  <groupId>mysql</groupId>    
  <artifactId>mysql-connector-java</artifactId>    
  <version>5.1.32</version>    
</dependency> 
<!--mybatis配置-->    
<dependency>    
     <groupId>org.mybatis</groupId>    
     <artifactId>mybatis</artifactId>    
     <version>3.4.1</version>    
</dependency>   

(2)全局配置文件(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/test"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    
    <!--引入映射文件-->
    <mappers>
        <mapper resource="mapper/Student23Mapper.xml"/>
    </mappers>

(3)PoJo类(Student23.java)

public class Student23 {
    private Integer SID;
    private String Sname;
    private String Ssex;
    private String Sage;

    //getter; setter ;to String
}

注意:Pojo类中的属性名和数据库中的类中的列名保持一一对应,可自动完成映射

(4)Mapper接口文件(Student23Mapper.java)

public interface Student23Mapper {
    
    //通过id查询学生信息
    public Student23 selectStudentByUid(Long  uid);
}

(5)Mapper.xml文件(Student23Mapper.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:命名空间,接口文件的全路径-->
<mapper namespace="com.tulun.inteface.Student23Mapper">
    <!-- 通过id查询学生信息-->
    <select id="selectStudentByUid" parameterType="long" resultType="com.tulun.pojo.Student23">
        select * from Student where SID = #{uid}
    </select>
</mapper>
  • #{ }:占位符,向占位符中输入参数时,可以自动完成Java类型和数据库类型的映射。

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

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

(6)添加日志

日志依赖jar包

<!--log4j日志文件-->  
<dependency>  
    <groupId>log4j</groupId>  
    <artifactId>log4j</artifactId>  
    <version>1.2.17</version>  
</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 

(7)查询操作

import com.tulun.inteface.Student23Mapper;
import com.tulun.pojo.Student23;
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 MybatisDemo {
    public static void main(String[] args) throws IOException {
        //获取全局配置文件
        String path = "mybatis-config.xml";
        //通过mybatis提供共的Resources类来获取配置文件流
        InputStream inputStream = Resources.getResourceAsStream(path);

        //获取SQLSessionFactory对象
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

        //获取会话工厂
        SqlSession sqlSession = sessionFactory.openSession();

        //通过反射机制来后去到mapper的实例
        Student23Mapper student23Mapper = sqlSession.getMapper(Student23Mapper.class);
        Student23 student23 = student23Mapper.selectStudentByUid(1L);

        System.out.println(student23);

        sqlSession.close();
    }
}

使用步骤总结:

  • 1、配置一个全局的配置文件数据源、引入映射文件)
  • 2、创建SQLSessionFactory对象(mybatis通过SqlSessionFactoryBuilder创建)
  • 3、通过会话工厂创建SQLSession会话
  • 4、通过SQLSession操作数据库
  • 5、管理会话SQLSession

(8)执行结果

目录结构:
在这里插入图片描述

结果:
在这里插入图片描述

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值