需求:查询name中包含"精"的数据.并且按照年龄降序排列
@Test
public void test9(){
SqlSession sqlSession = sqlSessionFactory.openSession(true);
DemoUserMapper mapper = sqlSession.getMapper(DemoUserMapper.class);
Map<String,Object> map=new HashMap<>();
map.put("name","精");
map.put("column","age");
List<DemoUser> demoUsers=mapper.like(map);
System.out.println(demoUsers);
}
①$方式
<select id="like" resultType="com.jt.pojo.DemoUser">
select * from demo_user where name like '%${name}%' order by ${column} desc ;
</select>
②%需要引号包裹
<select id="like" resultType="com.jt.pojo.DemoUser">
select * from demo_user where name like "%"#{name}"%" order by ${column} desc ;
</select>
*这里只展示两种,方式很多 *
注意事项:MyBatis中的sql最好小写,因为不同的系统对于大小写不敏感
转大小写快捷键:ctrl+shift+u
需求:将name为小乔/大乔/王昭君的年龄改为25岁,性别男
代码实现
@Test/*11.将name为小乔/大乔/王昭君的年龄改为18岁,性别男*/
public void test11(){
SqlSession sqlSession = sqlSessionFactory.openSession(true);
DemoUserMapper mapper = sqlSession.getMapper(DemoUserMapper.class);
List list=new ArrayList();
list.add("小乔");
list.add("大乔");
list.add("王昭君");
Map<String,Object> map=new HashMap<>();
map.put("names", list);
map.put("age", 25);
map.put("sex", "男");
mapper.update2(map);
}
<update id="update2">
update demo_user set age=#{age} ,sex=#{sex} where name in(
<foreach collection="names" item="name" separator=",">
#{name}
</foreach>
)
</update>
void update2(Map<String, Object> map);
以上操作太麻烦,解决方案有三种
实现代码:
mysql-config.xml文件配置内容
<!--配置别名-->
<typeAliases >
<typeAlias type="com.jt.pojo.DemoUser" alias="DemoUser"></typeAlias>
</typeAliases>
** mapper映射文件中sql语句内容**
<select id="find1" resultType="DemoUser">
select * from demo_user where id=#{id}
</select>
**注意:核心配置文件的顺序 **
The content of element type "configuration" must match "(properties?,settings?,typeAliases?,typeHandlers?,objectFactory?,objectWrapperFactory?,reflectorFactory?,plugins?,environments?,databaseIdProvider?,mappers?)".
一个个编辑别名标签也很麻烦,别名标签只对某个类有效,所以可以在配置文件中配置package标签,配置包路径
<typeAliases >
<!--别名标签-->
<!-- <typeAlias type="com.jt.pojo.DemoUser" alias="DemoUser"></typeAlias>-->
<!--配置包路径-->
<package name="com.jt.pojo"/>
</typeAliases>
原理是动态拼接:包路径+.类名
@Alias("类的别名") 不常用
<!--简化sql标签-->
<sql id="demo_user_sql">
select * from demo_user
</sql>
<select id="find1" resultType="DemoUser">
<include refid="demo_user_sql"/>where id=#{id}
</select>
利: ** ** 弊:
1.节省xml文件的大小 1.sql只能抽取公共的sql语句,局限性大
2.代码结构相对简单 2.如果大量使用sql标签,可读性太差
规则:where与if标签通常一起使用,where标签可以去除多余的and和or,if的test属性为判断条件
判断对象中不为空的属性当作where条件
情景:用户并不是上传所有字段属性值,可能只有name,只有age
<select id="find2" resultType="DemoUser">
select * from demo_user
<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>
规则:判断对象中不为空的属性当作set条件,set标签可以把多余的逗号去除
情景:用户并不是修改所有字段属性值,可能只有name,只有age
<update id="update">
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>
需求:条件查询,如果有name那么按照name查询,如果没有,按照sex查询
**MyBatis的分支结构 **
<select id="find3" resultType="DemoUser">
select * from demo_user
where
<choose>
<when test="name!=null">name=#{name}</when>
<otherwise>sex=#{sex}</otherwise>
</choose>
</select>
解释:
choose代表分支结构,只有一个条件有效
when:和if类似
otherwise:上述的条件无效时,此处条件生效
建表→编辑Dept pojo类→mapper接口→映射文件→配置核心配置文件中的mapper
注意pojo类要实现序列化接口
resultType注意,结果集中的字段名称与属性名称一致时,才会实现自动的数据封装
resultMap,结果集中的字段名称与属性名称不一致时,也可以实现自定义的数据封装
resultMap标签用来自定义映射关系
** 建表(dept)**
pojo类
package com.jt.pojo;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import java.io.Serializable;
@Data
@Accessors(chain = true)
@NoArgsConstructor
@AllArgsConstructor
public class Dept implements Serializable {
private Integer deptId;
private String deptName;
}
mapper接口
public interface DeptMapper {
List<Dept> findAll(Dept dept);
}
** 映射文件**
<select id="findAll" resultMap="deptDp">
select * from dept
</select>
<resultMap id="deptDp" type="Dept">
<id column="dept_id" property="deptId"/>
<result column="dept_name" property="deptName"/>
</resultMap>
test类
public class TestMybatis {
SqlSessionFactory sqlSessionFactory;
@Test
@BeforeEach
public void init() throws IOException {
//1.指定资源文件
String resource="mybatis/mybatis-config.xml";
InputStream inputstream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputstream);
}
@Test
public void test1(){
SqlSession sqlSession = sqlSessionFactory.openSession(true);
DeptMapper mapper = sqlSession.getMapper(DeptMapper.class);
Dept dept= new Dept();
List<Dept> list=mapper.findAll(dept);
System.out.println(list);
sqlSession.close();
}
1.一对一
2.一对多
3.多对一
4.多对多
规则:一对一封装为对象,一对多封装成List
建表→编辑Emp pojo类→mapper接口→映射文件→配置核心配置文件中的mapper
注意pojo类要实现序列化接口
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_55740233/article/details/120482073
内容来源于网络,如有侵权,请联系作者删除!