MyBatis

框架 ( Farmework ) 是整个或部分系统,遵循可重用设计,表现为一组抽象构件,以及构件实例间交互的方法,另一种认为,框架是可被应用开发者定制的应用的骨架和模板

框架是一个半成品软件,定义好了一些基础功能 , 需要加入你的功能就是完整的

框架特点 :

  • 框架一般不是全能的,不能做所有事情
  • 框架是针对某一个领域有效, 特长在某一个方面,

三层架构:

界面层: (User Interface layer) controller (Servlet)

  • 接收用户提交的数据,显示请求的处理结果,使用web页面和用户交互
  • html , Jsp , Servlet

业务逻辑层(Business Logic Layer) Service

  • 接收表示传递过来的数据,检查数据,计算业务逻辑,调用数据访问层获取数据
  • Service

数据访问层(Data access layer) Dao 包

  • 与数据库打交道,主要实现对数据的增删改查,将存储在数据库中的数据提交给业务层,同时将业务层处理的数据保存到数据库
  • Dao (持久层)

三层对应的处理框架:

  • 界面层 —servlet类 ---- springmvc(框架)
  • 业务逻辑层 — service 类 ---- spring (框架)
  • 数据访问层 — Dao类 ---- mybatis (框架)

框架是一个模板

  • 框架中定义了一些功能,这些功能是可用的
  • 可以加入项目中自己的功能,这些功能可以利用框架中写好的功能

MyBatis框架:

mybatis(sql映射框架)

是MyBatis SQL Mapper Framework for java

sql mapper : sql 映射

  • 可以把数据库表中的一行数据 映射为一个java对象
  • 一行数据可以看做是一个java对象
  • 操作这个对象就相当于操作表中的数据

Data Access Objects (Daos) ; 数据访问

  • 对数据库中执行增删改查

mybatis提供那些功能

  • 提供了创建 Connection , Statement , ResultSet 的能力 , 不用开发人员创建这些对象了
  • 提供了执行SQL语句的能力 , 不用你再执行sql
  • 提供了循环sql , 把sql的结果转为list集合的能力
  • 提供了关闭资源的能力,不用你再去关闭资源了

开发人员只需要提供sql语句即可

最后是 : 开发人员提供sql语句 — mybatis处理sql — 开发人员得到List集合或java对象 (表中的数据)

总结 :

MyBatis是一个sql映射框架 , 提供的数据库操作能力 , 可以看成是一个增强的JDBC

使用Mybatis 让我们的开发人员集中精神写sql即可 , 不必关心Connection , Statement , ResultSet 创建的创建 , 销毁 ,使用


使用步骤:

  • 新建一个表 Student
  • 加入maven的MyBatis坐标 , mysql驱动的坐标
  • 创建实体类 Student – 保存表中的一行数据
  • 创建持久层的Dao接口 , 定义操作数据库的方法
  • 创建一个MyBatis使用的配置文件
    • 叫做sql映射问文件 : 写SQL语句的 ,一般一个表一个SQL映射文件
    • 这个文件是 .xml 文件
    • 文件写在接口所在的目录中 , 文件的名称和接口保持一致
  • 创建MyBatis的主配置文件
    • 一个项目中就一个主配置文件
    • 主配置文件提供了数据库的链接信息和SQL映射文件的位置信息
  • 创建使用MyBatis的类
    • 通过MyBatis访问数据库

SQL映射文件的编写
<!--
    sql映射文件 : 写sql语句的 , mybatis会执行这些sql

    1.指定约束文件
        <!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
    mybatis-3-mapper.dtd 是约束文件的名称 , 扩展名是dtd的
    2.约束文件的作用 : 限制,检查在当前文件中出现的标签,属性必须符合mybatis的要求

    4.在当前文件中可以使用特定的标签 , 表示数据的特定操作
    <select> : 表示执行查询 , 只能执行select语句
    <update> : 表示更新数据库的操作,在标签中只能写update语句
    <insert> : 表示插入 , 放的是insert语句

    <delete> : 表示删除 , 执行的是delete语句
-->
<?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">
<!--
  3.mapper是当前文件的根标签,必须的
    namespace : 叫做命名空间,唯一值的,可以是自定义的字符串
                要求你使用dao接口的全限定名称(绝对路径 , 包名加类名)
