MyBatis框架

这是作者一天的学习整理 希望多多鼓励!!

直接让你学完即可上手MyBatis!

一、概念

三层架构

  1. 界面层 和用户打交道 显示处理结果

  2. 业务逻辑层 接收界面层的数据 处理业务调用数据库

  3. 数据访问层 访问数据库 对数据增删改查

框架

  1. 是一个软件

  2. 不是全能的 针对一个领域

JDBC的缺陷

重复的代码多 开发效率低

MayBatis框架

sql映射:把表中的数据映射成一个对象 操作对象 就是操作数据

数据访问:对数据增删改查

总结:增强版的JDBC 集中写SQL语句 不必关心JDBC各种繁琐的操作

 

二、入门案例使用

1. 下载MyBatis 配置环境

2.整理模块 添加资源目录

3.添加依赖 重新加载项目

<!--mybatis依赖-->
<dependency>
 <groupId>org.mybatis</groupId>
 <artifactId>mybatis</artifactId>
 <version>3.5.7</version>
</dependency>
<!--mysql驱动-->
<dependency>
 <groupId>mysql</groupId>
 <artifactId>mysql-connector-java</artifactId>
 <version>5.1.23</version>
</dependency>
   
<!-- pom.xml下的build中加入 -->
<resources>
<resource>
       <directory>src/main/java</directory>
       <includes>
        <include>**/*.properties</include>
        <include>**/*.xml</include>
       </includes>
       <filtering>false</filtering>
</resource>
</resources>    

4.domain创建实体类bean

 

数据库列名与属性名一致【保存表中一行数据】

5.do创建接口

接口名=实体类名+Dao

定义操作数据库的方法

5. 创建配置文件

sql映射文件.xml 【写sql语句的 一个表一个】

在接口目录中

文件名和接口名一致

<?xml version="1.0" encoding="UTF-8" ?>
<!-- mybatis-3-mapper.dtd:约束文件名称
  检查当前文件的格式是否符合mybatis的要求
   -->
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- mapper:当前文件的根标签
   namespace:命名空间 要求dao接口的全限定名称 -->
   
<mapper namespace="">
   <!-- id:赋值接口中的方法名称
       resultType:得到的类的全限定名称 -->
   <select id="" resultType="">
       select  from
   </select>
</mapper>

 

6. 创建主配置文件

主要定义数据库的信息 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>
   <!-- 日志 -->
   <settings>
       <setting name="logImpl" value="STDOUT_LOGGING"/>
   </settings>
   <!--环境配置 数据库的连接信息 default 指定id的数据库-->
   <environments default="sql">
       <!--一个数据库的信息配置 id:唯一值 环境的名称-->
       <environment id="sql">
           <!-- type myBatis的事物类型-->
           <transactionManager type="JDBC"/>
           <!--type 数据源的类型-->
           <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="root"/>
           </dataSource>
       </environment>
   </environments>
   <!-- mappers:sql映射文件的位置
       mapper:指定一个文件的位置 类路径开始的路径 classpath
   -->
   <mappers>
       <mapper resource="com/baidu/Dao/StudentDao.xml"/>
   </mappers>
</configuration>

7.测试

SqlSession session = MyBatisUtil.getSqlSession();
       StudentDao studentDao = session.getMapper(StudentDao.class);
       List<Student> list = studentDao.sel();
       for(Student student:list){
           System.out.println(student);
      }
       session.close();
//注意:MyBatis框架 提交
//session = factory.openSession(true);
//session.commit();

8.工具类

private static SqlSessionFactory factory = null;
   static{
       try {
           InputStream in = Resources.getResourceAsStream("mybatis.xml");
           factory = new SqlSessionFactoryBuilder().build(in);
      } catch (IOException e) {
           e.printStackTrace();
      }
  }
   public static SqlSession getSqlSession(){
       SqlSession session = null;
       if(factory != null){
           session = factory.openSession();
      }
       return session;
  }

 

三、传参

将java代码的数据(接口中方法的形参)传入sql映射文件的sql语句中

1. 一个简单类型

#{任意字符}

