MyBatis映射文件

MyBatis映射文件

简介

  1. MyBatis 的真正强大在于它的映射语句,也是它的魔力所在。由于它的异常强大,映射器的 XML 文件就显得相对简单。如果拿它跟具有相同功能的 JDBC 代码进行对比,你会立即发现省掉了将近 95% 的代码。MyBatis 就是针对 SQL 构建的,并且比普通的方法做的更好。

  2. SQL 映射文件有很少的几个顶级元素(按照它们应该被定义的顺序):

  • cache – 给定命名空间的缓存配置。

  • cache-ref – 其他命名空间缓存配置的引用。

  • resultMap – 是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。

  • parameterMap – 已废弃!老式风格的参数映射。内联参数是首选,这个元素可能在将来被移除,这里不会记录。

  • sql – 可被其他语句引用的可重用语句块。

  • insert – 映射插入语句

  • update – 映射更新语句

  • delete – 映射删除语句

  • select – 映射查询语句

mappers映射器

(1)作用:用来在mybatis初始化的时候,告诉mybatis需要引入那些Mapper映射文件。

(2)Mapper逐个注册SQL映射文件:

  • resource:引入类路径下的文件
  • url:引入网络路径或者是磁盘路径下的文件
  • class:引入Mapper接口

如果有SQL映射文件,要求Mapper接口与SQL映射文件同名同位置,如果没有SQL映射文件,使用注解在接口的方法上写SQL语句。

<mappers>
		<mapper resource="EmployeeMapper.xml" />
		<mapper class="mybatis.mapper.EmployeeMapper"/>
</mappers>

如果使用批量注册,这种方式要求SQL映射文件名必须和接口名相同并且在同一目录下。

<mappers>
		<package name="mybatis.mapper.EmployeeMapper"/>
</mappers>

MyBatis——CRUD(增删改查)

(1)准备工作

创建数据库表Employee、导包、创建employee类、设置主配置文件mybatis_config.xml、创建映射文件、将log4j.xml复制到config文件夹中。

(2)创建接口EmployeeMapper

(3)查询

①Mapper接口方法

/**
	 * 根据员工id获取员工对象
	 		id:映射文件中SQL语句片段的表示,必须唯一
			resultType:返回结果类型(要将数据库查询的结果集封装为什么类型,resultType就应该定义为什么类型)
 */
Employee getEmployeeById(Integer id);

②Mapper映射文件

<mapper namespace="mybatis.mapper.EmployeeMapper">
		<!-- 根据员工的id获取员工对象 -->
		<select id="getEmployeeById" resultType="employee">
			select id, last_name,gender,descr from employee where id = #{id}
		</select>
</mapper>

(4)添加

①Mapper接口方法

/**
	 * 	新增
	 * 	如果需要返回值:常用的类型Integer,Long,Boolean
*/
void insertEmployee(Employee emp);

②Mapper映射文件

主键生成方式

  1. 支持主键自增,例如MySQL数据库

  2. 不支持主键自增,例如Oracle数据库

需求: 插入一条新数据,立马查询这条数据。