-->
<mapper namespace="org.sichen.dao.StudentDao">
    <!--
        select : 表示查询操作
        id : 表示你要执行sql的语句的唯一标识
            mybatis会使用这个id的值来找到要执行的SQL的语句
            可以自定义 , 但是要求你是用接口中的方法名

        resultType : 表示结果类型的 ,
            是SQL语句执行后得到的ResultSet , 遍历这个ResultSet得到java对象的类型
            规定查询出来的数据的类型
        值就是类型的全限定名称
    -->
    <select id="findAll" resultType="org.sichen.domain.Student">
        select id,name,email,age from student order by id;
    </select>
    <insert id="insertStudent">
       <!--这里使用 #{} 一种占位符 里边写插入数据类型对应bean中的属性名-->  
        insert into student values(#{id},#{name},#{email},#{age});
    </insert>
</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 : 加s说明可以有多个数据库的配置信息
                环境配置 : 就是数据库的配置信息
           default : 必须和某个environment的id值一样
                告诉mybatis使用那个数据库的连接信息,也就是访问那个数据库-->
    <environments default="development">
        <!-- environment : 一个数据库信息的配置 , 环境
                id : 是一个唯一值 , 是一个自定义的 , 是用来表示环境的名称的-->
        <environment id="development">
            <!-- transactionManager : mybatis的事务类型
                type : 值有两个
                  JDBC (表示使用jdbc中的connection对象的commit,rollback做事务处理)  -->
            <transactionManager type="JDBC"/>
            <!--dataSource 代表数据源,连接数据库的
                   type : 表示数据库的类型
                        POOLED : 表示使用连接池-->
            <dataSource type="POOLED">
                <!--配置数据库的具体信息的
                        这些值是固定的,不能自定义,-->
                <!--driver : 数据库的驱动类名-->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <!--连接数据库的url字符串-->
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC"/>
                <!--访问数据库的用户名称-->
                <property name="username" value="root"/>
                <!--访问数据库的用户密码-->
                <property name="password" value="acpl159357"/>
            </dataSource>
        </environment>
    </environments>
    <!--mapper: 指定sql映射文件的位置
        从类路径开始的路径信息
            也就是从编译后的classes目录下的路径开始的(如下图所示),
			默认情况下,编译后不会保留配置文件 , 需要在pom.xml文件中加一个编译的插件
        -->
    <mappers>
        <mapper resource="org/sichen/dao/StudentDao.xml"/>
    </mappers>
</configuration>

1646471815241

编译时保留配置文件的插件:
<build>
    <resources>
      <resource>
        <directory>src/main/java</directory><!--所在的目录-->
        <includes><!--包括目录下的.properties , .xml文件都会被扫描到-->
          <include>**/*.properties</include>
          <include>**/*.xml</include>
        </includes>
        <filtering>false</filtering>
      </resource>
    </resources>
  </build>
使用:
//访问mybatis读取student数据
        //1.定义mybatis的主配置文件的名称 ,
        //从类路径的根开始(target/classes , 不用写这个路径,是默认从这个路径开始找的)
        String config = "mybatis.xml";
        //2.读取这个config表示的文件
        InputStream in = Resources.getResourceAsStream(config);
        //(要使用org.apache.ibatis.io这个包下的文件)

        //3.创建了SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
        //4.创建SqlSessionFactory对象
        SqlSessionFactory factory = builder.build(in);
        //5.[重要的]获取SqlSession对象 , 从SqlSessionFactory中获取SqlSession
        SqlSession sqlSession = factory.openSession();
        //6.[重要的]指定要执行的sql语句的标识 , sql映射文件中的namespace + "." + 标签的id值
        String sqlId = "org.sichen.dao.StudentDao" + "." + "findAll";
        //7.执行SQL语句,通过sqlId来找到语句
        List<Student> studentList = sqlSession. selectList(sqlId);
        //8.输出结果(这个是jdk8才有的新功能)
        studentList.forEach(stu -> System.out.println(stu));
        //9.关闭SqlSession对象
        sqlSession.close();

注意:

MyBatis默认不是自动提交事务的

所以在执行增删改之后,要手工提交事务

sqlSession.commit();

开启日志功能:(很方便开发调试)

在主配置文件中添加日志配置 , 可以在控制台输出执行的sql语句和参数

<configuration>
<!--settings控制MyBatis全局行为的-->
    <settings>
        <!--设置mybatis输出日志-->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
</configuration>

主要的类的介绍:

String config = "mybatis.xml";
InputStream in = Resources.getResourceAsStream(config);
/*
Resources : mybatis中的一个类 , 负责读取主配置文件
*/

SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
/*
SqlSessionFactoryBuilder : 提供一个方法 build
	通过读取配置文件,去创建一个SqlSessionFactory

SqlSessionFactory : 重量级对象 , 程序创建一个对象耗时比较长,使用资源比较多
	在整个项目中创建一个就够了
    它本身是一个接口
    	接口的实现类 : DefaultSqlSessionFactory
        DefaultSqlSessionFactory作用 : 获取SqlSession对象
*/

SqlSession sqlSession = factory.openSession();
/*
openSession()方法说明 : 
	openSession(): 无参的 , 获取的是非自动提交事务的SqlSession对象
	openSession(boolean): 值为true: 获取的是自动提交事务的SqlSession对象
	
SqlSession 接口说明 : 
	定义了操作数据库的方法 
	例如 : selectOne() , selectList() , insert() , update() , delete() , commit() ,
			rollback()
SqlSession 的实现类 : DefaultSqlSession

使用要求 : 
	SqlSession对象不是线程安全的,需要在方法内部使用 , 
	在执行sql语句之前 , 使用openSession()获取SqlSession对象 , 
	在执行sql语句之后 , 需要关闭它 , 执行SqlSession.close();
	
*/
String sqlId = "org.sichen.dao.StudentDao" + "." + "findAll";
List<Student> studentList = sqlSession. selectList(sqlId);
studentList.forEach(stu -> System.out.println(stu));
sqlSession.close();

使用工具类封装重复操作 :

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;

public class MyBatisUtils {
    private static SqlSessionFactory factory = null;
    static {
        String config = "mybatis.xml";
        try {
            InputStream in = Resources.getResourceAsStream(config);
	//一步到位直接获取SqlSessionFactory , 省略了创建SqlSessionFactoryBuilder过程
            SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
//外界获取SqlSession的方法
    public static SqlSession getSqlSession() {
        SqlSession sqlSession = null;
        if (factory != null) {
            sqlSession = factory.openSession();
        }
        return sqlSession;
    }
}

使用动态代理来执行SQL语句:(非常重要)

也就是不用再创建实现类了 , mybatis根据你的dao调用的方法 , 这一条语句 , 获取你的全限定名称 , 还有调用的方法 , 以及 确定调用的是哪一个SqlSession的方法

StudentDao studentdao = new StudentDaoImpl();
/**
* StudentDao studentdao = new StudentDaoImpl();调用
* 1.dao对象 , 类型是StudentDao , 全限定名称是 : com.sichen.dao.StudentDao
* 全限定名称和 namespace 是 一样的
* 
* 2.方法名称 : findAll , 这个方法就是mapper文件中的 id值 findAll
* 
* 3.通过dao中方法的返回值也可以确定MyBatis要调用的SqlSession方法
*   如果返回值是list , 调用的是SqlSession.selectList()方法
* 	如果返回值是 int , 或是非list的 , 看mapper文件中的标签是<insert> <update> 就会调用
*   SqlSession的insert , update等方法
* 
*  MyBatis的动态代理 
*  mybatis框架根据dao的方法调用 , 获取执行sql语句的信息
*  mybatis根据你的Dao接口 , 创建出一个Dao接口的实现类 , 并创建这个类的对象 , 
*    来完成SqlSession 调用方法 , 访问数据库

*/
List<Student> StudentList = studentdao.findAll();


以前写的时候 ,还需要创建实现类 , 将接口实例化 , 然后调用实现类中的方法 , 完成操作 ,

现在只需要写一个dao接口

/**
* 使用mybatis的动态代理的机制 , 使用SqlSession.getMapper(dao接口.class)
* getMapper 能够获取dao接口对于实现类的对象
* 这个是Mybatis使用动态代理的方式 , 自己实现的 , 我们只需要传递这个接口的class类型 , 就可以创建出一个实现类对象 , 调用其中的方法
*/
SqlSession sqlSession = MyBatisUtils.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class);
//调用dao的方法 , 执行数据库的操作
List<Student> all = dao.findAll();
for (Student student : all) {
    System.out.println(student);
}

MyBatis的传参是怎么完成的:

传入参数 : 从java代码中把数据传入到mapper文件的xml中

/*
parameterType : 写在mapper文件中的一个属性 , 表示dao接口中方法的参数的数据类型
		值 : 是java的数据类型的全限定名称 , java.lang.Integer
			或者是mybatis定义的别名  int
resultType : 规定返回值的数据类型 
    	值 : 是java的数据类型的全限定名称
             或者是mybatis定义的别名
注意 : parameterType :不是强制的 , mybatis通过反射机制能够发现接口参数的数据类型
	所以可以没有 , 一般我们也不写

一个简单类型的参数 :

/*
简单类型 : 
	mybatis把java的基本数据类型 , 和String 都叫做简单数据类型 
在mapper中 , 文件获取简单数据类型的一个参数的值 , 使用 #{任意字符} 
	使用 #{}之后 , mybatis执行sql是使用jdbc中的PreparedStatement对象
	由mybatis执行下面的代码 
	1. mybatis创建 Connection , PreparedStatement 对象 
*/
String sql = "select * from student where id = ? ";
PreparedStatement pst = conn.preparedStatement(sql);
pst.setInt(1,1003);
   //2.执行sql封装为  resultType="org.sichen.domain.Student" 这个对象
ResultSet rs = ps.executeQuery();
Student student = null;
while(rs.next()){
    //从数据库中取表的行数据 , 存到一个java对象的属性中 
  	student = new Student();
    student.setId(rs.getInt("id"));
    student.setName(rs.getString("name"));
    student.setEmail(rs.getString("email"));
    student.setAge(rs.getInt("age"));
}
return student; //给了dao方法调用的返回值


//接口定义 : 
public Student findOne(int id);
<!--mapper中的定义-->
	<select id="findOne" resultType="org.sichen.domain.Student">
        select * from student where id = #{id};  <!--这个可以是任意的字符-->
    </select>
<!--(parameterType可以忽略不写)-->

多个参数 :

多个参数 : 使用 @Param :

@Param : 命名参数

//接口 : 
public List<Student> findTwo(@Param("myname") String name , @Param("myage") Integer age);

//使用@Param命名参数
@Param("参数名") String name , @Param("参数名") Integer age
<!--mapper文件中 :-->
    <select id="findTwo" resultType="org.sichen.domain.Student">
        select *
        from student
        where name = #{myname}
           or id = #{myid};
    </select>
多个参数 : 使用对象 :

使用java对象传递参数 , java的属性值就是SQL需要的参数值 , 每一个属性就是一个参数 ,

创建一个bean对象用来存储属性 QueryParam.java

这个类型是没有限制的 , 什么类型都可以

public class QueryParam {
    private String myname;
    private Integer myage;
    //提供get和set方法 
}
//接口 :
List<Student> findThree (QueryParam param);
<!--mapper文件中
        使用对象的语法 :
         完整语法 : #{属性名 , javaType=类型名称 , jdbcType=数据库类型 }
            例如 : #{myname , javaType=java.lang.String , jdbcType=VARCHAR}
         开发中一般使用的语法 :
            #{属性名} 其他两个值 , mybatis反射能够获取 , 不用提供
    -->
    <select id="findThree" resultType="org.sichen.domain.Student">
        select *
        from student
        where name = #{myname}
           or id = #{myage};
    </select>
多个参数 : 按位置 :(不常用)
语法 : 
#{arg0} , #{arg1} ,这种格式 
按照传递参数从左往右数的位置, 在后边加上下标
多个参数 : 使用Map: (不常用)
语法 : 
#{key的名称}

#和$的区别:

/*
# : 叫做占位符 , 告诉MyBatis使用实际的参数值替代 , 并使用 PrepareStatement对象执行sql	语句 , #{...}代替sql语句中的 ? 
	这样做更安全(避免sql注入) , 便捷 ,通常也是首选做法
	select * from student where id = ?;
	
$ : 字符串替换 ,告诉MyBatis使用$包含的字符串替换所在位置 , 使用Statement把SQL语句 和${}的内容连接起来 , 
主要用在替换表名 , 列名 , 不同列排序等操作 
	select * from student where id = 1001;

使用$替换列名.或表名

select * from ${传递的表名} where id = ?;

MyBatis的输出结果:

简介:

mybatis执行sql语句 , 得到java对象

ResultType : 结果类型 , 指SQL语句执行完毕之后 , 数据转为java对象 , 这个java类型是任意的 ,

处理方式 :

  • mybatis执行sql语句 , 然后mybatis调用类的无参数构造方法 , 创建对象
  • mybatis把ResultSet指定的列值赋给同名的属性

常见处理 : 比如说 , 表中有很多列 , 但是我们只需要获取 , 其中的一些数据 , 那么可以将这些需要的属性封装一个类 , 让返回值类型为这个封装的类 , 这样查询出来的数据 , 就只有封装的类中的属性 ,


返回一个简单类型 :

返回的值可以是别名(mybatis规定的别名 , 有固定的格式 , 是简化代码书写的)

也可以是java类型的全限定名称

//接口中 : 
int selectCount();
<!--mapper中 : -->
<select id="selectCount" resultType="int(别名)或者是java.lang.Integer(全限定名称)">
	select count(*) from student;
</select>

返回一个Map: (使用比较少)

sql的查询结果作为Map的key和value , 推荐使用Map<Object , Object>

注意 : Map作为接口返回值 , sql语句的查询结果最多只能有一条记录 , 大于一条记录是错误


ResultMap : 结果映射 (指定列名和java对象的属性对应关系)

(1) 你自定义你的列值赋值给哪个属性

(2) 当你的列名和属性名不一样时 ,一定要使用resultMap

<!--
    使用resultMap
        先定义resultMap
        在select标签中 , 使用resultMap来引用1定义的
    -->
<resultMap id="studentMap" type="org.sichen.domain.Student">
    <!--
            id : 自定义名称 , 表示你定义的这个resultMap (就是resultType的值)
            type : java类型的全限定名称
        -->
    <!--列名和java属性的关系-->
    <!--主键列 , 使用id标签
            column : 列名
            property :  java类型的属性名(也就是要赋值的属性)
        -->
    <id column="id" property="id"></id>
    <!--非主键列 , 使用result-->
    <result column="name" property="name"></result>
    <result column="email" property="email"></result>
    <result column="age" property="age"></result>
</resultMap>
<!--这里是ResultMap , 注意 !!!!!
ResultMap  和   ResultType二者不能同时用 , 只能二选一
-->
<select id="selectAllStudents" resultMap="studentMap">
        select id,name,email,age from student;
</select>

列名和属性名不同的两种方法 :

(1) 使用ResultMap , 也就是上边的解决方法

(2) ResultType默认的原则是 , 同名的列值赋值给同名的的属性 , 所以可以给列起别名 , (对应java对象的属性名)


自定义类型的别名: typeAlias

在mybatis主配置文件中定义 , 使用定义别名

然后就可以在resultType中使用自定义的别名

第一种 : 给数据类型定义别名(也就是创建的实体类)

 <!--给数据类型  定义别名-->
<typeAliases>
    <!--
        可以指定一个类型 , 一个自定义别名
        type : 自定义类型的全限定名称
        alias : 自定义的别名
        -->
    <typeAlias type="org.sichen.domain.QueryParam" alias="qp"/>
    <typeAlias type="org.sichen.domain.Student" alias="stu"/>
</typeAliases>

第二种方式 : 直接给这个类型所在的包设置

这个包下的所有类 , 类名就是别名 (类名不区分大小写)

<typeAliases>
	<package name="org.sichen.domain.Student"/>
</typeAliases>

模糊查询 Like:

第一种 : Java代码中准备好like的值

也就是直接传值到mapper中 ,使用#{} 来表示

第二种 : 直接在mapper中拼接值

select id,name,email,age from student where name like "%" #{name} "%";
注意 : 这里的空格必须有 , 根据需要拼接 "%" 即可

动态SQL :

动态SQL : SQL 语句的内容是变化的 , 我们可以根据条件获取到不同的sql语句 ,主要是where部分发 生变化

动态SQL的实现 : 使用的是mybatis提供的各种标签 ,

动态SQL要使用java对象作为参数 ,

if : 判断条件的

  • <!--语法 :--> 
    <if test="判断java对象的属性值">
        部分SQL语句
    </if>
    
  • <select id="selectStudentIf" resultType="org.sichen.domain.Student">
            select id, name, email, age
            from student
            where 1 = 1
            <if test="name!=null and name!=''">
                and name = #{name}
            </if>
            <if test="age>0">
                and age = #{age}
            </if>
        </select>
    

where:用来包含多个if的 ,

当多个if有一个成立的话 , where标签会自动增加一个where关键字 , 并去掉if中多余的and , or 等

(比如说 , 有些条件前边是or 直接加这个条件会造成SQL语法错误 , 但是where能够自动将这个or去掉 , 把语法错误避开)

如果都不满足 , 就什么都不会加 , 也不会加where语句

<select id="selectStudentWhere" resultType="org.sichen.domain.Student">
        select id, name, email, age
        from student
        <where>
            <if test="name!=null and name!=''">
                and name = #{name}
            </if>
            <if test="age>0">
                and age = #{age}
            </if>
        </where>
    </select>

注意: 从上往下 , 第一个if中的条件可以不加 连接语句 , 但是后边的语句都要加连接语句 , 最好是全部加上


foreach: 循环java中的数组 或 list集合的

主要用在SQL的in语句中

学生id是 1001 , 1002 , 1003 的三个学生

select * from student where id in (1001 , 1002 , 1003);
<select id="selectStudentForeach" resultType="org.sichen.domain.Student">
        select id,name,email,age
        from student
        where id in
        <foreach collection="list" item="myid" open="(" close=")" separator=",">
                #{myid}
        </foreach>
    </select>
    <!--
        collection : 表示接口中的方法参数的类型 , 如果是数组使用array , 如果是list集合使用list
        item : 自定义的 , 表示数组和集合成员的变量
        open : 循环开始时的字符   "("
        close : 循环结束时的字符   ")"
        separator : 集合成员之间的符号  ","
    -->

如果传递的是一个List 里边存储的是一个Student对象 ,

<foreach collection="list" item="stu" open="(" close=")" separator=",">
                #{stu.id}
</foreach>

动态SQL之代码片段 :

 <!--定义 sql片段 , 使用的是sql 标签 id值与下边引用这个代码片段的refid的值一致-->
    <sql id="studentSql">
        select id,name,email,age from student
    </sql>
    <select id="selectStudentsql" resultType="org.sichen.domain.Student">
        /*引用SQL片段的时候使用include标签 refid的值就是上边sql标签中的id值*/
        <include refid="studentSql" />
        <if test="list!=null and list.size>0">
            where id in
            <foreach collection="list" item="id" open="(" close=")" separator=",">
                #{id}
            </foreach>
        </if>
    </select>

主配置文件的属性 :

设置mybatis输出日志 :(重复之前)

setting是mybatis的全局设置

它可以指定很多的name ,以及对应的值

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

定义别名 :(重复之前)

<!--定义别名-->
    <typeAliases>
        <!--
        可以指定一个类型 , 一个自定义别名
        type : 自定义类型的全限定名称
        alias : 自定义的别名
        -->
        <typeAlias type="org.sichen.domain.QueryParam" alias="qp"/>
        <typeAlias type="org.sichen.domain.Student" alias="stu"/>
        <!--指定package标签 , 该文件夹下的所有类的名称就是别名-->
        <package name="org.sichen.domain.Student"/>
    </typeAliases>

环境变量的设置 :(了解)

<environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <!--
				transactionManager : 提交事务 , 回滚事务的方式
				type : 事务处理的类型
     (1)JDBC 表示mybatis底层是调用JDBC中的Connection对象 , commit ,rollback
(2)MANAGED	: 把mybatis的事务处理委托给其他的容器(可以是一个服务器软件 , 或者框架(Spring))			
			-->
            <dataSource type="POOLED">
 <!--
	dataSource : 表示数据源 , Java体系中 , 规定实现了javax.sql.DataSource接口的都是数					据源
		数据源 : 表示Connection对象的
	type : 指定数据源的类型 
		(1)POOLED : 使用连接池 , mybatis会创建PooledDataSource类
		(2)UNPOOLED : 不使用连接池 , 在每次执行sql语句时 , 先创建连接 , 执行sql ,在关					闭连接
 			mybatis会创建一个UnPooledDataSource , 管理Connection对象的使用
		(3)JNDI : java的命名和目录服务 , (相当于windows的注册表)
-->
                <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC"/>
                <property name="username" value="root"/>
                <property name="password" value="acpl159357"/>
            </dataSource>
        </environment>
    </environments>

数据库属性配置文件:(重要)

把数据库连接信息放到一个单独的文件中 , 和mybatis主配置文件分开 , 目的是便于修改 , 保存 , 处理多个数据库的信息

(1) 在Sources 目录中定义一个属性配置文件 , xxx.properties

​ 在属性配置文件中 , 定义数据 , 格式是 key = value

​ key : 一般使用 . 做多级目录的

例如 : jdbc.mysql.Driver = com.mysql.cj.jdbc,Driver

jdbc.url = jdbc:mysql:// …

这么做的目的是 : 使结构更加清晰 , 能够一眼看出哪几个是一起的

(2) 在mybatis的主配置文件 , 使用 指定文件的位置

在需要值的地方 , ${key}

<configuration>
    <!--指定properties文件的位置 , 从类路径根开始找文件-->
    <properties resource="jdbc.properties"/>
</configuration>

<!--driver : 数据库的驱动类名-->
<property name="driver" value="${jdbc.Driver}"/>
<!--连接数据库的url字符串-->
<property name="url" value="${jdbc.url}"/>
<!--访问数据库的用户名称-->
<property name="username" value="${jdbc.user}"/>
<!--访问数据库的用户密码-->
<property name="password" value="${jdbc.password}"/>

指定多个mapper文件:

第一种方式 : 就是上边有的 , 每指定一个文件 , 写一个mapper

第二种方式 : (使用包名)

name是你的mapper文件所在的包的包名全限定名称 ,

在这个包下的所有mapper文件 , 都能够被一次性加载进mybatis

**注意 : **

  • mapper 文件名称必需要和接口名称一样 , 区分大小写
  • mapper文件和 dao接口必须在同一目录之中
<mappers>
	<package name="">
</mappers>

typeHandlers 标签 : 自定义类型处理器

首先要编写数据类型的转换器类 ,

public class TypeHandler extends BaseTypeHandler<Date> {
    //将java类型 转换为 数据库需要的类型
    @Override
    public void setNonNullParameter(PreparedStatement ps, int i, Date parameter, JdbcType jdbcType) throws SQLException {
        long time = parameter.getTime();
        ps.setLong(i,time);
    }
    //将数据库中类型转换为java类型
    //ResultSet : 查询出的结果集
    //String : 要转换的字段名称
    @Override
    public Date getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return null;
    }
    //将数据库中类型转换为java类型
    @Override
    public Date getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return null;
    }
    //将数据库中类型转换为java类型
    @Override
    public Date getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return null;
    }