2. 多个参数 @param

//接口中的方法
public xxx xxxx(@param("oo") xxx xxx){}

//sql映射文件
select xxx,xxx from xxx where xxx = #{oo}

3. 多个传参-对象传参

#{属性名}

4. Map传参 #{key}

//接口方法
public xxx xxxx(Map<String,Object> xxx){}

//测试
Map<String,Object> xxx = new HashMap();
xxx.put("name","张三")
xxx.put("age",20)

5.# 和 $区别

'#'防止注入

'$'允许注入 可以代替表名 列名

 

四、封装MyBatis输出结果

1. resultType 输出结果

返回对象:

1. 执行sql语句 调用无参构造方法,创建对象

2. 列名赋值给同名属性

返回基本类型 建议全限定名称

  1. 返回Map Key就是列名 value就是列值

    一次只能返回一行记录 多了报错

2.自定义类型的别名

  1. 别名

  1. 包名

//在主配置文件 上面定义
<typeAliases>
       <typeAlias type="全限定名称" alias="别名"/>
</typeAliases>
   
<typeAliases>        
   //使用包名 类名就是别名
  <package name="com.baidu.doMain" />
</typeAliases>
   
//在resultType属性使用别名
<select id="sel" resultType="别名">
   select id,name,email,age from student
</select>

3. 列名属性名不一致 赋值

  1. resultMap:结果映射 推荐

自定义列名赋值给那个属性

<resultMap id="studentMap" type="com.baidu.doMain.Student">
      <!-- 列给属性-->
      <!-- 主键对应-->
      <id column="" property=""/>
      <!-- 非主键对应-->
      <result column="" property=""/>
</resultMap>
//在resultMap属性使用别名
<select id="sel" resultMap="studentMap">
  select id,name,email,age from student
</select>
  1. 使用resultType解决列名属性名不一致 as

//在resultMap属性使用别名
<select id="sel" resultType="com.baidu.Student">
  select idd id,namee name,emaill emaill,agee age from student
</select>

like模糊查询

  1. 输入 String 字符串"%xx%" 整个输入

  1. 在sql语句内输入"%"要加双引号

 

五、动态sql

1. if where foreach

sql语句是变化的 可以根据条件获取不同的sql语句

主要是where部分变化

实现:是使用MyBatis提供的标签

<if>
<if test = "判断java对象的属性值">
//slq语句
</if>
       
//会自动添加一个where
//可以包含多个if并去掉多余and or
<where>
<where>
//多个if
</where>
       
//循环数组和集合 主要用在in
<foreach>
   <foreach collection = "变量名"
       item = "自定义变量名"
       open="(" close=")"
       separator=",">
       #{自定义变量名 如果是对象的属性加.}
</foreach>

2. sql代码片段

就是代码复用

//定义
<sql id = "自定义名">
//sql语句    
</sql>
 
//使用
<include refid = "自定义名">

六、配置文件

1. 数据库属性配置文件

  • 把数据库连接信息和主配置文件分开

  • 便于修改、保存、处理数据库的信息

  • propertises文件放在资源目录下 resources

  • 使用格式 xxx=xxx 比如 jdbc.mysql.driver = xxx

     

//主配置文件中指定路径
<properties resource = "xxxx.properties">
//使用格式 ${xxx}

 

2. 指定多个slq映射文件

//多写
<mappers>
<mapper resource = "sql映射文件路径位置"/>
   <mapper resource = "sql映射文件路径位置"/>
</mappers>

//使用包名
//要求:1。映射文件名和接口名一致
//   2.映射文件名和接口名同一个目录
<mappers>
<package name = "包名"/>
</mappers>

七、扩展

1. 分页PageHelper使用

//加入依赖
<dependency>
     <groupId>com.github.pagehelper</groupId>
     <artifactId>pagehelper</artifactId>
     <version>5.1.10</version>
   </dependency>
//在主配置文件中 数据库信息上 插入插件
<plugins>
   <plugin interceptor = "com.github">
</plugins>

//方法使用  
PageHelper.startPage(第几页,一页几个);