MyBatis小记

为什么要用Mybatis?

jdbc缺点:

缺点一:重复代码太多,这样会让开发效率降低。(比较繁琐,有一些代码是“没有必要的重复”)

缺点二:JDBC开发当中sql语句是编写在java程序当中的,sql语句不支持配置。sql语句
可能后期需要调优,sql语句被修改的概率还是很高的。在java程序中编写sql语句,后期修改
sql语句的时候,需要重新修改java源代码,源代码的修改会导致重新编译/重新部署等操作。
并且修改java源代码已经违背了开闭原则:OCP。
互联网分布式架构方面的项目,并发量很大,系统需要不断的优化,各方面优化,其中有一条
非常重要的优化就是sql优化。

一. 我的第一个Mybatis程序:

1.准备数据库

新建一个数据库:

create database mybatis;

新建一张表:

create table student(id varchar(30),name varchar(30),birth varchar(30));

插入数据:

insert into student(id,name,birth) values('1' , 'zhangsan' , '20211010');
        insert into student(id,name,birth) values('2' , 'lisi' , '20211011');
        insert into student(id,name,birth) values('3' , 'wangwu' , '20211012');
        commit;
        select * from student;

2.新建一个普通的java工程

因为mybatis框架封装了JDBC。写一个main方法即可测试。

  • 新建工程mybatis-project-laodu
  • 在src同级目录下新建libs目录,把jar包引入到此目录
  • 新建xml文件

    • 新建mybatis-config.xml
    • 新建sqlMapper.xml
  • 在src目录下新建com/codeanime/main文件夹
  • 在src目录下新建com/codeanime/test文件夹

image-20211010215749996

3.引入相关的jar包

mybatis-3.4.5.jar(mybatis核心jar)

mysql-connector-java-5.1.23-bin.jar(mysql数据库驱动jar)

image-20211010214929700

4.从xml中构建SqlSessionFactory

4.1 编写main方法

String resource = "org/mybatis/example/mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

注意:

什么是类路径?

bin是类的根路径, src可以等同看做类的根路径

修改main方法代码:

String resource = "mybatis-config.xml";

编辑mybatis-config.xml:核心配置文件主要配置连接数据库的信息,以及“sql语句配置文件”的路径。

<?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" />
                <property name="username" value="root" />
                <property name="password" value="123456" />
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="org/mybatis/example/BlogMapper.xml" />
    </mappers>
</configuration>

5.编写SqlMapper.xml

提供一个配置sql语句的配置文件,通常这种文件一般都叫做:sql映射文件(SqlMapper.xml)

在类的根路径下新建一个SqlMapper.xml文件,修改mybatis-config.xml配置:
<mappers>
            <mapper resource="SqlMapper.xml" />
        </mappers>

编辑SqlMapper.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">

<!-- 先不要管 namespace,随意编写一个。-->
<mapper namespace="1111111111">

    <!-- 查询语句,查询所有的学生 -->
    <!-- id具有唯一性,代表了这条sql语句,将来这个id是需要“拷贝”到java程序当中的。 -->
    <!-- 思考:我们程序员需要告诉mybatis框架什么信息,mybatis才能自动创建对象,并且自动将查询的结果集放到java对象的对应属性上。 -->
    <!-- 需要告诉mybatis,最终封装的java对象的类型。 -->
    <!-- 需要告诉mybatis,最终查询出的结果集赋值到javabean的哪个属性上面,怎么告诉mybatis呢?
    查询结果集的列名要和javabean的属性名对应上,不对应的时候使用as关键字起别名。-->
    <select id="getAll" resultType="com.codeanime.mybatis.main.Student">
        select
        id as sid, name as sname , birth as sbirth
        from
        student
    </select>

</mapper>

6.在main文件夹新建Student类作为javabean

package com.codeanime.mybatis.main;

public class Student {
    /*
     *注意:以下的属性名和数据库表当中的字段名不一致。
     */
    private String sid;
    private String sname;
    private String sbirth;

    public String getSid() {
        return sid;
    }

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

    public String getSname() {
        return sname;
    }

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

    public String getSbirth() {
        return sbirth;
    }

    public void setSbirth(String sbirth) {
        this.sbirth = sbirth;
    }

}

7.在test目录下新建MybatisTest01作为测试类

package com.codeanime.mybatis.test;

import java.io.IOException;
import java.io.InputStream;
import java.util.List;

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 com.codeanime.mybatis.main.Student;

public class MyBatisTest01 {

    public static void main(String[] args) {
        SqlSession sqlSession = null;
        try {
            String resource = "mybatis-config.xml";
            InputStream inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            // 事务自动提交机制关闭,等同于:conn.setAutoCommit(false);
            // SqlSession对象等同看做Connection,专门用来执行sql语句的一个会话对象。
            // 开启事务
            sqlSession = sqlSessionFactory.openSession();

            // do work(执行核心业务逻辑)
            // 获取所有的学生,返回List集合,List集合中存储Student。
            List<Student> studentList = sqlSession.selectList("getAll");
            for(Student s : studentList){
                System.out.println(s.getSid() + "," + s.getSname() + "," + s.getSbirth());
            }

            // 没有出现异常,则事务结束,提交
            sqlSession.commit();
        } catch (IOException e) {
            // 遇到异常之后回滚
            if (sqlSession != null){
                sqlSession.rollback();
            }
            e.printStackTrace();
        } finally {
            // 关闭资源
            if(sqlSession != null){
                sqlSession.close();
            }
        }
    }

}

运行test程序:

image-20211010220802753

和数据库中一样:

image-20211010220832789

二. 使用mybatis完成单张表的CRUD

CRUD:增删改查

2.1 优化用户体验

在类的根路径下,新建一个jdbc.properties文件。配置连接数据库的信息

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis
jdbc.user=root
jdbc.password=123456

然后在核心配置文件引入该资源文件。

<properties resource="jdbc.properties"/>

