MyBatis-映射文件

1.增删改标签

1>id:命名空间的唯一标识符,绑定目标方法

2>timeout:由Spring来做

3>statementType:执行SQL语句

4>useGenerateKeys:

5>keyProperty:

实现获取到插入数据后的自增id;

2.单个参数: mybatis不会做特殊处理,直接使用#{参数名}:取出参数值。

   多个参数: mybatis会做特殊处理。

   多个参数会被封装成一个map,

  • key:param1…paramN
  • value:传入的值

#{}就是从map中获取指定的key的值

<!--
	sql映射文件的sql配置
	因为传递了多个参数,所以在使用的时候要记得使用param1。。。。paramN的取值方式进行取值。
-->
    <select id="getEmpByIdAndLastName" resultType="dao.Employee">
    select * from tbl_employee where id = #{param1} and last_name=#{param2}
  </select>

命名参数: 明确指定封装参数时map的key;@Param(“id”)

​ 多个参数会被封装成一个map,

  • key:使用@Param注解指定的值
  • value:参数值

#{指定的key}取出对应的参数值

/接口函数
public Employee getEmpByIdAndLastName(@Param("id") Integer id, @Param("lastName") String lastName);
<!--
	sql映射文件的sql配置
	因为传递了多个参数,并且使用了命名参数的规则,所以可以使用#{指定的key}取出对应的参数值的方式取值
-->
<select id="getEmpByIdAndLastName" resultType="dao.Employee">
    select * from tbl_employee where id = #{id} and last_name=#{lastName}
  </select>

POJO: 如果多个参数正好是我们业务逻辑的数据类型,我们就可以直接传入pojo;(使用对象传递的方式进行传递数据)

#{属性名}:取出传入pojo的值

//接口函数
public void updataEmp(Employee employee);
<!--
	sql映射文件的sql配置
	因为传递的是对象类型的数据,所以在取数据的时候就是用#{属性名}的方式进行取值
	并获取到修改数据的主键值
-->
<!--修改函数-->
<update id="updataEmp"  useGeneratedKeys="true" keyProperty="id">
        update tbl_employee
            set last_name=#{lastName},email=#{email},gender=#{gender}
            where id=#{id}
    </update>

Map: 如果多个参数不是业务模型中的数据,没有对应的pojo,不经常使用,为了方便,我们也可以传入map。

#{key}:取出map中对应的值

//接口函数
public Employee getEmpByMap(Map<String,Object> map);
<!--
	sql映射文件的sql配置
	因为传递的是一个map集合的对象,所以在获取数据的时候要使用#{key}取出map中对应的值
-->    
<select id="getEmpByMap" resultType="dao.Employee">
        select * from tbl_employee where id = #{id} and last_name=#{lastName}
    </select>
    @Test
    public void test5() throws IOException {
        SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
        //获取到的sqlSession不会自动提交
        SqlSession openSession = sqlSessionFactory.openSession();
        EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
        
        Map<String,Object> map=new HashMap<String, Object>();
        map.put("id",1);
        map.put("lastName","tom");
        Employee employee = mapper.getEmpByMap(map);
        System.out.println(employee);
        
        openSession.close();
    }

3.参数处理#与$取值的区别#

#{}:是以预编译的形势,将参数设置到sql语句中;与PreparedStatement;防止sql注入
${}:取出的值直接拼接在sql语句中;会有安全问题

大多数情况下,我们去参数的值都应该去使用#{};
原生jdbc不支持占位符的地方我们就可以使用${}进行取值
比如分表、排序。。;按照年份分表拆分
当想要从未知的表中查询信息时,就可以使用select * from ${xxx} where id=?   (from后不支持预编译)

4.返回数据

 

1>ResultType

对于简单数据类型,例如查询总记录数、查询某一个用户名这一类返回值是一个基本数据类型的,直接写Java中的基本类型即可。
如果返回的是一个对象或者集合,并且对象中的属性和查询的字段名是一一对应的,那么resultType也可以直接写一个对象。

2>ResultMap

resultMap只要用来解决属性名和字段名不一致以及一对多、一对一查询等问题,字段名不一致时,首先可以通过别名解决。

4.自定义结果集(resultMap):自定义每一列数据和javaBean的映射规则

<?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">
<mapper namespace="dao.EmployeeMapper">
    <!--type属性的值为封装的JavaBean的全类名,id用于唯一标识该resultMap-->
	<resultMap type="bean.Employee" id="MyEmp">
		<!--
			id:指定主键的封装规则,使用id标签定义主键底层会有优化
			column:指定数据库中表的字段名
			property:指定对应的javabean的属性
		-->
		<id column="id" property="id"/>	
		<!-- result标签定义普通列封装规则 -->
		<result column="last_name" property="lastName"/>
		<!-- 其他列可以不指定,不指定的列会自动封装,但是推荐只要指定resultMap就把全部的映射规则都写上 -->
		<result column="email" property="email"/>
		<result column="gender" property="gender"/>
	</resultMap>
	
	<!-- 这里resultMap属性的值为前面定义的resultMap的id -->
	<select id="getEmpById" resultMap="MyEmp">
		select * from tbl_employee where id = #{id}
	</select>
</mapper>

在全局配置文件mybatis-config.xml中不开启驼峰命名,进行下面的测试,查看能否将数据库中的last_name字段的值封装进 JavaBean 的 lastName 成员变量

public class MyBatisTest {

	// 获取SqlSessionfactory对象的方法
	public SqlSessionFactory getSqlSessionFactory() throws IOException {
		String resource = "mybatis-config.xml";
		InputStream inputStream = Resources.getResourceAsStream(resource);
		return new SqlSessionFactoryBuilder().build(inputStream);

	}

	@Test
	public void test() throws IOException {
		SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
		SqlSession openSession = sqlSessionFactory.openSession();
		try {
			EmployeeMapper mapper = openSession.getMapper(EmployeeMapper.class);
			Employee employee = mapper.getEmpById(1);
			System.out.println(employee);
		} finally {
			openSession.close();
		}
	}
}

由此可见,通过使用 resultMap 标签来自定义封装的规则,在不开启驼峰命名的时候也可以将 last_name字段的值封装进 JavaBean 的 lastName 变量中;
resultMap 标签就是用于定义 数据库表的字段名 与 JavaBean实体类的成员变量 的对应关系
(resultMap的更大作用应该是在于其内部的association标签和collection标签,这两个标签主要用于多表联合查询,以及discriminator鉴别器)

发布了27 篇原创文章 · 获赞 1 · 访问量 2007

猜你喜欢

转载自blog.csdn.net/yangyiyun199863/article/details/105060341
今日推荐