然后在MyBatis核心配置文件中注册类型处理器

<typeHandlers>
    <typeHandler class="自定义数据转换类型的全限定名称">
    </typeHandler>
</typeHandlers>

PageHelper : MyBatis通用分页插件(实用)

使用 :

首先 , 添加PageHelper的jar包

<!--使用PageHelper的jar包-->
    <dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper</artifactId>
      <version>5.3.0</version>
    </dependency>

(2) 加入plugin配置 :

注意是在主配置文件中添加的 , 而不是添加在pom.xml文件中

<plugins>
    <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>

java中编写 :

SqlSession sqlSession = MyBatisUtils.getSqlSession();
StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
/*加入分页查询的数据
其中PageNum : 第几页数据(为0的话就查不出来数据了)
PageSize : 一页中有多少行数据
* */
/*PageHelper.startPage(PageNum,PageSize);*/
PageHelper.startPage(2,3);
List<Student> studentList = studentDao.selectAllTwo();
for (Student student : studentList) {
	System.out.println(student);
}

然后在MyBatis核心配置文件中注册类型处理器

<typeHandlers>
    <typeHandler class="自定义数据转换类型的全限定名称">
    </typeHandler>
</typeHandlers>

PageHelper : MyBatis通用分页插件(实用)

使用 :

首先 , 添加PageHelper的jar包

<!--使用PageHelper的jar包-->
    <dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper</artifactId>
      <version>5.3.0</version>
    </dependency>

(2) 加入plugin配置 :

注意是在主配置文件中添加的 , 而不是添加在pom.xml文件中

<plugins>
    <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>

java中编写 :

SqlSession sqlSession = MyBatisUtils.getSqlSession();
StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
/*加入分页查询的数据
其中PageNum : 第几页数据(为0的话就查不出来数据了)
PageSize : 一页中有多少行数据
* */
/*PageHelper.startPage(PageNum,PageSize);*/
PageHelper.startPage(2,3);
List<Student> studentList = studentDao.selectAllTwo();
for (Student student : studentList) {
	System.out.println(student);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值