使用:<property name="driver" value="${jdbc.driver}" />语法。

    注意:${jdbc.driver}这个不是EL表达式,是mybatis中自定制的语法机制。
    ${属性文件中的key}

完整配置文件:

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

    <!-- 引入外部独立的资源文件 -->
    <properties resource="jdbc.properties"/>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}" />
                <property name="url" value="${jdbc.url}" />
                <property name="username" value="${jdbc.user}" />
                <property name="password" value="${jdbc.password}" />
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="SqlMapper2.xml" />
    </mappers>
</configuration>

编辑SqlMapper2配置文件:

<?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="111111111111111111111111">
    <insert id="save" parameterType="com.codeanime.mybatis.main.Student">
        insert into student
        (id , name , birth)
        values
        (#{stuId} , #{stuName} , #{stuBirth})
    </insert>
</mapper>

插入数据:

编写类MyBtisCRUD:

package com.codeanime.mybatis.test;

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 com.codeanime.mybatis.main.Student;

/**
 * 使用mybatis完成学生信息的增删改查(查一个/查所有)
 */
public class MyBatisCRUD {

    public static void main(String[] args) {
        SqlSession sqlSession = null;
        try {
            /*
             * String resource = "mybatis-config.xml"; InputStream inputStream =
             * Resources.getResourceAsStream(resource); SqlSessionFactory
             * factory = new SqlSessionFactoryBuilder().build(inputStream);
             */
            SqlSessionFactory factory = new SqlSessionFactoryBuilder()
                    .build(Resources.getResourceAsStream("mybatis-config.xml"));
            // 开启事务
            sqlSession = factory.openSession();
            // do work
            // insert
            Student stu = new Student();
            stu.setStuId("123");
            stu.setStuName("zhangsan2");
            stu.setStuBirth("20211011");
            int count = sqlSession.insert("save", stu); // 返回值是影响数据库表当中的记录条数。
            System.out.println(count);

            // 提交事务
            sqlSession.commit();
        } catch (Exception e) {
            // 回滚事务
            if (sqlSession != null) {
                sqlSession.rollback();
            }
            e.printStackTrace();
        } finally {
            // 释放资源
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }

}

运行结果:

image-20211011083533443

运行成功返回影响行号

查看数据表:

image-20211011083713178

数据表多了一条数据.表示插入成功

修改数据:

在类MyBtisCRUD中添加代码

// update

            Student stu = new Student();
            stu.setStuId("123");
            stu.setStuName("zhangsan3");
            stu.setStuBirth("20211012");
            int count = sqlSession.update("update", stu);
            System.out.println(count);

MyBatis完整的代码:

package com.codeanime.mybatis.test;

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 com.codeanime.mybatis.main.Student;

/**
 * 使用mybatis完成学生信息的增删改查(查一个/查所有)
 */
public class MyBatisCRUD {

    public static void main(String[] args) {
        SqlSession sqlSession = null;
        try {
            /*
             * String resource = "mybatis-config.xml"; InputStream inputStream =
             * Resources.getResourceAsStream(resource); SqlSessionFactory
             * factory = new SqlSessionFactoryBuilder().build(inputStream);
             */
            SqlSessionFactory factory = new SqlSessionFactoryBuilder()
                    .build(Resources.getResourceAsStream("mybatis-config.xml"));
            // 开启事务
            sqlSession = factory.openSession();
            // do work
            // insert
            //Student stu = new Student();
            //stu.setStuId("123");
            //stu.setStuName("zhangsan2");
            //stu.setStuBirth("20211011");
            //int count = sqlSession.insert("save", stu); // 返回值是影响数据库表当中的记录条数。
            //System.out.println(count);

            // update

            Student stu = new Student();
            stu.setStuId("123");
            stu.setStuName("zhangsan3");
            stu.setStuBirth("20211012");
            int count = sqlSession.update("update", stu);
            System.out.println(count);

            // 提交事务
            sqlSession.commit();
        } catch (Exception e) {
            // 回滚事务
            if (sqlSession != null) {
                sqlSession.rollback();
            }
            e.printStackTrace();
        } finally {
            // 释放资源
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }

}

SqlMapper2.xml中添加代码:

<update id="update" parameterType="Student" >
        update student set
        name = #{stuName} , birth = #{stuBirth}
        where
        id = #{stuId}
    </update>

SqlMapper2.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="111111111111111111111111">
    <insert id="save" parameterType="com.codeanime.mybatis.main.Student">
        insert into student
        (id , name , birth)
        values
        (#{stuId} , #{stuName} , #{stuBirth})
    </insert>
    <update id="update" parameterType="com.codeanime.mybatis.main.Student" >
        update student set
        name = #{stuName} , birth = #{stuBirth}
        where
        id = #{stuId}
    </update>
</mapper>

运行代码:

image-20211011090015738

查看数据库:

image-20211011090107325

发现数据库数据已经改变.表示修改成功

查询一条数据:

在MyBtisCRUD类中填加代码:

            Student stu = sqlSession.selectOne("getById", "123");
            System.out.println(stu.getStuId());
            System.out.println(stu.getStuName());
            System.out.println(stu.getStuBirth());

完整代码:

package com.codeanime.mybatis.test;

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 com.codeanime.mybatis.main.Student;

/**
 * 使用mybatis完成学生信息的增删改查(查一个/查所有)
 */
public class MyBatisCRUD {

    public static void main(String[] args) {
        SqlSession sqlSession = null;
        try {
            /*
             * String resource = "mybatis-config.xml"; InputStream inputStream =
             * Resources.getResourceAsStream(resource); SqlSessionFactory
             * factory = new SqlSessionFactoryBuilder().build(inputStream);
             */
            SqlSessionFactory factory = new SqlSessionFactoryBuilder()
                    .build(Resources.getResourceAsStream("mybatis-config.xml"));
            // 开启事务
            sqlSession = factory.openSession();
            // do work
            // insert
            //Student stu = new Student();
            //stu.setStuId("123");
            //stu.setStuName("zhangsan2");
            //stu.setStuBirth("20211011");
            //int count = sqlSession.insert("save", stu); // 返回值是影响数据库表当中的记录条数。
            //System.out.println(count);

            // update
            /*
            Student stu = new Student();
            stu.setStuId("123");
            stu.setStuName("zhangsan3");
            stu.setStuBirth("20211012");
            int count = sqlSession.update("update", stu);
            System.out.println(count);
            */

            // selectOne

            Student stu = sqlSession.selectOne("getById", "123");
            System.out.println(stu.getStuId());
            System.out.println(stu.getStuName());
            System.out.println(stu.getStuBirth());

            // 提交事务
            sqlSession.commit();
        } catch (Exception e) {
            // 回滚事务
            if (sqlSession != null) {
                sqlSession.rollback();
            }
            e.printStackTrace();
        } finally {
            // 释放资源
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }

}

SqlMapper2.xml添加代码:

    <!-- parameterType是参数类型,专门负责给sql语句传值 但是可以省略不写 -->
    <!-- resultType是查询结果集的类型,只有在select语句中才会有  -->
    <!--
      parameterType = "简单类型",则parameter可以省略
      resultType = "简单类型",不能省略.
      什么是简单类型:17个
      byte short int     long float double boolean char
      Byte Short Integer Long Float Double Boolean Character String
      -->
    <select id="getById" parameterType="java.lang.String" resultType="com.codeanime.mybatis.main.Student">
        select
        id as stuId, name as stuName, birth as stuBirth<!-- 列名和javabean的属性名必须一致,不一致,使用别名
        ,因为Student类的属性名和数据库中student表的属性名不一致-->
        from
        student
        where
        id = #{11111111111}
    <!-- 当一个sql语句的占位符只有一个,这个时候#{这里的内容随意编写} -->
    </select>

运行代码:

image-20211011095038657

对比数据库:

image-20211011095057221

查询所有:

在MyBtisCRUD类中填加代码:

            List<Student> stuList = sqlSession.selectList("getAll");
            for(Student s : stuList){
                System.out.println(s.getStuId());
            }

SqlMapper2.xml添加代码:

    <select id="getAll" resultType="com.codeanime.mybatis.main.Student">
        select
        id as stuId, name as stuName, birth as stuBirth
        from
        student
    </select>

运行代码:

image-20211011095805305

对比数据库:

image-20211011095830920

删除数据:

在MyBtisCRUD类中填加代码:

            int count = sqlSession.delete("deleteById", "123");
            System.out.println(count);

SqlMapper2.xml添加代码:

    <delete id="deleteById">
        delete from student where id = #{22222222222}
    </delete>

运行代码:

image-20211011100038198

对比数据库:

image-20211011100109682

发现数据库中id为123的数据被删除.

附上完整代码:

MyBtisCRUD

package com.codeanime.mybatis.test;

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 com.codeanime.mybatis.main.Student;

import java.util.List;

/**
 * 使用mybatis完成学生信息的增删改查(查一个/查所有)
 */
public class MyBatisCRUD {

    public static void main(String[] args) {
        SqlSession sqlSession = null;
        try {
            /*
             * String resource = "mybatis-config.xml"; InputStream inputStream =
             * Resources.getResourceAsStream(resource); SqlSessionFactory
             * factory = new SqlSessionFactoryBuilder().build(inputStream);
             */
            SqlSessionFactory factory = new SqlSessionFactoryBuilder()
                    .build(Resources.getResourceAsStream("mybatis-config.xml"));
            // 开启事务
            sqlSession = factory.openSession();
            // do work
            // insert
            //Student stu = new Student();
            //stu.setStuId("123");
            //stu.setStuName("zhangsan2");
            //stu.setStuBirth("20211011");
            //int count = sqlSession.insert("save", stu); // 返回值是影响数据库表当中的记录条数。
            //System.out.println(count);

            // update
            /*
            Student stu = new Student();
            stu.setStuId("123");
            stu.setStuName("zhangsan3");
            stu.setStuBirth("20211012");
            int count = sqlSession.update("update", stu);
            System.out.println(count);
            */

            // selectOne

            //Student stu = sqlSession.selectOne("getById", "123");
            //System.out.println(stu.getStuId());
            //System.out.println(stu.getStuName());
            //System.out.println(stu.getStuBirth());


            // selectList

            //List<Student> stuList = sqlSession.selectList("getAll");
            //for(Student s : stuList){
            //    System.out.println(s.getStuId());
            //}

            // delete

            int count = sqlSession.delete("deleteById", "123");
            System.out.println(count);


            // 提交事务
            sqlSession.commit();
        } catch (Exception e) {
            // 回滚事务
            if (sqlSession != null) {
                sqlSession.rollback();
            }
            e.printStackTrace();
        } finally {
            // 释放资源
            if (sqlSession != null) {
                sqlSession.close();
            }
        }
    }

}

Student类:

package com.codeanime.mybatis.main;

public class Student {
    private String stuId;
    private String stuName;
    private String stuBirth;

    public String getStuId() {
        return stuId;
    }

    public void setStuId(String stuId) {
        this.stuId = stuId;
    }

    public String getStuName() {
        return stuName;
    }

    public void setStuName(String stuName) {
        this.stuName = stuName;
    }

    public String getStuBirth() {
        return stuBirth;
    }

    public void setStuBirth(String stuBirth) {
        this.stuBirth = stuBirth;
    }

}

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>

    <!-- 引入外部独立的资源文件 -->
    <properties resource="jdbc.properties"/>

    <!-- mybatis的别名机制 -->
    <!--
    <typeAliases>
        <typeAlias type="com.codeanime.mybatis.main.Student" alias="Student"/>
    </typeAliases>
     -->
    <typeAliases>
        <!-- 使用package方式,那么该package包下的所有javabean会自动使用简类名作为别名。 -->
        <package name="com.codeanime.mybatis.main"/>
    </typeAliases>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC" />
            <dataSource type="POOLED">
                <property name="driver" value="${jdbc.driver}" />
                <property name="url" value="${jdbc.url}" />
                <property name="username" value="${jdbc.user}" />
                <property name="password" value="${jdbc.password}" />
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="SqlMapper2.xml" />
    </mappers>
</configuration>

SqlMapper2.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="111111111111111111111111">
    <insert id="save" parameterType="com.codeanime.mybatis.main.Student">
        insert into student
        (id , name , birth)
        values
        (#{stuId} , #{stuName} , #{stuBirth})
    </insert>
    <update id="update" parameterType="com.codeanime.mybatis.main.Student" >
        update student set
        name = #{stuName} , birth = #{stuBirth}
        where
        id = #{stuId}
    </update>
    <!-- parameterType是参数类型,专门负责给sql语句传值 但是可以省略不写 -->
    <!-- resultType是查询结果集的类型,只有在select语句中才会有  -->
    <!--
      parameterType = "简单类型",则parameter可以省略
      resultType = "简单类型",不能省略.
      什么是简单类型:17个
      byte short int     long float double boolean char
      Byte Short Integer Long Float Double Boolean Character String
      -->
    <select id="getById" parameterType="java.lang.String" resultType="com.codeanime.mybatis.main.Student">
        select
        id as stuId, name as stuName, birth as stuBirth<!-- 列名和javabean的属性名必须一致,不一致,使用别名
        ,因为Student类的属性名和数据库中student表的属性名不一致-->
        from
        student
        where
        id = #{11111111111}
    <!-- 当一个sql语句的占位符只有一个,这个时候#{这里的内容随意编写} -->
    </select>
    <select id="getAll" resultType="com.codeanime.mybatis.main.Student">
        select
        id as stuId, name as stuName, birth as stuBirth
        from
        student
    </select>
    <delete id="deleteById">
        delete from student where id = #{22222222222}
    </delete>
</mapper>

三. 别名机制

mybatis-config.xml里添加:

    <!-- mybatis的别名机制 -->
    <!--
    <typeAliases>
        <typeAlias type="com.codeanime.mybatis.main.Student" alias="Student"/>
    </typeAliases>
     -->
    <typeAliases>
        <!-- 使用package方式,那么该package包下的所有javabean会自动使用简类名作为别名。 -->
        <package name="com.codeanime.mybatis.main"/>
    </typeAliases>

然后SqlMapper2.xml中所有的parameterType可以写成包中的类名(默认)

<?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="111111111111111111111111">
    <insert id="save" parameterType="Student">
        insert into student
        (id , name , birth)
        values
        (#{stuId} , #{stuName} , #{stuBirth})
    </insert>
    <update id="update" parameterType="Student" >
        update student set
        name = #{stuName} , birth = #{stuBirth}
        where
        id = #{stuId}
    </update>
    <!-- parameterType是参数类型,专门负责给sql语句传值 但是可以省略不写 -->
    <!-- resultType是查询结果集的类型,只有在select语句中才会有  -->
    <!--
      parameterType = "简单类型",则parameter可以省略
      resultType = "简单类型",不能省略.
      什么是简单类型:17个
      byte short int     long float double boolean char
      Byte Short Integer Long Float Double Boolean Character String
      -->
    <select id="getById" parameterType="java.lang.String" resultType="Student">
        select
        id as stuId, name as stuName, birth as stuBirth<!-- 列名和javabean的属性名必须一致,不一致,使用别名
        ,因为Student类的属性名和数据库中student表的属性名不一致-->
        from
        student
        where
        id = #{11111111111}
    <!-- 当一个sql语句的占位符只有一个,这个时候#{这里的内容随意编写} -->
    </select>
    <select id="getAll" resultType="Student">
        select
        id as stuId, name as stuName, birth as stuBirth
        from
        student
    </select>
    <delete id="deleteById">
        delete from student where id = #{22222222222}
    </delete>
</mapper>

四.使用maven模块创建mybatis项目

  1. 创建student表(id,name,email,age)

    -- 创建student表
    create table student(
        id int(11) not null primary key,
        name varchar(50) default null,
        email varchar(50) default null,
        age int(11) default null
        );
    -- 插入一条数据
    insert into student (id,name,email,age) values(1001,"zhangsan","zhangsan@163.com",11);
  2. 新建一个空项目
  3. 新建maven模块

image-20211011114825349

创建完成之后是这样子的:

image-20211011115025524

然后, 在main目录下新建文件夹resources, 删除默认创建的App类和App测试类AppTest

处理之后结构是这样的:

image-20211011115453043

整理pom.xml文件:

整理后的文件内容:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <!--坐标-->
  <groupId>com.codeanime</groupId>
  <artifactId>project01</artifactId>
  <version>1.0-SNAPSHOT</version>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>
  <!--依赖列表-->
  <dependencies>
    <!--单元测试-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
  </dependencies>

  <build>

  </build>
</project>
  1. 修改pom.xml文件

(1)加入mybatis依赖, mysql驱动,junit

  <!--依赖列表-->
  <dependencies>
    <!--单元测试-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <!-- mybatis依赖 -->
    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.2</version>
    </dependency>
    <!-- mysql驱动 -->
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.46</version>
    </dependency>
  </dependencies>

(2)在<build>中加入资源插件

  <build>
    <!--资源插件 处理src/main/java目录下的xml-->
    <resources>
      <resource>
        <directory>src/main/java</directory><!--所在的目录-->
        <includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
          <include>**/*.properties</include>
          <include>**/*.xml</include>
        </includes>
        <filtering>false</filtering>
      </resource>
    </resources>

    <plugins>
      <!--  指定jdk版本的插件,可加可不加,因为在上面已经指定过jdk的版本   -->
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>

完整pom.xml配置:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <!--坐标-->
  <groupId>com.codeanime</groupId>
  <artifactId>project01</artifactId>
  <version>1.0-SNAPSHOT</version>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>
  <!--依赖列表-->
  <dependencies>
    <!--单元测试-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <!-- mybatis依赖 -->
    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.2</version>
    </dependency>
    <!-- mysql驱动 -->
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.46</version>
    </dependency>
  </dependencies>

  <build>
    <!--资源插件 处理src/main/java目录下的xml-->
    <resources>
      <resource>
        <directory>src/main/java</directory><!--所在的目录-->
        <includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
          <include>**/*.properties</include>
          <include>**/*.xml</include>
        </includes>
        <filtering>false</filtering>
      </resource>
    </resources>

    <plugins>
      <!--  指定jdk版本的插件,可加可不加,因为在上面已经指定过jdk的版本   -->
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>
  1. 出国年间实体类Student, 定义属性,属性名和列名保持一致

    package com.codeanime.domain;
    
    public class Student {
        private Integer id;
        private String name;
        private String email;
        private Integer age;
    
        public Integer getId() {
            return id;
        }
    
        public void setId(Integer id) {
            this.id = id;
        }
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getEmail() {
            return email;
        }
    
        public void setEmail(String email) {
            this.email = email;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    
        @Override
        public String toString() {
            return "学生实体信息{" +
                    "id=" + id +
                    ", name='" + name + '\'' +
                    ", email='" + email + '\'' +
                    ", age=" + age +
                    '}';
        }
    }
    
  1. 创建Dao接口, 定义操作数据库方法

    package com.codeanime.dao;
    
    import com.codeanime.domain.Student;
    
    public interface StudentDao {
        //查询一个学生
        Student selectStudentById(Integer id);
    }
  2. 创建xml文件(mapper文件),写sql语句

​ mybatis框架是把sql语句和java代码分开

​ mapper文件:定义和dao接口在同一目录,一个表一个mapper文件

<?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.codeanime.dao.StudentDao">
<!--    <select id="selectBlog" resultType="Blog">-->
<!--        select * from Blog where id = #{id}-->
<!--    </select>-->
    <!--查询一个学生Student

            <select>: 表示查询操作,里面是select语句
            id: 要执行的sql语句的唯一标识,是一个自定义的字符串
                推荐使用dao接口中的方法名称
            resultType: 告诉mybatis,执行sql语句,把数据赋值给那个类型的java对象
                resultType的值现在使用的是java对象的全限定名称
        -->

    <select id="selectStudentById" resultType="com.codeanime.domain.Student">
        select id,name,email,age from student where id=1001
    </select>
</mapper>

<!--
    1.约束文件
    http://mybatis.org/dtd/mybatis-3-mapper.dtd
    约束文件的作用:
    定义和限制当前文件中可以出现的标签和属性,以及标签出现的顺序
    2.mapper是根标签
        namespace: 命名空间,必须有值,不能为空,唯一值.
                    推荐使用Dao接口的全限定名称.
        作用: 参与识别sql语句的作用.
     3.在mapper里面可以写<insert>,<update>,<delete>,<select>
        <insert>里面是insert语句,表示执行的insert操作
        ...

-->
  1. 创建mybatis的主配置文件(xml文件):有一个, 放在resources目录下

(1)定义创建连接实例的数据源(DataSource)对象

(2)指定其他mapper文件的位置

<?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"/>
            <!--配置数据源: 创建Connection对象-->
            <dataSource type="POOLED">
                <!--driver:驱动的内容-->
                <property name="driver" value="com.mysql.jdbc.Driver"/>
<!--                <property name="driver" value="${driver}"/>-->
                <!--连接数据库url-->
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&amp;useUnicode=true&amp;characterEncoding=utf-8"/>
<!--                <property name="url" value="${url}"/>-->
                <!--用户名-->
                <property name="username" value="root"/>
<!--                <property name="username" value="${username}"/>-->
                <!--密码-->
                <property name="password" value="123456"/>
<!--                <property name="password" value="${password}"/>-->
            </dataSource>
        </environment>
    </environments>
    <!--指定其他mapper文件的位置:
        指定其他的mapper文件目的是找到其他文件的sql语句
    -->
    <mappers>
        <!--使用mapper的resource属性指定mapper文件的路径
            这个路径是从target/classed路径开启的

            使用注意:
                resource="mapper文件的路径,只用 / 分割路径"
                一个mapper resource指定一个mapper文件
        -->
        <mapper resource="com/codeanime/dao/StudentDao.xml"/>
    </mappers>
</configuration>
  1. 创建测试的内容

使用main方法,测试mybatis访问数据库

也可以使用junit访问数据库

创建MyTest类测试:

package com.codeanime;

import com.codeanime.domain.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 org.junit.Test;

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

public class MyTest {

    //测试mybatis执行sql语句
    @Test
    public void testSelectStudentById() throws IOException {
        //调用mybatis讴歌对象的方法,执行mapper文件中的sql语句
        //mybatis核心类:SqlSessionFactory

        //1.定义mybatis主配置文件的位置,从类路径开始相对路径
        String config = "mybatis.xml";
        //2.读取主配置文件,使用mybatis框架中的Resources类
        InputStream inputStream = Resources.getResourceAsStream(config);
        //3.创建SqlSessionFactory对象,使用SqlSessionFactoryBuild类
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
        //4.获取SqlSession对象
        SqlSession session = factory.openSession();
        //5.指定要执行的sql语句的id
        //   sql的id = nameSpace+"."+select|update|insert|delete标签的id属性值
        String sqlId = "com.codeanime.dao.StudentDao"+"."+"selectStudentById";
        //6.通过SqlSession的方法,执行sql语句
        Student student = session.selectOne(sqlId);
        System.out.println("使用mybatis查询一个学生:"+student);
        //7.关闭SqlSession对象
        session.close();
    }
}

运行测试程序:

image-20211011185802779

五.mybatis概念

1.占位符

用一个占位符替换这个id

image-20211011192017960

修改:

     #{studentId}:占位符,表示从java程序中传入过来的数据
    <select id="selectStudentById" resultType="com.codeanime.domain.Student">
        select id,name,email,age from student where id = #{studentId}
    </select>

image-20211011192643973

​ 在测试类里面添加一个方法2:

    @Test
    public void testSelectStudentById2() throws IOException {
        //调用mybatis讴歌对象的方法,执行mapper文件中的sql语句
        //mybatis核心类:SqlSessionFactory

        //1.定义mybatis主配置文件的位置,从类路径开始相对路径
        String config = "mybatis.xml";
        //2.读取主配置文件,使用mybatis框架中的Resources类
        InputStream inputStream = Resources.getResourceAsStream(config);
        //3.创建SqlSessionFactory对象,使用SqlSessionFactoryBuild类
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
        //4.获取SqlSession对象
        SqlSession session = factory.openSession();
        //5.指定要执行的sql语句的id
        //   sql的id = nameSpace+"."+select|update|insert|delete标签的id属性值
        String sqlId = "com.codeanime.dao.StudentDao"+"."+"selectStudentById";
        //6.通过SqlSession的方法,执行sql语句
        Student student = session.selectOne(sqlId,1001);//<--------------修改,传入id的值为1001
        System.out.println("使用mybatis查询一个学生:"+student);
        //7.关闭SqlSession对象
        session.close();

​ 运行测试方法2:

image-20211011192827656

2.日志

在配置文件mybatis.xml中添加日志配置:

<settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>

​ 再运行测试方法2:

image-20211011193647664

3.事务

(1)自动提交:当你的sql语句执行完毕后,提交事务,数据库更新操作直接保存数据

(2)

3.1 在接口StudentDao中添加代码实现插入操作

接口中每一个方法对应一条sql语句

    //添加一个学生(返回值int表示本次操作影响的数据库行数)
    int insertStudent(Student student);

3.2 在mapper(StudentDao.xml)配置中添加代码

    <!--  添加insert  -->
    <insert id="insertStudent">
        insert into student values(1002,"lisi","lisi@163.com",18)
    </insert>

3.3 在MyTest类中添加测试方法insertStudent

因为绝大多数代码都是重复的,所以可以直接复制上一个测试方法

    @Test
    public void testInsertStudent() throws IOException {

        String config = "mybatis.xml";
        InputStream inputStream = Resources.getResourceAsStream(config);
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession session = factory.openSession();
        String sqlId = "com.codeanime.dao.StudentDao"+"."+"insertStudent";
        int rows = session.insert(sqlId);
        System.out.println("使用mybatis添加一个学生,rows = "+rows);
        session.close();
    }

执行测试方法:

image-20211011200645059

测试方法执行成功,而且影响行数为:1

问题来了:

当检查数据库到底插入进去了没有时,

image-20211011200844781

发现没有,那么问题出在哪里,我们仔细观察刚才的日志,发现自动提交事务关闭了!

image-20211011200931167

解决:

在测试方法中添加提交事务代码:

        //mybatis默认执行sql语句是,手动提交事务模式,在左insert,delete,update时需要提交事务
        session.commit();

再次执行代码,并检查数据库:

image-20211011201347066

image-20211011201415435

成功!

insert语句使用占位符:

在测试分类MyTest中添加测试方法testInsertStudent2

    @Test
    public void testInsertStudent2() throws IOException {
        String config = "mybatis.xml";
        InputStream inputStream = Resources.getResourceAsStream(config);
        //3.创建SqlSessionFactory对象,使用SqlSessionFactoryBuild类
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
        //4.获取SqlSession对象
        SqlSession session = factory.openSession();
        //5.指定要执行的sql语句的id
        //   sql的id = nameSpace+"."+select|update|insert|delete标签的id属性值
        String sqlId = "com.codeanime.dao.StudentDao"+"."+"insertStudent2";

        Student student = new Student();
        student.setId(1003);
        student.setName("wangwu");
        student.setEmail("wangwu@163.com");
        student.setAge(19);
        System.out.println("使用mybatis插入一个学生:"+student);
        int rows = session.insert(sqlId,student);


        //mybatis默认执行sql语句是,手动提交事务模式,在左insert,delete,update时需要提交事务
        session.commit();


        //7.关闭SqlSession对象
        session.close();
    }

在mapper配置文件(StudentDao.xml)中添加一条insert语句

    <!--  insert占位符
        如果传入给mybatis是一个java对象,使用#{属性名} 获取属性的值
        属性值放到 #{}占位符的位置,mybatis执行此属性对应的getxxx()
        例如,#{id},执行getId();
      -->
    <insert id="insertStudent2">
        insert into student values(#{id},#{name},#{email},#{age})
    </insert>

执行测试方法testInsertStudent2:

image-20211011203311335

对比一下数据库:

image-20211011203549810

六.mybatis重要对象

  1. Resources

mybatis框架中的对象,作用就是:读取主配置信息

InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
  1. SqlSessionFactoryBuild

负责创建SqlSessionFactory对象

SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
  1. SqlSessionFactory

重要对象!!!!!

创建此对象需要更多的资源和时间.

在项目中有一个就可以了.

SqlSessionFactory是一个接口:作用是SqlSession的工厂,就是创建SqlSession对象.

DefaultSqlSessionFactory实现类

public class DefaultSqlSessionFactory implements SqlSessionFactory {}

SqlSessionFactory接口中的方法:

openSession():获取以恶搞默认的SqlSession对象,默认是手动提交事务的.

openSession(boolean): boolean参数表示是否提交事务

​ true: 创建一个自动提交事务的SqlSession

​ false: 等同于没有参数的openSession

自动提交事务,例如:

    @Test
    public void testInsertStudent2() throws IOException {
        String config = "mybatis.xml";
        InputStream inputStream = Resources.getResourceAsStream(config);
        //3.创建SqlSessionFactory对象,使用SqlSessionFactoryBuild类
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
        //4.获取SqlSession对象
        SqlSession session = factory.openSession(true);
        //5.指定要执行的sql语句的id
        //   sql的id = nameSpace+"."+select|update|insert|delete标签的id属性值
        String sqlId = "com.codeanime.dao.StudentDao"+"."+"insertStudent2";

        Student student = new Student();
        student.setId(1004);
        student.setName("zhaoliu");
        student.setEmail("zhaoliu@163.com");
        student.setAge(20);
        System.out.println("使用mybatis插入一个学生:"+student);
        int rows = session.insert(sqlId,student);


        //mybatis默认执行sql语句是,手动提交事务模式,在左insert,delete,update时需要提交事务
        //session.commit();


        //7.关闭SqlSession对象
        session.close();
    }
  1. SqlSession对象

SqlSession是通过SqlSessionFactory获取的,SqlSession本事就是接口

DefaultSqlSession实现类

public class DefaultSqlSession implements SqlSession {}

SqlSession作用就是提供了大量的执行sql语句的方法

SelectOne:执行sql语句,最多得到一行记录,多余1行是错误
SelectList:执行sql语句,可以返回多行数据
SelectMap:执行sql语句,得到一个Map
Insert:执行insert语句
update:执行update语句
delete:执行delete语句
commit:提交事务
rollback:回滚事务

注意:

SqlSession对象不是线程安全的,使用的步骤:

①:在方法的内部,执行sql语句之前,先获取SqlSession对象

②:调用SqlSession的方法,执行sql语句

③:关闭SqlSession对象,执行SqlSession.close()

## 七.属性配置文件

在resources目录下新建jdbc.properties文件

内容:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&amp;useUnicode=true&amp;characterEncoding=utf-8"
jdbc.username=root
jdbc.password=123456

修改mybatis配置文件mybatis.xml

<configuration>
    <!--  外部的属性配置文件
          resource:指定类路径下的某个属性配置文件
          因为:resources目录下的文件最中编译到target/classes根目录下的
          classes是类目录的根
          resource="jdbc.properties"指定的是classes目录下的某个文件
      -->
    <properties resource="jdbc.properties" />
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <!--配置数据源: 创建Connection对象-->
            <dataSource type="POOLED">
                <!--driver:驱动的内容-->
<!--                <property name="driver" value="com.mysql.jdbc.Driver"/>-->
                <property name="driver" value="${jdbc.driver}"/>
                <!--连接数据库url-->
<!--                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&amp;useUnicode=true&amp;characterEncoding=utf-8"/>-->
                <property name="url" value="${jdbc.url}"/>
                <!--用户名-->
<!--                <property name="username" value="root"/>-->
                <property name="username" value="${jdbc.username}"/>
                <!--密码-->
<!--                <property name="password" value="123456"/>-->
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--指定其他mapper文件的位置:
        指定其他的mapper文件目的是找到其他文件的sql语句
    -->
</configuration>

运行代码测试无误即可.

## 八.完整的代码文件

结构:

image-20211011220607863

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <!--坐标-->
  <groupId>com.codeanime</groupId>
  <artifactId>project01</artifactId>
  <version>1.0-SNAPSHOT</version>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.8</maven.compiler.source>
    <maven.compiler.target>1.8</maven.compiler.target>
  </properties>
  <!--依赖列表-->
  <dependencies>
    <!--单元测试-->
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>
    <!-- mybatis依赖 -->
    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.2</version>
    </dependency>
    <!-- mysql驱动 -->
    <!-- https://mvnrepository.com/artifact/mysql/mysql-connector-java -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.46</version>
    </dependency>
  </dependencies>

  <build>
    <!--资源插件 处理src/main/java目录下的xml-->
    <resources>
      <resource>
        <directory>src/main/java</directory><!--所在的目录-->
        <includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
          <include>**/*.properties</include>
          <include>**/*.xml</include>
        </includes>
        <filtering>false</filtering>
      </resource>
    </resources>

    <plugins>
      <!--  指定jdk版本的插件,可加可不加,因为在上面已经指定过jdk的版本   -->
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

mybatis.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>
    <!--  外部的属性配置文件
          resource:指定类路径下的某个属性配置文件
          因为:resources目录下的文件最中编译到target/classes根目录下的
          classes是类目录的根
          resource="jdbc.properties"指定的是classes目录下的某个文件
      -->
    <properties resource="jdbc.properties" />
    <settings>
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <!--配置数据源: 创建Connection对象-->
            <dataSource type="POOLED">
                <!--driver:驱动的内容-->
<!--                <property name="driver" value="com.mysql.jdbc.Driver"/>-->
                <property name="driver" value="${jdbc.driver}"/>
                <!--连接数据库url-->
<!--                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false&amp;useUnicode=true&amp;characterEncoding=utf-8"/>-->
                <property name="url" value="${jdbc.url}"/>
                <!--用户名-->
<!--                <property name="username" value="root"/>-->
                <property name="username" value="${jdbc.username}"/>
                <!--密码-->
<!--                <property name="password" value="123456"/>-->
                <property name="password" value="${jdbc.password}"/>
            </dataSource>
        </environment>
    </environments>
    <!--指定其他mapper文件的位置:
        指定其他的mapper文件目的是找到其他文件的sql语句
    -->
    <mappers>
        <!--使用mapper的resource属性指定mapper文件的路径
            这个路径是从target/classed路径开启的

            使用注意:
                resource="mapper文件的路径,只用 / 分割路径"
                一个mapper resource指定一个mapper文件
        -->
        <mapper resource="com/codeanime/dao/StudentDao.xml"/>
    </mappers>
</configuration>

StudentDao.xml(mapper):

<?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.codeanime.dao.StudentDao">
<!--    <select id="selectBlog" resultType="Blog">-->
<!--        select * from Blog where id = #{id}-->
<!--    </select>-->
    <!--查询一个学生Student

            <select>: 表示查询操作,里面是select语句
            id: 要执行的sql语句的唯一标识,是一个自定义的字符串
                推荐使用dao接口中的方法名称
            resultType: 告诉mybatis,执行sql语句,把数据赋值给那个类型的java对象
                resultType的值现在使用的是java对象的全限定名称

            #{studentId}:占位符,表示从java程序中传入过来的数据
        -->
    <select id="selectStudentById" resultType="com.codeanime.domain.Student">
        select id,name,email,age from student where id = #{studentId}
    </select>

    <!--  添加insert  -->
    <insert id="insertStudent">
        insert into student values(1002,"lisi","lisi@163.com",18)
    </insert>

    <!--  insert占位符
        如果传入给mybatis是一个java对象,使用#{属性名} 获取属性的值
        属性值放到 #{}占位符的位置,mybatis执行此属性对应的getxxx()
        例如,#{id},执行getId();
      -->
    <insert id="insertStudent2">
        insert into student values(#{id},#{name},#{email},#{age})
    </insert>
</mapper>

<!--
    1.约束文件
    http://mybatis.org/dtd/mybatis-3-mapper.dtd
    约束文件的作用:
    定义和限制当前文件中可以出现的标签和属性,以及标签出现的顺序
    2.mapper是根标签
        namespace: 命名空间,必须有值,不能为空,唯一值.
                    推荐使用Dao接口的全限定名称.
        作用: 参与识别sql语句的作用.
     3.在mapper里面可以写<insert>,<update>,<delete>,<select>
        <insert>里面是insert语句,表示执行的insert操作
        ...

-->

jdbc.properties:

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&amp;useUnicode=true&amp;characterEncoding=utf-8"
jdbc.username=root
jdbc.password=123456

StudentDao接口:

package com.codeanime.dao;

import com.codeanime.domain.Student;

public interface StudentDao {
    //查询一个学生
    Student selectStudentById(Integer id);

    //添加一个学生(返回值int表示本次操作影响的数据库行数)
    int insertStudent(Student student);
}

Student类:

package com.codeanime.domain;

public class Student {
    private Integer id;
    private String name;
    private String email;
    private Integer age;

    public Integer getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

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

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public Integer getAge() {
        return age;
    }

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

    @Override
    public String toString() {
        return "学生实体信息{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", email='" + email + '\'' +
                ", age=" + age +
                '}';
    }
}

MyTest测试类:

package com.codeanime;

import com.codeanime.domain.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 org.junit.Test;

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

public class MyTest {

    //测试mybatis执行sql语句
    @Test
    public void testSelectStudentById() throws IOException {
        //调用mybatis讴歌对象的方法,执行mapper文件中的sql语句
        //mybatis核心类:SqlSessionFactory

        //1.定义mybatis主配置文件的位置,从类路径开始相对路径
        String config = "mybatis.xml";
        //2.读取主配置文件,使用mybatis框架中的Resources类
        InputStream inputStream = Resources.getResourceAsStream(config);
        //3.创建SqlSessionFactory对象,使用SqlSessionFactoryBuild类
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
        //4.获取SqlSession对象
        SqlSession session = factory.openSession();
        //5.指定要执行的sql语句的id
        //   sql的id = nameSpace+"."+select|update|insert|delete标签的id属性值
        String sqlId = "com.codeanime.dao.StudentDao"+"."+"selectStudentById";
        //6.通过SqlSession的方法,执行sql语句
        Student student = session.selectOne(sqlId);
        System.out.println("使用mybatis查询一个学生:"+student);
        //7.关闭SqlSession对象
        session.close();
    }
    @Test
    public void testSelectStudentById2() throws IOException {
        //调用mybatis讴歌对象的方法,执行mapper文件中的sql语句
        //mybatis核心类:SqlSessionFactory

        //1.定义mybatis主配置文件的位置,从类路径开始相对路径
        String config = "mybatis.xml";
        //2.读取主配置文件,使用mybatis框架中的Resources类
        InputStream inputStream = Resources.getResourceAsStream(config);
        //3.创建SqlSessionFactory对象,使用SqlSessionFactoryBuild类
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
        //4.获取SqlSession对象
        SqlSession session = factory.openSession();
        //5.指定要执行的sql语句的id
        //   sql的id = nameSpace+"."+select|update|insert|delete标签的id属性值
        String sqlId = "com.codeanime.dao.StudentDao"+"."+"selectStudentById";
        //6.通过SqlSession的方法,执行sql语句
        Student student = session.selectOne(sqlId,1001);
        System.out.println("使用mybatis查询一个学生:"+student);
        //7.关闭SqlSession对象
        session.close();
    }
    @Test
    public void testInsertStudent() throws IOException {

        String config = "mybatis.xml";
        InputStream inputStream = Resources.getResourceAsStream(config);
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
        SqlSession session = factory.openSession();
        String sqlId = "com.codeanime.dao.StudentDao"+"."+"insertStudent";
        int rows = session.insert(sqlId);
        System.out.println("使用mybatis添加一个学生,rows = "+rows);

        //mybatis默认执行sql语句是,手动提交事务模式,在左insert,delete,update时需要提交事务
        session.commit();

        session.close();
    }

    @Test
    public void testInsertStudent2() throws IOException {
        String config = "mybatis.xml";
        InputStream inputStream = Resources.getResourceAsStream(config);
        //3.创建SqlSessionFactory对象,使用SqlSessionFactoryBuild类
        SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
        //4.获取SqlSession对象
        SqlSession session = factory.openSession();
        //5.指定要执行的sql语句的id
        //   sql的id = nameSpace+"."+select|update|insert|delete标签的id属性值
        String sqlId = "com.codeanime.dao.StudentDao"+"."+"insertStudent2";

        Student student = new Student();
        student.setId(1003);
        student.setName("wangwu");
        student.setEmail("wangwu@163.com");
        student.setAge(19);
        System.out.println("使用mybatis插入一个学生:"+student);
        int rows = session.insert(sqlId,student);


        //mybatis默认执行sql语句是,手动提交事务模式,在左insert,delete,update时需要提交事务
        session.commit();


        //7.关闭SqlSession对象
        session.close();
    }
}
最后修改:2021 年 10 月 11 日 10 : 15 PM
如果觉得我的文章对你有用,请随意赞赏