mybatis基础知识(入门指南)

mybatis是什么?

mybatis是持久层框架(不完全的ORM框架)。
mybatis入门门槛不高,学习成本低,可以让程序员把精力放到SQL语句上,对sql语句优化非常方便,适用于需求变化较多的项目,比如互联网项目。

为什么要学习mybatis?

1.在mybatis中数据库没有连接池,每次请求都会重新创建。 mybatis使用线程池
2.用传统的方式写的dao包方法中,sql语句是写死在代码中,preparedStatement 中的设置的参数也是写的死不利于程序后期维护。mybatis可以把这些内容都在xml文件中进行配置。

mybatis框架的执行过程

  1. 配置mybatis的配置文件(SqlMapConfig.xml)
  2. 通过配置文件,加载mybatis的运行环境,创建SqlSessionFactory会话工厂
  3. 通过SqlSessionFactory会话工厂来创建sqlsession
  4. 调用sqlsession的操作数据库方法
  5. 释放资源,关闭sqlsession

mybatis的核心配置文件(SqlMapConfig.xml)

SqlMapConfig.xml中由下列标签组成:

  • properties 属性:可以加载properties配置文件的信息
  • settings 设置:可以设置mybatis的全局属性
  • typeAliases 类型命名
  • typeHandlers 类型处理器
  • objectFactory 对象工厂
  • plugins 插件
  • environments 环境
  • environment 环境变量
  • transactionManager 事务管理器
  • dataSource 数据源
  • databaseIdProvider 数据库厂商标识
  • mappers 映射器

这些标签都包在configuration标签中

下面是SqlMapConfig.xml配置文件中的内容




	
	
        
    
    
    
		
		 
	
	
	
		
			
			
				
				
				
				
			
		
	
	
	
		
		
		
	
   

使用工厂模式创建sqlsession并且操作数据库

		//获取SqlMapConfig.xml配置文件
		String resource = "SqlMapConfig.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		//创建会话工厂,要传入mybitis的配置信息
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		//得到sqlsession对象
		SqlSession sqlSession = sqlSessionFactory.openSession();
		//sqlsession对象可以通过Execute执行器来执行sql语句
		//第一个参数statementid,第二个参数是指占位符的参数
		emp emp = sqlSession.selectOne("cn.swjd.mapper.StudentMapper.findEmpById", id);
		//最后释放资源
		sqlSession.close();

