MyBtis(一)—— 初识MyBatis

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/QQ2899349953/article/details/97617037

mybatis基础知识

MyBatis是一个实现了数据持久化的开源框架,其实它就像netty之于NIO一样,Mybatis是JDBC的封装,所以:

JDBC的缺点:

  1. 需要频繁的进行数据库的建立、连接、断开操作,浪费资源,影响数据库性能;

    解决:连接池

  2. 将SQL语句直接编码在Java代码中,需求改变时,需要修改Java代码;

    解决:将SQL语句和代码分开,SQL语句放在配置文件中

  3. JDBC编程中返回结果集存在硬编码的问题

    解决:将结果集映射成Java对象

MyBatis的优点:

扫描二维码关注公众号,回复: 7198200 查看本文章
  1. 与JDBC相比,减少了50%以上的代码量。

  2. MyBatis是最简单的持久化框架,小巧并且简单易学。

  3. MyBatis相当灵活,不会对应用程序或者数据库的现有设计强加任何影响,SQL写在XML里,从程序代码中彻底分离,降低耦合度,便于统一管理和优化,并可重用。

  4. 提供XML标签,支持编写动态SQL语句。

  5. 提供映射标签,支持对象与数据库的ORM字段关系映射,可以把对象映射成表的元组、也可以把表中的元组映射成对象;

MyBatis框架的缺点:

  1. SQL语句的编写工作量较大,尤其是字段多、关联表多时,更是如此,对开发人员编写SQL语句的功底有一定要求。

  2. SQL语句依赖于数据库,导致数据库移植性差,不能随意更换数据库。

MyBatis和Hibernate的区别:

对于映射层而言,Hibernate的配置不需要接口和SQL,相反MyBatis是需要的,对于Hibernate而言,不需要编写大量的SQL,就可以完全映射,同时提供了日志、缓存、级联(级联比MyBatis强大)等特性,使用十分方便,但同时,Hibernate也存在巨大的缺陷;

MyBatis可以自由的书写SQL、支持动态SQL、处理列表、动态生成表名、支持存储过程,这样就可以灵活的定义查询语句,满足各类需求和性能优化的需要,这些再互联网系统中是十分重要的;

但MyBatis也有缺陷,他要编写SQL和映射规则,其工作量大于Hibernate,其次,它支持的工具也很有限,不能像Hibernate那样有许多的插件可以帮助生成映射代码和关联关系,而即使使用生成工具,往往也需要开发者进行进一步的简化,MyBatis通过手工编码,工作量相对大一些,所以对于性能要求不太苛刻的系统,使用Hibernate较好,对于性能要求高、响应快、灵活的系统则推荐使用MyBatis;

MyBatis与Hibernate相比主要的优势:

MyBatis不屏蔽SQL,这样开发者可以定制自己的SQL,无须自动生成(同时缺点就是工作量大,需要一定的学习成本),这样能够更精确的定义SQL,从而优化性能,符合移动互联网的高并发、大数据、高性能、高响应的要求;

MyBatis框架适用场合:

MyBatis专注于SQL本身,是一个足够灵活的DAO层解决方案。对性能的要求很高,或者需求变化较多的项目,如互联网项目,MyBatis将是不错的选择。

Mybatis入门级使用

1、导入mybatis依赖:

   <dependency>
         <groupId>org.mybatis</groupId>
         <artifactId>mybatis</artifactId>
         <version>3.4.5</version>
    </dependency>

2、还需要数据库的依赖:

   <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.39</version>
    </dependency>

3、上面介绍过,MyBatis能提供表元组和对象之间的映射,所以需要建立一张表,这里用Student:

create table Student(
    SID int(10) primary key,
    Sname varchar(20),
    Ssex varchar(10),
    Age int(10)
);

在这里插入图片描述
然后在这个表里面添加一些数据,以便后面用来测试,随便填写几个就可以了:
在这里插入图片描述

4、创建对应的Student对象:

/**
 * @ClassName Student
 * @Description
 * @Author lzq
 * @Date 2019/7/26 13:53
 * @Version 1.0
 **/
public class Student {
    private int SID;
    private String Sname;
    private String Ssex;
    private int Age;

    public int getSID() {
        return SID;
    }

    public void setSID(int SID) {
        this.SID = SID;
    }

    public String getSname() {
        return Sname;
    }

    public void setSname(String sname) {
        Sname = sname;
    }

    public String getSsex() {
        return Ssex;
    }

    public void setSsex(String ssex) {
        Ssex = ssex;
    }

    public int getSage() {
        return Age;
    }

    public void setSage(int sage) {
        Age = sage;
    }

    @Override
    public String toString() {
        return "[id"+SID+" 名字"+Sname+" 性别"+Ssex+" 年龄"+Age+"]";
    }
}

5、添加MyBatis全局配置文件config.xml(文件名可自定义,这里用的mybatis-config.xml)

注意使用自己的数据库名字、自己的root用户、密码:

<?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"/>
                <property name="username" value="root"/>
                <property name="password" value="123456"/>
            </dataSource>
        </environment>
    </environments>
    
