我的第一个MyBatis程序

什么是MyBatis

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

什么叫持久层,简单的来说,我们访问一个平台就会产生一定的数据,比如浏览记录等,这些数据在服务器断电的时候或者重启之后就会消失,所谓的持久就是指将数据存放在数据库中,方便后续使用。所以说MyBatis是一款持久层框架就是说它是工作在DAO层的,和数据库打交道,MyBatis封装了jdbc,使我们更方便更高效操作数据库。

什么是POJO,POJO就是一些特殊的 类 的名称,只不过这种 类 除了 get 和set 方法就没有其他的方法了。

 

创建第一个MyBatis程序

我们需要两个依赖架包,一个是MyBatis架包,一个是jdbc

我的第一个MyBatis程序

MyBatis的架包在GitHub上有。

如:https://github.com/mybatis/mybatis-3/releases

jdbc的架包在Mysql官网

如:https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-installing-source.html

 

步骤

1,创建一个数据库为“test” ,然后创建一个数据表“Student”,自己添加几条数据。

我的第一个MyBatis程序

2,创建一个POJO类,取名Student。

项目结构如图所示:

我的第一个MyBatis程序

Student类:

public class Student {
    private int id;
    private String name;
    private int age;

    public Student(){ }

    public Student(int id, String name, int age){
        this.id = id;
        this.name = name;
        this.age = age;
    }

    public int getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "Student{ id="+id+", name='"+name+"', age="+age+"}";
    }
}

3,创建一个映射文件,用于映射Student类,取名为:StudentMapper.xml

MyBatis中,映射文件的取名一般约定为 xxxMapper.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="com.entity.StudentMapper">
<!--namespace 填写映射文件的类路径-->
    
    <!--id 名称 resultType 结果集类型 parameterType 输入类型-->
    <select id="selectStudent" resultType="com.entity.Student" parameterType="int">
       select * from Student where id = #{id}
    </select>

</mapper>

相应的意思已经标注

其中,#{id},表示一个变量占位符,parameterType即为#{id}的类型。

4,创建配置文件 conf.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="root"/>
            </dataSource>
        
        </environment>
    </environments>

    <mappers>
        <!--加载映射问价,填写映射文件路径-->
        <mapper resource="com/entity/StudentMapper.xml"/>
    </mappers>

</configuration>

其中:

<transactionManager type="JDBC"/>表示事务的提交方式

JDBC 表示利用JDBC 的方式处理事务,比如:commit,rollback,close

MANAGED 将事务交由其他组件去托管,比如:spring,jobss 。MANAGED 默认会关闭连接,即当一次sql语句执行完毕之后将关闭连接。 也可以选择不关闭,在后面加上 <peoperty name="closeConnection" value="false" /> 即可。

<dataSource type="POOLED">表示数据源类型

UNPOOLED 传统的jdbc模式,每次访问数据库,均需要打开,关闭等数据库操作,比较消耗性能。

POOLED 使用数据库连接池 。不严谨的说,数据库连接池就是数据库。

JNDI 从tomcat中获取一个内置的数据库连接池。

 

<environments default="development"> default 表明我们需要使用哪个数据库环境,即我们使用名叫development的数据库环境,是我们的本地环境。

<environment id="development">  environment标签用于设置不用的数据库环境,id名称是给不同的数据库取不同的名称。

也就是说我们可以在conf.xml文件中配置很多<environment>标签,可以有用于测试的数据库,用于开发的数据库,用于正式运行的数据库等。MyBatis如何知道我们到底要使用哪个数据库呢? 即通过 default="xxxxx"指定

 

5,创建一个测试类 MyBatisTest

首先,只有SqlSession才能访问数据库,所以我们得要有SqlSession。SqlSession可以用SqlSessionFactory来创建。

因此:

5.1,将我们配置的conf.xml导入数据流中。

5.2,实例化一个SqlSessionFactory对象。

5.3,用SqlSessionFactory对象实例化一个SqlSession对象。

5.4,通过SqlSession对象的selectOne()方法,访问数据库。

SqlSession对象的很多方法的可以通过IDEA的提示看得到

我的第一个MyBatis程序

selectOne() 有两个参数

第一个参数 statement 是映射文件的路径加上sql语句的id 这样即可唯一识别一个sql语句。

第二个参数是传入#{id}的值。

selectOne的返回类型也有说明,在它的映射文件StudentMapper.xml中,resultType即指明了返回值的类型。


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.Reader;

public class TestMyBatis {
    public static void main(String[] args) throws IOException {
        //加载MyBatis配置文件,访问数据库
        Reader reader = Resources.getResourceAsReader("conf.xml");
        //SqlSessionFactory - connection
        //可以通过build的第二个值强行修改数据库环境
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
        //session - connection
        SqlSession session = sessionFactory.openSession();
        String statement = "com.entity.StudentMapper.selectStudent";
        Student student = session.selectOne(statement,2);

        System.out.println(student);
        session.close();

    }
}

运行结果如下:

我的第一个MyBatis程序

至此第一个MyBatis项目完成。