empMepper.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.xml文件,相当于mapper.xml文件的唯一标识,为了使用代理模式,和接口的全限定类名保持一致
<mapper namespace="com.mybatis.interfaces.empMapper">
//resultMap :结果的封装设置,(property="first_name")属性对应表中字段(column="first_name")
	 <resultMap type="emp" id="emp">
		//表中主键字段使用id来设置对应
		<id property="employee_id" column="employee_id"/>
		//其他字段统一使用result 
		<result property="first_name" column="first_name"/>
		<result property="last_name" column="last_name"/>
		<result property="email" column="email"/>
		<result property="phone_number" column="phone_number"/>
		<result property="hire_date" column="hire_date"/>
		<result property="job_id" column="job_id"/>
		<result property="salary" column="salary"/>
		<result property="comm" column="comm"/>
		<result property="manager_id" column="manager_id"/>
		<result property="department_id" column="department_id"/>
		<collection property="departments" column="department_id" select="com.mybatis.interfaces.departmentsMapper.selectByEmpDepartmentsId"></collection>
	</resultMap> 
	<select id="selectEmpById" parameterType="int" resultType="cn.mybatis.po.emp"> 
		select * from employees where employee_id= #{id}
	</select>
	
	<select id="selectAllemp"  resultType="cn.mybatis.po.emp"> 
		select * from employees
	</select>
	
	<select id="dongtai1" parameterType="emp" resultMap="emp">
		select * from 
	</select>
	
	<select id="selectEmpAndDepartments" resultMap="emp">
		select * from employees
	</select>
	
	<insert id="addEmp" parameterType="cn.mybatis.po.emp">
		insert into employees value(#{employee_id},#{first_name},#{last_name},#{email},#{phone_number},#{hire_date},#{job_id},#{salary},#{comm},#{manager_id},#{department_id})
	</insert>
	
	<update id="updateEmp" parameterType="cn.mybatis.po.emp">
		update employees set first_name = #{first_name} where employee_id = #{employee_id}
	</update>
	
	<delete id="delEmpById" parameterType="int">
		delete from employees where employee_id = #{employee_id}
	</delete>
</mapper>

empMapper.java文件

package com.mybatis.interfaces;

import java.util.List;

import cn.mybatis.po.emp;

public interface empMapper {
	/**
	 * 查找所有的emp
	 * @return  emp集合
	 * @throws Exception
	 */
	public List<emp> selectAllemp() throws Exception;
	/**
	 * 根据id查找emp
	 * @param id  emp id
	 * @return  emp 集合(只有一个)
	 * @throws Exception
	 */
	public List<emp> selectEmpById(int id) throws Exception;
	/**
	 * 添加emp
	 * @param emp emp 实体类
	 * @throws Exception
	 */
	public void addEmp(emp emp) throws Exception;
	/**
	 * 删除员工根据id
	 * @param id 
	 * @throws Exception
	 */
	public void delEmpById(int id) throws Exception;
	/**
	 * 跟新emp 
	 * @param emp emp 实体类
	 * @throws Exception
	 */
	public void updateEmp(emp emp) throws Exception;
	
	public List<emp> selectEmpAndDepartments() throws Exception;
}

mybatis基本搭建完成,可以使用mapper代理模式来开发了

重点知识点

1. parameterType和resultType

 parameterType:在映射文件中通过parameterType指定输入参数类型
 resultType:在映射文件中通过resultType指定输出结果类型

2.#{}和${}

 #{}表示一个占位符
 ${}标识拼接符号,会引起sql注入,不建议使用

3.selectone和selectlist

selectone:表示查询出一条记录进行映射,使用selectone可以实现的使用selectlist也可以实现,但是list中只有一条数据
selectlist:查询出一个列表进行映射,如果是多条记录则不可以使用selectone

4.mybatis的原始Dao方法和mapper代理方法

原始Dao方法:
需要编写Doa接口和实现类,并且在实现类中注入SqlsessionFactory
mapper代理方式:
只编写mapper接口(dao接口)
在编写mapper.xml和mapper.java文件中遵顼一下规范:

  1. namespace是.java的全路径
  2. .xml文件中的statementid和.java中的方法名称一致
  3. .xml文件中的parameterType和.java文件中输入参数类型保持一致
  4. .xml文件中的resultType和.java文件中返回值参数类型保持一致

5.动态SQL

<select id="dongtai1" parameterType="String" resultMap="emp">
		select * from employees where 1=1
		<if test="first_name!=null">
			and first_name != #{};
		</if>
	</select>
<select id="dongtai1" parameterType="String" resultMap="emp">
		select * from employees where 1=1
		<where>
		    <if test="age > 0">
		        and age = #{age}
		    </if>
		    <if test="name != null and name != ''">
		        and name like concat('%',#{age},'%')
		    </if>
   		 </where>
	</select>
<select id="dongtai1" parameterType="String" resultMap="emp">
		select * from employees where 1=1
		<choose>
			<when test=" id != null and id !='' ">
				where id >= #{id}
			</when>
			<when test=" birth != null and birth !='' ">
				where birth > #{birth}
			</when>
			<otherwise>
				where 1 = 1
			</otherwise>
		</choose>
	</select>

6.< sql>和< include>的使用
sql和include通常都是一起使用的,sql可以存放一些常用的sql语句片段,需要用到时,使用include标签引入,方便代码的扩展,通常sql不放多表查询的语句。

测试类

@Test
	public void testselectEmpById() throws Exception {
		empMapper en = sqlSession.getMapper(empMapper.class);
		List<emp> list = en.selectEmpById(1);
		for (emp emp : list) {
			System.out.println(emp);
		}
		sqlSession.close();
	}

xml配置

	<sql id="idAndName">
		employee_id,last_name
	</sql>
	<select id="selectEmpById" parameterType="int" resultType="cn.mybatis.po.emp"> 
		select <include refid="idAndName"></include> from employees where employee_id= #{id}
	</select>

查询结果
mybatis基础知识(入门指南)_第1张图片

你可能感兴趣的:(mybatis基础知识(入门指南))