</configuration>

注意,这个xml文件放在与Java文件同级的resources(名字可以自己起,但必须是配置文件,就是文件夹图标下面有4个黄色的横岗)文件下面:
在这里插入图片描述
6、MyBatis开发有两种方式:
使用配置或使用注解;

使用配置的话:
需要先创建自定义接口,但是不需要实现该接口,通过Mapper代理来实现:

如下,创建StudentMapper接口:

public interface StudentMapper {
    public Student getStudentById(int id);  //根据给定id查找并返回对象
}

创建StudentMapper.xml文件,也放在resources下面,如上图所示,文件内容如下:

<?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="tulun.dao.StudentMapper">
    <select id="getStudentById" parameterType="java.lang.Integer" resultType="tulun.bean.Student">
        select * from student where SID = #{SID}
    </select>
</mapper>

在这里插入图片描述
statement标签根据SQL执行的业务可选择insert,delete,update,select。

MyBatis会根据规则自动创建UserDAO接口实现类的代理对象。

规则如下:

  1. StudentMapper.xml 中 namespace 为接口的全类名。
  2. StudentMapper.xml中 statement 的 id 为接口中对应的方法名。
  3. StudentMapper.xml中 statement 的 parameterType和接口中对应方法的参数类型一致。
  4. StudentMapper.xml中 statement 的 resultType 和接口中对应方法的返回值类型一致。

现在需要在全局配置文件mybatis-config.xml中注册StudentMapper.xml:
也就是在上面的mybatis-config.xml里面添加下面这句:

    <mappers>
        <mapper resource="StudentMapper.xml"/>
    </mappers>

在这里插入图片描述
测试代码:

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 tulun.bean.Student;
import tulun.dao.StudentMapper;

import java.io.IOException;
import java.io.InputStream;

/**
 * @ClassName Test
 * @Description
 * @Author lzq
 * @Date 2019/7/26 13:53
 * @Version 1.0
 **/
public class Test {
    public static void main(String[] args) throws IOException {
        String resource = "mybatis-config.xml";
        //读取配置文件
        InputStream asStream = Resources.getResourceAsStream(resource);
        //创建sqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(asStream);
        //创建sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //通过动态代理产生StudentMapper对象
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);
        Student student = mapper.getStudentById(2);  //获取id为2的数据的对象
        System.out.println(student);
    }
}

运行结果:

[id2 名字jmj 性别nan 年龄20]

使用注解的话:
上面基本一样,只不过SQL语句不用写到StudentMapper.xml里面,在StudentMapper.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="tulun.dao.StudentMapper">
</mapper>

然后在StudentMapper里面这样写就好了:

public interface StudentMapper {
    @Select("select * from student where SID = #{id}")
    public Student getStudentById(int id);  //根据给定id查找并返回对象
}

注解后面跟的就是SQL语句,下面是对应的增删改查方法:

public interface StudentMapper {    
    @Select("select * from student where SID = #{id}")
    public Student getStudentById(int id);

    @Select("select * from student where Sname = #{name} and Age = #{age}")
    public Student getSnameAndSage(@Param("name") String name, @Param("age") int age);

    @Select("select * fom student")
    public Student[] getAllStudent();

    @Insert("insert into student (SID,Sname) values(#{SID},#{Sname})")
    public void addStudent(Student student);

    @Delete("delete from student where Sid = #{id}")
    public void delete(int id);

    @Update("update student set Sname = #{name} where id=#{id}")
    public void setValue(@Param("id") int id,@Param("name") String name);
}

注意:在参数比较多的时候,需要在接口参数类型前面添加@Param(参数名称),否者它就不知道哪个参数放在sql语句的哪个地方了,这样可以指定这个参数是给哪的

测试代码:

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 tulun.bean.Student;
import tulun.dao.StudentMapper;

import java.io.IOException;
import java.io.InputStream;

/**
 * @ClassName Test
 * @Description
 * @Author lzq
 * @Date 2019/7/26 13:53
 * @Version 1.0
 **/
public class Test {
    public static void main(String[] args) throws IOException {
        String resource = "mybatis-config.xml";
        //读取配置文件
        InputStream asStream = Resources.getResourceAsStream(resource);
        //创建sqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(asStream);
        //创建sqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //通过动态代理产生StudentMapper对象
        StudentMapper mapper = sqlSession.getMapper(StudentMapper.class);

        //查询id为2的元组
        Student student = mapper.getStudentById(2);
        System.out.println(student);

        //往数据库添加新的元组
        Student student1 = new Student();
        student1.setSID(4);
        student1.setSname("xxx");
        mapper.addStudent(student1);
        
        Student student2 = new Student();
        student1.setSID(9);
        student1.setSname("xxx");
        mapper.addStudent(student2);
        sqlSession.commit();
        sqlSession.commit();

        //返回列表所以元素
        Student[] students = mapper.getAllStudent();
        for (Student s : students) {
            System.out.println(s);
        }
    }
}

运行结果:

在这里插入代码片

猜你喜欢

转载自blog.csdn.net/QQ2899349953/article/details/97617037