Mybatis配置文件(二)
mybatis映射文件
editor:simplewu
mybatis真正的核心是在映射文件,由于它的异常强大,如果拿它和相同功能的jdbc代码相比,你会发现它省掉了将近95%的代码。
mybatis实体类映射文件
mybatis有一下几个*元素
select:映射查询语句
<select id="findall" resulttype="com.simple.mybatis.entitys.employee"> select * from tal_employee </select>
insert:映射插入语句
使用#{参数属性名}赋值
<insert id="saveemp" parametertype="com.simple.mybatis.entitys.employee"> insert into tal_employee(last_name,email,gender) values(#{lastname},#{email},#{gender}) </insert>
我们结合第一章,使用之前与数据库互交的方式: 增删改必须提交事务:sqlsession.commit(); 使用xml映射文件方式来在执行方法时,由于是通过字符串方式来调用方法,对类型的约束也不是强制性的,可读性较差,这是早期ibatis的调用方式。除此之外mybatis还提供另外两种实现方式 mybatis注解方式 @delete:用来修饰使用删除语句的方法。 public interface employeeannotation {
} 然后我们需要在mybatis主配置文件中映射这个注解接口 使用注解虽然更加方便,但是配置复杂sql语句时较为复杂。所以很多时候采用两种相结合的方式。 mybatis接口编程 我们首先添加一个接口 实体类映射文件命名空间(namespace)必须对应接口全名,并且里面的方法需要对应里面增删改查标签id完成绑定 并且必须在mybatis主配置文件中加载这个映射文件 使用方式: 获取插入后的自动增长主键 usegeneratedkeys参数只针对 insert 语句生效,默认为 false。当设置为 true 时,表示如果插入的表以自增列为主键,则允许 jdbc 支持自动生成主键,并可将自动生成的主键返回。 keyproperty是要封装给parametertype="com.simple.mybatis.entitys.employee中的主键id属性名 mybatis参数规则 一个参数时: 直接使用#{xxx}来访问参数即可。参数名称任意。例如#{a},#{b}都可以访问参数值。如果是集合(collection,list,set)类型,使用集合名称小写作为key值。 必须接口方法: 映射文件: 在这里可以看到我们是没有给这个赋值的,#{id}我这个属性名也不叫id而是emp。所以一个参数是名字可以任意如果是传入的集合类型 传入map参数时取值: 我们这里取值是empid,这想想都知道创建一个map.put(“empid”,1)作为参数传入方法调用就行了 多个参数时: mybatis中,除了可以使用#{}来获取参数的值意外,还可以使用${}来获取参数的值。 区别:#{}:会以预编译的方式,将参数生成到sql语句中。${}:会直接将值生成到sql语句。 大多数情况下,我们都是以#{}来获取参数,但是有些地方不支持占位符的地方那么就可以使用${}来获取参数,比如表名。 resulttype返回类型 resultmap标签介绍 resultmap的常用子标签 前面我们的案例我们数据库的字段与实体类的属性基本上一致,或者不一致使用取别名方案解决,可是每条语句都去取别名是非常麻烦的,resultmap这个标签就很好的解决数据库与实体类字段不对应的问题 我们新创建一个部门表: 对应实体类: 如果我们查询语句直接使用resulttype="com.simple.mybatis.entitys.dept那么毫无疑问我们的实体类中名字不对应是赋值为null的,我们可以resultmap映射实体类与数据库的对应关系 关系映射 在数据库中,许多数据是分布在多个表中的,有时候需要将多个表的数据关联起来进行查询。那么在orm框架中,我们需要处理数据表的映射关系。 常见的映射关系: result方式映射属性 这种方式并不推荐,没有什么重用性 association映射(分步查询) 多对一,查询员工获取员工中的部门: collection查询 一对多,获取部门同时部门中员工也获取: collection嵌套查询 一对多分布查询 关联查询和分步查询的区别: 延迟加载 刚才分布查询是一次将结果查询出来,为了提高效率,mybatis还支持延迟加载技术,等需要用到对象时才进行查询。 在mybatis主配置文件中配置: 设置级联延迟加载<update id="updateemp" parametertype="com.simple.mybatis.entitys.employee">
update tal_employee set last_name=#{lastname},email=#{email},gender=#{gender} where id=#{id}
</update>
<delete id="deleteemp" parametertype="integer">
delete from tal_employee where id=#{id}
</delete>
<resultmap type="com.simple.mybatis.entitys.employee" id="employee">
<id property="id" column="id"/>
<result property="lastname" column="last_name"/>
<result property="email" column="email"/>
<result property="gender" column="gender"/>
</resultmap>
<!-- 返回外部resultmap格式的类型。-->
<select id="findall" resultmap="employee">
select id,last_name as lastname,email,gender from tal_employee
</select>
sqlsession.selectlist("命名空间.select标签id");
sqlsession.selectone("命名空间.select标签id");
sqlsession.update("命名空间.update标签id", "object类型参数");
sqlsession.delete("命名空间.delete标签id", "object类型参数");
sqlsession.insert("命名空间.insert标签id", "object类型参数");
@select("select id,last_name as lastname,email,gender from tal_employee")
list @insert("insert into tal_employee(last_name,email,gender) values(#{lastname},#{email},#{gender})")
int saveemp(employee employee);
@update("update tal_employee set last_name=#{lastname},email=#{email},gender=#{gender} where id=#{id}")
boolean updateemp(employee employee);
@delete("elete from tal_employee where id=#{id}")
long deleteemp(integer id);
<!-- 映射注解类 -->
<mapper class="com.simple.mybatis.dao.employeeannotation"/>
@test
public void testannotation(){
sqlsession session = sqlsessionfactory.opensession();
employeeannotation employeeannotation = session.getmapper(employeeannotation.class);
employee employee = new employee("测试注解增加", "email", "男");
employeeannotation.saveemp(employee);
//提交事务
session.commit();
session.close();
}
public interface employeemapper {
list<employee> findall();
int saveemp(employee employee);
boolean updateemp(employee employee);
long deleteemp(integer id);
}
<?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="com.simple.mybatis.dao.employeemapper">
<resultmap type="com.simple.mybatis.entitys.employee" id="employee">
<id property="id" column="id"/>
<result property="lastname" column="last_name"/>
<result property="email" column="email"/>
<result property="gender" column="gender"/>
</resultmap>
<!-- 返回外部resultmap格式的类型。-->
<select id="findall" resultmap="employee">
select id,last_name as lastname,email,gender from tal_employee
</select>
<insert id="saveemp" parametertype="com.simple.mybatis.entitys.employee">
insert into tal_employee(last_name,email,gender) values(#{lastname},#{email},#{gender})
</insert>
<update id="updateemp" parametertype="com.simple.mybatis.entitys.employee">
update tal_employee set last_name=#{lastname},email=#{email},gender=#{gender} where id=#{id}
</update>
<delete id="deleteemp" parametertype="integer">
delete from tal_employee where id=#{id}
</delete>
</mapper>
<mappers>
<mapper resource="com/simple/mybatis/entitys/employeemapper.xml" />
</mappers>
@test
public void test4(){
sqlsession session = sqlsessionfactory.opensession();
//获取接口。这个接口mybatis会帮我创建代理实现类完成接口与xml映射的绑定
employeemapper employeemapper = session.getmapper(employeemapper.class);
employeemapper.deleteemp(1);
session.commit();
session.close();
}
<insert id="saveempgetkey" parametertype="com.simple.mybatis.entitys.employee"
usegeneratedkeys="true" keyproperty="id"
>
insert into tal_employee(last_name,email,gender) values(#{lastname},#{email},#{gender})
</insert>
@test
public void saveempgetkey(){
sqlsession session = sqlsessionfactory.opensession();
employeemapper employeemapper = session.getmapper(employeemapper.class);
employee employee = new employee("自动封装主键", "email", "男");//增加之前主键没赋值
employeemapper.saveempgetkey(employee);
session.commit();//提交事务
system.out.println("增加后主键有值: " + employee.getid());
session.close();//关闭资源
}
long deleteemp(integer emp);
<delete id="deleteemp" parametertype="integer">
delete from tal_employee where id=#{id}
</delete>
//接口有方法:long deleteemp(map<string, object> map);
<delete id="deleteemp" parametertype="map">
delete from tal_employee where id=#{empid}
</delete>
{}和${}
create table tal_dept(
d_id int primary key auto_increment,
d_name varchar(50)
);
public class dept {
private integer id;
private integer name;
}
<!--配置返回结果,配置数据库字段与类属性的映射-->
<resultmap type="com.simple.mybatis.entitys.dept" id="deptresult">
<id column="d_id" property="id"/>
<result column="d_name" property="name"/>
</resultmap>
<!--使用resultmap使用指向上面返回结果的id-->
<select id="getdeptone" parametertype="integer" resultmap="deptresult">
select * from tal_dept where d_id = #{id}
</select>
<resultmap type="com.simple.mybatis.entitys.employee" id="employeeordept">
<id property="id" column="id"/>
<result property="lastname" column="last_name"/>
<result property="email" column="email"/>
<result property="gender" column="gender"/>
<!-- 指定employee中dept对象属性 -->
<result property="dept.id" column="d_id"/>
<result property="dept.name" column="d_name"/>
</resultmap>
<select id="getemployeeordeptall" resultmap="employeeordept">
select * from tal_employee e inner join tal_dept d on e.d_id=d.d_id
</select>
<resultmap type="com.simple.mybatis.entitys.employee" id="employeeordept">
<id property="id" column="id"/>
<result property="lastname" column="last_name"/>
<result property="email" column="email"/>
<result property="gender" column="gender"/>
<!-- property指定实体类中对象dept 指定发过去的参数column="d_id"
select指定com.simple.mybatis.dao.deptmapper映射文件中getdeptone查询方法
-->
<association property="dept" column="d_id"
select="com.simple.mybatis.dao.deptmapper.getdeptone"></association>
</resultmap>
<!--resultmap指定使用上面定义的返回结果-->
<select id="getemployeeordeptall" resultmap="employeeordept">
select * from tal_employee e inner join tal_dept d on e.d_id=d.d_id
</select>
<!--部门映射-->
<resultmap type="com.simple.mybatis.entitys.dept" id="deptresult">
<id column="d_id" property="id"/>
<result column="d_name" property="name"/>
<!--property指定dept中集合属性名 oftype指定集合中属性类型 -->
<collection property="employees" oftype="com.simple.mybatis.entitys.employee" >
<id property="id" column="id"/>
<result property="lastname" column="last_name"/>
<result property="email" column="email"/>
<result property="gender" column="gender"/>
</collection>
</resultmap>
<select id="getdeptall" resultmap="deptresult">
select * from tal_dept d left join tal_employee e on d.d_id = e.d_id
</select>
<resultmap type="com.simple.mybatis.entitys.dept" id="deptoremployee">
<id column="d_id" property="id"/>
<result column="d_name" property="name"/>
<!--select指定com.simple.mybatis.dao.employeemapper映射文件中的getemployeebydeptid-->
<collection property="employees" column="d_id" oftype="com.simple.mybatis.entitys.employee"
select="com.simple.mybatis.dao.employeemapper.getemployeebydeptid">
</collection>
</resultmap>
<!--com.simple.mybatis.dao.employeemapperxml中方法-->
<select id="getemployeebydeptid" parametertype="integer" resulttype="com.simple.mybatis.entitys.employee">
select * from tal_employee where d_id = #{id}
</select>
<!– 通过全局配置文件设置延迟加载-->
<settings>
<!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。 -->
<setting name="lazyloadingenabled" value="true"/>
<!-- 当启用时,有延迟加载属性的对象在被调用时将会完全加载任意属性。否则,每种属性将会按需要加载。 -->
<setting name="aggressivelazyloading" value="false"/>
</settings>
<!– 设置延迟加载属性-->
<association fetchtype="lazy"/>