mybatis是持久层框架(不完全的ORM框架)。
mybatis入门门槛不高,学习成本低,可以让程序员把精力放到SQL语句上,对sql语句优化非常方便,适用于需求变化较多的项目,比如互联网项目。
1.在mybatis中数据库没有连接池,每次请求都会重新创建。 mybatis使用线程池
2.用传统的方式写的dao包方法中,sql语句是写死在代码中,preparedStatement 中的设置的参数也是写的死不利于程序后期维护。mybatis可以把这些内容都在xml文件中进行配置。
SqlMapConfig.xml中由下列标签组成:
这些标签都包在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文件中遵顼一下规范:
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>