目录
1.1 、在mybatis-config.xml文件里配置别名
1.2 、使用包路径xml映射文件配置--别名标签只对某个类有效
2.2.3 、SQL -- choose when otherwise
1 、别名配置
1.1 、在mybatis-config.xml文件里配置别名
xml映射文件 必须与接口一对一绑定
namespace:指定需要绑定的接口名称,不能重复。
<!--配置别名-->
<typeAliases>
<typeAlias type="com.jt.pojo.DemoUser" alias="DemoUser"></typeAlias>
</typeAliases>
1.2 、使用包路径xml映射文件配置--别名标签只对某个类有效
映射原理: 如果配置文件中定义了包路径,则映射对象时会自动的完成路径的拼接 resultType="com.jt.mapper.DemoUser"
需求: 如果项目中有多个POJO实体类,如果一个一个编辑别名标签,则更为繁琐. 所以Mybatis提供了别名包的功能.
例子:
com.jt.pojo.User,
com.jt.pojo.Dept,
com.jt.pojo.Order
原理说明: 可以设定公共的包路径 com.jt.pojo,如果设定了包路径.以后自动拼接类的全路径
<!--配置别名-->
<typeAliases>
<!-- <typeAlias type="com.jt.pojo.DemoUser" alias="DemoUser"></typeAlias>-->
<!-- package指定的是包路径的信息-->
<package name="com.jt.pojo"/>
</typeAliases>
2 、SQL配置
2.1 、简化SQL标签
<!-- 简化sql标签-->
<sql id="demo_user_sql">
select id,name,age,sex from demo_user
</sql>
<!--<select id="findAll" resultType="DemoUser">-->
<!-- select id,name,age,sex from demo_user-->
<!--</select>-->
<!-- include标签包含sql标签-->
<select id="findAll" resultType="DemoUser">
-- <include refid="demo_user_sql" /> where xxx=xxx
</select>
优势:使用sql标签可以节省xml文件的大小;代码的结构相对简单;
弊端:SQL只能抽取公共的sql语句--局限性稍大;如果大量的使用SQL标签,则代码的可读性较差;
2.2 、动态SQL
2.2.1 、if-where用法
业务需求:根据user对象查询数据,根据对象中不为null的属性,充当where条件实现动态查询。
//封装demouser的对象根据对象中不为null的属性查询
@Test
public void testFindWhere(){
SqlSession sqlSession = sqlSessionFactory.openSession();
DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
DemoUser demoUser=new DemoUser();
demoUser.setName("白骨精")
.setAge(5000)
.setSex("女");
List<DemoUser> list = demoUserMapper.findWhere(demoUser);
System.out.println(list);
sqlSession.close();
}
<!-- 动态的sql查询
思路:如果你的数据不为null。mybatis才会当做条件
if标签说明:
test:判断的条件 可以直接写属性
where标签:去除我们条件中多余的and或者是or的
if和where 几乎一起出现
-->
<select id="findWhere" resultType="DemoUser">
<include refid="demo_user_sql" />
<where>
<if test="name != null">name =#{name}</if>
<if test="age != null">and age =#{age}</if>
<if test="sex != null">and sex=#{sex} </if>
</where>
</select>
2.2.2 、 set标签用法
set标签说明: 去除set条件中多余的 ,号
/**
* 需求: 根据Id,动态的实现数据的更新.
*/
@Test
public void testUpdateSet(){
SqlSession sqlSession = sqlSessionFactory.openSession(true);
DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
DemoUser user = new DemoUser();
user.setId(1).setName("守山大使");
demoUserMapper.updateUser(user);
sqlSession.close();
}
<!--
规则: 根据对象中不为null的属性当做set条件
set标签说明: 去除set条件中多余的 ,号
-->
<update id="updateUser">
update demo_user
<set>
<if test="name !=null">name = #{name},</if>
<if test="age !=null">age = #{age},</if>
<if test="sex !=null">sex = #{sex}</if>
</set>
where
id = #{id}
</update>
2.2.3 、SQL -- choose when otherwise
如果存在name则按照name查询,否则按照sex查询
// 如果存在name则按照name查询,否则按照sex查询
@Test
public void testSelectCWO(){
SqlSession sqlSession = sqlSessionFactory.openSession(true);
DemoUserMapper demoUserMapper = sqlSession.getMapper(DemoUserMapper.class);
DemoUser demoUser = new DemoUser();
//demoUser.setName("守山大使");//DemoUser(id=1, name=守山大使, age=4000, sex=男)
demoUser.setSex("男");//26条数据
List<DemoUser> list = demoUserMapper.selectCWO(demoUser);
System.out.println(list);
sqlSession.close();
}
<!-- 如果不想将全部的条件当做if的判断,则mybatis提供了分支结构Switch
当我们有多个条件,但是只想选择其中的一个条件来查询时使用,类似于java中的switch语句
choose代表分支结构 只有一个条件有效
when 指定判断的条件 和if类似
otherwise 如果上述的条件都不满足时该行代码有效
-->
<select id="selectCWO" resultType="DemoUser">
select * from demo_user
<where>
<choose>
<when test="name!=null"> name =#{name} </when>
<otherwise> sex=#{sex} </otherwise>
</choose>
</where>
</select>
3 、ResultMap用法
ORM思想: 对象关系映射. 属性: deptId,deptName 字段: dept_id,dept_name resultType说明: 当结果集中的字段名称,如果与属性的名称一致时, 才会实现自动的数据封装. resultMap="" 自定义的封装数据的结构
@Test
public void testFindDept(){
SqlSession sqlSession = sqlSessionFactory.openSession();
DeptMapper deptMapper = sqlSession.getMapper(DeptMapper.class);
List<Dept> list = deptMapper.findAll();
System.out.println(list);
sqlSession.close();
}
<!--自定义映射关系的
语法:
1.id标签代表主键 (每张表中都会有一个主键)
1.1.column: 代表结果集中的字段.
1.2.property: 对象中的属性
2.result 除了主键之外的配置信息
-->
<resultMap id="deptRM" type="Dept">
<id column="dept_id" property="deptId"/>
<result column="dept_name" property="deptName"/>
</resultMap>
4 、关联关系
一对一:例子:一个员工对应一个部门
一对多:例子:一个部门对应多个员工
多对多:例子:老师对应学生(一个老师对应对个学生,一个学生对应多个老师)>>多个一对多
创建dept表:
创建emp表:
一对一业务封装(一对一需要在代码层进行表示)
如果对一使用对象封装,如果对多使用集合封装
// 一对一需要在代码层进行表示——对象封装
// 如果是对一则使用对象封装,如果是对多则使用集合封装
// private Integer deptId;
private Dept dept; //一对一
//关联关系——一个部门对应多个员工
private List<Emp> emps;
/*
一对一:
规定:一个员工对应一个部门
选取方向:员工方
需求:需要在员工中完成部门对象封装
*/
@Test
public void testOneToOne(){
SqlSession sqlSession = sqlSessionFactory.openSession();
EmpMapper empMapper = sqlSession.getMapper(EmpMapper.class);
List<Emp> list=empMapper.findAll();
System.out.println(list);
sqlSession.close();
}
<select id="findAll" resultType="Emp">
select * from emp
</select>
员工与部门如何关联:
select * from emp ,dept where dept.dept_id =emp.dept_id
select * from emp left join dept on emp.dept_id=dept.dept_id