mybatis入门篇

人盡茶涼 提交于 2020-03-25 08:44:34

在之前写了mybatis是如何使用的,但是并没有对mybatis进行详细的解释,这里再补一篇

mybatis是什么?

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

mybatis框架结构图:

接口层:封装了基本的功能,可以直接使用

数据处理层:接口层会将参数、sql语句等传递到数据处理层,在数据处理层进行数据库操作,并返回结果集,返回的结果集经过关系映射,可以直接返回对象等。

基础支撑层:用来向数据处理层提供基本的功能,如数据库的连接对象创建,关闭,事务的创建,数据库的连接,缓存等

mybatis的配置文件详解(这里写的是mybatis最简单的搭建,更多详细属性请参考官方文档

在idea中,我们搭建框架是非常快的,使用mybatis需要创建配置文件,配置文件就是基础支撑层,是整个框架的基础,但是在idea中,没有mybatis的配置文件的模板,配置文件中的xml文件内容不容易记,因此我们先在idea中创建mybatis的配置文件的模板:

首先创建一个maven项目于,或者普通项目,导入mybatisjar包以及数据库连接包

<dependencies>
        <!--mybatisjar包-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.4.6</version>
        </dependency>
        <!--mysql连接包-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.45</version>
        </dependency>
        <!--oracle数据库连接包 ,需要连哪儿个数据库就连哪儿个jar包-->
        <!--<dependency>
            <groupId>com.oracle</groupId>
            <artifactId>ojdbc6</artifactId>
            <version>6</version>
        </dependency>-->
    </dependencies>

1.打开模板创建页面,编辑模板

2.创建模板内容并保存

 

点击ok后,我们就可以在新建文件里面直接创建了,配置文件的基本信息如下:

<?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>

</configuration>

 

创建配置文件,并配置mybatis的基本配置信息:

<?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>
    <!--创建配置文件后,就在配置文件中配置mybatis的环境-->
    <!--default:默认的环境,在environments标签中可以创建多个环境,一个数据库类型就是一个环境,通过id来区分不同的环境,
    default的值就是需要默认的数据库环境的id,这里默认使用mysql的环境-->
    <environments default="mysql">
        <!--配置一个mysql的环境,id是数据库的唯一标识,不可重复-->
        <environment id="mysql">
            <!--事务管理器,type:jdbc可以使用jdbc的事务,提交回滚等操作
            还可以使用type='MANAGED' 这个操作基本没做什么,它不提交或者回滚事务,它会让容器来管理事务的整个声明周期,如spring-->
            <transactionManager type="JDBC"></transactionManager>
            <!--配置数据源,type='POOLED' 意思是基于数据库连接池技术进行管理,在最开始我们使用jdbc连接时,就是一次创建一个连接对象,
            然后用完就关闭连接,释放资源,因此我们后来使用了连接池技术来创建连接,POOLED就是使用池技术来管理连接,如果不需要的话,
            就设置type="UNPOOLED" 这样就是使用一次创建一个连接,用完就关闭-->
            <dataSource type="POOLED">
                <!--property标签配置数据库的基本连接信息-->
                <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>
        <!--至此一个数据库环境就配置完了,当然也可以继续配置oracle的环境-->

        <!--配置oracle数据库的环境,当environments的default属性值为oracle时,就默认使用oracle数据库-->
        <environment id="oracle">
            <transactionManager type="JDBC"></transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="oracle.jdbc.OracleDriver"/>
                <property name="url" value="jdbc:oracle:thin:@localhost:1521:orcl"/>
                <property name="username" value="scott"/>
                <property name="password" value="tiger"/>
            </dataSource>
        </environment>
    </environments>
    
    <!--配置映射文件-->
    <mappers>
        
    </mappers>
</configuration>

然后连接数据库,测试上面的配置是否能够连接到数据库

public class TestCon {
    public static void main(String[] args) throws IOException {
        InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(in);
        SqlSession sqlSession= sqlSessionFactory.openSession();
        Connection connection = sqlSession.getConnection();
        System.out.println(connection);

    }
}

连接数据库成功后, 下面就要配置mapper文件,使用mybatis框架,mapper文件是不可少的,与之前创建mybatis-config配置文件的模板一样,我们也先给mapper文件创建一个模板,这样方便以后创建文件

模板的内容如下:

<!DOCTYPE mapper PUBLIC "-//mybatis.org// Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="">
</mapper>

关于mapper文件,首先创建数据库的表实体

package com.zs.entity;

public class Student {
    private int sid;
    private String sname;

    public Student() {
    }

    public Student(int sid, String sname) {
        this.sid = sid;
        this.sname = sname;
    }

    public int getSid() {
        return sid;
    }

    public void setSid(int sid) {
        this.sid = sid;
    }

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    @Override
    public String toString() {
        return "Student{" +
                "sid=" + sid +
                ", sname='" + sname + '\'' +
                '}';
    }
}
View Code

然后创建dao层接口

public interface IStudentDAO {
    
    List<Student> listStudents();
    
    int insertStudent(Student student);

    int updateStudent(Student student);

    int deleteStudent(int sid);
}

 创建mapper文件,实现dao层接口的方法

<!DOCTYPE mapper PUBLIC "-//mybatis.org// Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!--namespace属性,表示该mapper文件是实现了哪儿个接口的方法,与接口是相对应的-->
<mapper namespace="com.zs.dao.IStudentDAO">

    <!--每一个标签的id都对应一个dao层接口的方法名,方法名与id名要一致,且一一对应-->

    <!--select标签,表示是查询语句,resultType表示返回值类型,因为在接口中返回的是一个学生的集合,因此写学生的类,
    resultType是通过反射返回结果集的,还可以是基本数据类型Integer等,还可以有parameterType属性,设置参数的类型,下面会用到-->
    <select id="listStudents" resultType="com.zs.entity.Student">
        select * from student;
    </select>

    <!--参数类型可以是很多种,可以是Integer等,还可以是map,还可以是对象,因为在dao接口中参数是学生对象,
    因此这里的参数类型写student,在传参时#{sname} #{}内的值为参数对象的属性,学生对象有两个属性,sid,sname,传参就写#{sid},#{sname} -->
    <insert id="insertStudent" parameterType="com.zs.entity.Student">
        insert into student(sname) value(#{sname})
    </insert>

    <update id="updateStudent" parameterType="com.zs.entity.Student">
        update student set sname=#{sname} where sid=#{sid}
    </update>

    <delete id="deleteStudent" parameterType="Integer">
        delete from student where sid=#{sid}
    </delete>
</mapper>

注意要在mybatis-config中配置mapper文件:

然后运行测试:

import com.zs.dao.IStudentDAO;
import com.zs.entity.Student;
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;
import java.util.List;


public class TestCon {
    public static void main(String[] args) throws IOException {
        InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
        SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(in);
        SqlSession sqlSession= sqlSessionFactory.openSession();
        IStudentDAO mapper = sqlSession.getMapper(IStudentDAO.class);

        int i = mapper.insertStudent(new Student(1, "zhangsan"));
//        执行增删改操作后要提交事务
        sqlSession.commit();
        List<Student> students = mapper.listStudents();
        System.out.println(students);

        int lisi = mapper.updateStudent(new Student(1, "lisi"));
        int i1 = mapper.deleteStudent(3);
        sqlSession.commit();
        List<Student> students1 = mapper.listStudents();
        System.out.println(students1);
        sqlSession.close();

    }
}

运行后查看各个方法是否运行成功

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!