(1)若数据库支持自动生成主键的字段(比如 MySQL 和 SQL Server),则可以设置 useGeneratedKeys=”true”,然后再把 keyProperty 设置到目标属性上。(如果没有先获取主键值,那么先插入一条数据立马查询这条数据是查不到的

<insert id="insertEmployee" 	parameterType="mybatis.beans.Employee"  
			databaseId="mysql"
			useGeneratedKeys="true"
			keyProperty="id">
		insert into tbl_employee(last_name,email,gender) values(#{lastName},#{email},#{gender})
</insert>

(2)而对于不支持自增型主键的数据库(例如 Oracle),则可以使用 selectKey 子元素:selectKey 元素将会首先运行,id 会被设置,然后插入语句会被调用。

<insert id="insertEmployee" 
		parameterType="mybatis.beans.Employee"  
			databaseId="oracle">
		<selectKey order="BEFORE" keyProperty="id" 
                                       resultType="integer">
			select employee_seq.nextval from dual 
		</selectKey>	
		insert into orcl_employee(id,last_name,email,gender) values(#{id},#{lastName},#{email},#{gender})
</insert>
<mapper namespace="mybatis.mapper.EmployeeMapper">
		<!-- 
		新增员工
			-parameterType:指定传递的参数类型,可以使用别名,也可以省略,Mybatis会自动推断出参数的类型
			-接收参数的时候,使用#{对象的属性名}   
			注意:在映射文件中,不要以;结束
	-->
	<insert id="insertEmployee" 
			parameterType="Employee" 
			useGeneratedKeys="true" 
			keyProperty="id">
		insert into tbl_employee(last_name,gender,descr) values(#{lastName},#{gender},#{descr})
	</insert>
</mapper>

(5)删除

①Mapper接口方法

/**
	 * 	删除
 */
void deleteEmployeeById(Integer id);

②Mapper映射文件

<mapper namespace="mybatis.mapper.EmployeeMapper">
    <!-- 删除员工 -->
        <delete id="deleteEmployeeById">
            delete from tbl_employee where id = #{id}
        </delete>
</mapper>

(6)更新

①Mapper接口方法

/**
	 * 	修改
*/
void updateEmployee(Employee emp);

②Mapper映射文件

<mapper namespace="mybatis.mapper.EmployeeMapper">
    <!-- 更新员工 -->
        <update id="updateEmployee">
            update 
                tbl_employee
            set
                last_name = #{lastName},
                gender = #{gender},
                descr = #{descr}
            where 
                id = #{id}	
        </update>
</mapper>

(7)根据员工id和姓名获取员工对象

①Mapper接口方法

Employee getEmployeeByIdAndLastName(Integer id,String lastName);

②Mapper映射文件

<mapper namespace="mybatis.mapper.EmployeeMapper">
    <!-- 根据员工id和姓名获取员工 -->
	<select id="getEmployeeByIdAndLastName" resultType="Employee">
		select id,last_name,gender,descr from tbl_employee  
			where id = #{param1} and last_name=#{param2}
			<!-- where id = #{0} and last_name=#{1} -->
			<!-- where id = #{id} and last_name=#{lastName} -->
	</select>
</mapper>

(8)测试类

注意事务:如果获取session的时候通过sqlSessionFactory.openSession(true),则不需要手动提交;

如果通过sqlSessionFactory.openSession()获取,则需要通过session.commit()手动提交事务。

public class TestCRUD {
	
	private SqlSession sqlSession;
	
	@Before//在所有单元测试方法执行之前执行
	public void init() throws Exception {
		//定义配置文件
		String resource = "mybatis-conf.xml";
		//建立读取文件的流
		InputStream inputStream = Resources.getResourceAsStream(resource);
		//获取SqlSessionFactory
		SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
		//获取SqlSession
		sqlSession = sqlSessionFactory.openSession();//	如果不加参数,事务需要手动提交
		//sqlSession = sqlSessionFactory.openSession(true);//创建的SqlSession事务自动提交的
	}
	/**
	 * 	测试新增
	 */
	@Test
	public void testInsert() throws Exception {
		//获取接口的代理实现类实例
		EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
		Employee emp = new Employee(null, "张三丰", 1, "武当派掌门");
		employeeMapper.insertEmployee(emp);
		sqlSession.commit();
	}
	/**
	 * 	测试删除
	 */
	@Test
	public void testDelete() {
		EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
		employeeMapper.deleteEmployeeById(3);
		sqlSession.commit();
	}
	
	/**
	 * 	测试更新
	 */
	@Test
	public void testUpdate() {
		EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
		Employee emp = new Employee(4, "张无忌", 1, "明教教主");
		employeeMapper.updateEmployee(emp);
		sqlSession.commit();
	}
	
    /**
	 * 	测试查询
	 */
	@Test
	public void testSelect() {
		EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
		Employee employee = employeeMapper.getEmployeeById(5);
		System.out.println(employee);
	}
    /**
	 * 	测试传递多个参数
	 */
	@Test
	public void testGetEmployeeByIdAndLastName() {
		EmployeeMapper employeeMapper = sqlSession.getMapper(EmployeeMapper.class);
		Employee employee = employeeMapper.getEmployeeByIdAndLastName(2, "李四");
		System.out.println(employee);
	}	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值