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"/>

使用:语法。
注意:$
这个不是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>
        <!--资源插件 处理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>
    
  2. 出国年间实体类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 +
                    '}';
        }
    }
    
    
  3. 创建Dao接口, 定义操作数据库方法

    package com.codeanime.dao;
    
    import com.codeanime.domain.Student;
    
    public interface StudentDao {
        //查询一个学生
        Student selectStudentById(Integer id);
    }
    
  4. 创建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>
    
  2. 创建测试的内容

    使用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");
    
  2. SqlSessionFactoryBuild

    负责创建SqlSessionFactory对象

    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
    
  3. 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();
        }
    
  4. 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();
    }
}

Q.E.D.


樱花庄的一只二刺猿