mybatis第二天02

1.映射文件之输入输出映射

1.1映射文件之输入映射类型(parameterType)

1.1.1简单类型

  当parameterType为简单类型时,我们只需要直接填写“int”、"double"等

入参类型是处于java.lang.*下类型的直接填写并且不区分大小写其中“String”是引用类型但是她也是直接先填写

根据用户id查询用户

映射文件的部分代码

 <!--
id :statement的id要求在命名空间内唯一,为了实现Mapper代理这里的id名称切记要和方法名一致
parameterType:入参类型简单类型直接填写并且不区分大小写
resultType:结果类型需要对应相应的Java类型
-->
<select id="findUserById" parameterType="Int" resultType="USER">
SELECT * FROM USER WHERE id=#{id}
</select>

测试代码:

 public class UserMapperTest {

     private SqlSessionFactory sqlSessionFactory;
@Before
public void setUp() throws Exception {
//1.给出全局配置文件的文件路径
String resource="SqlMapConfig.xml";
//2.读取文件返回一个输入流
InputStream inputStream= Resources.getResourceAsStream(resource);
sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); } @Test
public void testFindUserById() {
//1.创建sqlSession会话
SqlSession sqlSession = sqlSessionFactory.openSession();
//2.使用Mapper代理的方式创建接口实例(这个实例不是我们创建的而是由MyBatis创建的我们遵守规范即可)
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//3.调用实例方法得到封装好的对象
User user =userMapper.findUserById(1);
System.out.println(user);
sqlSession.close();
}
}

  根据用户名模糊查询用户

入参类型是处于java.lang.*下其中“String”是引用类型但是它也是直接先填写

部分映射文件代码:
  <!-- 根据用户名称模糊查询用户信息列表 -->
<!--
[${}]:表示拼接SQL字符串,即不加解释的原样输出
[${value}]:表示要拼接的是简单类型参数。
注意:
1、如果参数为简单类型时,${}里面的参数名称必须为value
2、${}会引起SQL注入,一般情况下不推荐使用。但是有些场景必须使用${},比如order by ${colname}
-->
<select id="findUsersByUsername" parameterType="String" resultType="user">
SELECT * FROM USER WHERE username like '%${value}%' </select>

测试代码:

 public class UserMapperTest {

     private SqlSessionFactory sqlSessionFactory;
@Before
public void setUp() throws Exception {
//1.给出全局配置文件的文件路径
String resource="SqlMapConfig.xml";
//2.读取文件返回一个输入流
InputStream inputStream= Resources.getResourceAsStream(resource);
sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); }
@Test
public void testFindUsersByUsername() {
//1.创建sqlSession会话
SqlSession sqlSession =sqlSessionFactory.openSession();
//2.使用Mapper代理的方式创建接口实例(这个实例不是我们创建的而是由MyBatis创建的我们遵守规范即可)
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
//3.调用实例方法得到封装好的对象
List<User> userList = userMapper.findUsersByUsername("小明");
System.out.println(userList);
sqlSession.close();
}
}

1.1.2POJO类型

添加用户:

parameterType应该为全类名但是我们在全局配置中配置了别名<package name="com.itheima.Po"/> 详情见上一篇介绍的别名设置
 <!--执行添加操作时因为数据库设置的主键自增策略,useGeneratedKeys=“true”表示数据库为主键自增策略 如果用户要自己添加主键时一定要确保数据库中有没有指定主键自增-->
<insert id="addUser" parameterType="user"
useGeneratedKeys="true" >
<!-- SELECT LAST_INSERT_ID()是用来查询主键的 keyProperty表示主键的列名 resultType表示主键返回的结果类型 order="AFTER"表示在插入操作执行后执行 -->
<selectKey keyProperty="id" resultType="int" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey> INSERT INTO USER (username,birthday,sex,address) VALUES(#{username},#{birthday},#{sex},#{address})
</insert>

测试代码:切记操作后提交事务

 public class UserMapperTest {

     private SqlSessionFactory sqlSessionFactory;
@Before
public void setUp() throws Exception {
//1.给出全局配置文件的文件路径
String resource="SqlMapConfig.xml";
//2.读取文件返回一个输入流
InputStream inputStream= Resources.getResourceAsStream(resource);
sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); }
@Test
public void testAddUser() {
//1.创建sqlSession会话
SqlSession sqlSession = sqlSessionFactory.openSession();
//2.使用Mapper代理的方式创建接口实例(这个实例不是我们创建的而是由MyBatis创建的我们遵守规范即可)
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user =new User();
user.setUsername("张三三");
user.setBirthday(new Date());
user.setSex("1");
user.setAddress("湖北省仙桃市西流河镇");
int result = userMapper.addUser(user);
//插入增删改只要对数据库中进行了改变那么就要提交事务,事务开启在openSession自动打开,也可以在函数中关闭openSession(false)传入false即可
sqlSession.commit();
System.out.println(result+","+user.getId());
sqlSession.close();
} }

1.1.3包装POJO类型(包装类型)

注意包装类型时参数的写法

包装类的参数写法是:所包装对象的对象名.属性名   ${user.username} #{user.sex}
 <!--如果是条件查询我们不知道用户会填写哪一个条件所以我们使用where标签和if标签,where标签会去掉第一个条件的AND如果没有条件则会省去where,if标签是属于判断作用,判断这个条件是否满足-->
<select id="findUserByIdList" parameterType="com.itheima.Po.UserPlus" resultType="user" >
SELECT * FROM USER
<where>
<if test="user.username!=null and user.username!=''">
AND username like '%${user.username}%'
</if>
<if test="user.sex!=null and user.sex!=''">
AND sex=#{user.sex}
</if>
</where> </select>

测试代码:

 public class UserMapperTest {

     private SqlSessionFactory sqlSessionFactory;
@Before
public void setUp() throws Exception {
//1.给出全局配置文件的文件路径
String resource="SqlMapConfig.xml";
//2.读取文件返回一个输入流
InputStream inputStream= Resources.getResourceAsStream(resource);
sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); } @Test//当加上where if 标签后会生成动态sql会根据所给的条件信息去生成sql语句
//SELECT * FROM USER WHERE username like '%小明%'
//SELECT * FROM USER WHERE username like '%小明%' AND sex=?
public void testFindUserList() {
//1.创建sqlSession会话
SqlSession sqlSession = sqlSessionFactory.openSession();
//2.使用Mapper代理的方式创建接口实例(这个实例不是我们创建的而是由MyBatis创建的我们遵守规范即可)
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
UserPlus userPlus =new UserPlus();
User user = new User();
user.setUsername("小明");
// user.setSex("1");
userPlus.setUser(user); List<User> userList = userMapper.findUserList(userPlus); System.out.println(userList);
sqlSession.close();
}
}

1.1.4Map类型

当传入一个HashMap的参数时的映射文件的写法

  <!-- parameterType="HashMap"通过这里可以看出只要不是自定义的数据类型 都可以使用简单名称不用谢完全类名且不区分大小写 -->
<!-- 通过map集合传参 可以发现和普通PO类传参是一样的操作-->
<select id="findUserHashMap" parameterType="HashMap" resultType="user">
SELECT * FROM USER WHERE username like '%${username}%' AND sex=#{sex} </select>

测试代码:

 public class UserMapperTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void setUp() throws Exception {
//1.给出全局配置文件的文件路径
String resource="SqlMapConfig.xml";
//2.读取文件返回一个输入流
InputStream inputStream= Resources.getResourceAsStream(resource);
sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); }
@Test
public void testFindUserHashMap() {
//1.创建sqlSession会话
SqlSession sqlSession = sqlSessionFactory.openSession();
//2.使用Mapper代理的方式创建接口实例(这个实例不是我们创建的而是由MyBatis创建的我们遵守规范即可)
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
HashMap<String, Object> hashmap =new HashMap<>();
hashmap.put("username", "小明");
hashmap.put("sex", "1");
List<User> userList = userMapper.findUserHashMap(hashmap); System.out.println(userList);
sqlSession.close();
}
}

1.2映射文件之输出映射类型(resultType)

  resultType只能进行简单结果映射不能很好的进行复杂的结果映射如果当进行下一篇讲解的关联关系查询时resultType就不好用了

但是当结果映射为 int、double、String等直接配置为相对应的类型即可而且也可以进行自定义类型映射

但是必须保证查询的列名和JavaBean的属性名完全一致,不然则会映射失败。

当查询时我们会定义列别名 例如  select   username  t_username from user where id=1;而如果JavaBean里面的属性名为username这时你的t_username就映射不上去

2.映射文件之定义动态sql

2.1动态sql

  在mybatis中,它提供了一些动态sql标签,可以让程序员更快的进行mybatis的开发,这些动态sql可以通过sql的可重用性。常用的动态sql标签:if标签、where标签、sql片段、foreach标签

2.1.1 if/where标签的使用

 <select id="findUserList" parameterType="com.itheima.Po.UserPlus" resultType="user">
<!--${xxx} #{xxx}中的参数名称要和包装pojo中的对象层级一致,并且属性名称要一致-->
SELECT * FROM USER
<!-- mybatis提供 where if foreach 等标签来帮助优化sql 也就是生成动态SQL这样可以方便优化条件查询
where 标签会将条件中的第一个AND 给自动去掉 ,如果一个参数都没有则会省去where
-->
<where>
<!-- if标签对条件进行判断 test属性为判断表达式而且里面支持and字符串 -->
<if test="user.username!=null and user.username!=''">
AND username like '%${user.username}%'
</if>
<if test="user.sex!=null and user.sex!=''">
AND sex=#{user.sex}
</if>
</where> </select>

2.1.2 sql片段

<sql></sql>标签定义可重用的sql片段 id为这个sql片段的唯一标识

sql片段

 <!-- 自定义sql片段提高sql代码的可重用性  id标识sql片段的唯一引用
sql片段:可以声明sql语句的任何一部分
SQL片段:尽量不要将select或where等关键字放在片段里面,这样有利于其他代码的重用
-->
<sql id="whereClause">
<!-- mybatis提供 where if foreach 等标签来帮助优化sql 也就是生成动态SQL这样可以方便优化条件查询
where 标签会将条件中的第一个AND 给自动去掉 ,如果一个参数都没有则会省去where
-->
<where>
<!-- if标签对条件进行判断 test属性为判断表达式而且里面支持and字符串 -->
<if test="user.username!=null and user.username!=''">
AND username like '%${user.username}%'
</if>
<if test="user.sex!=null and user.sex!=''">
AND sex=#{user.sex}
</if>
<if test="idList!=null and idList.size>0">
AND id IN
<foreach collection="idList" item="id" open="(" close=")" separator=",">
#{id}
</foreach>
</if>
</where>
</sql>

引用sql片段:

  <select id="findUserList" parameterType="com.itheima.Po.UserPlus" resultType="user">
<!--${xxx} #{xxx}中的参数名称要和包装pojo中的对象层级一致,并且属性名称要一致-->
SELECT * FROM USER
<include refid="whereClause"></include>
</select>

3.maybatis与hibernate的区别与各自应用场景

Mybatis技术特点:

通过直接编写SQL语句,可以直接对SQL进行性能的优化;

学习门槛低,学习成本低。只要有SQL基础,就可以学习mybatis,而且很容易上手;

由于直接编写SQL语句,所以灵活多变,代码维护性更好。

不能支持数据库无关性,即数据库发生变更,要写多套代码进行支持,移植性不好。

Hibernate技术特点:

标准的orm框架,程序员不需要编写SQL语句。

具有良好的数据库无关性,即数据库发生变化的话,代码无需再次编写。

学习门槛高,需要对数据关系模型有良好的基础,而且在设置OR映射的时候,需要考虑好性能和对象模型的权衡。

程序员不能自主的去进行SQL性能优化。

Mybatis应用场景:

需求多变的互联网项目,例如电商项目。

Hibernate应用场景:

需求明确、业务固定的项目,例如OA项目、ERP项目等。

mybatis第一天02的更多相关文章

  1. Mybatis第一天(其他)

    Mybatis第一天 框架课程 课程计划 第一天: Mybatis的介绍 Mybatis的入门 使用jdbc操作数据库存在的问题 Mybatis的架构 Mybatis的入门程序 Dao的开发方法 原始 ...

  2. Mybatis第一天

    Mybatis第一天   框架课程 1.   课程计划 第一天: 1.Mybatis的介绍 2.Mybatis的入门 a)       使用jdbc操作数据库存在的问题 b)      Mybatis ...

  3. JAVAEE——Mybatis第一天:入门、jdbc存在的问题、架构介绍、入门程序、Dao的开发方法、接口的动态代理方式、SqlMapConfig.xml文件说明

    1. 学习计划 第一天: 1.Mybatis的介绍 2.Mybatis的入门 a) 使用jdbc操作数据库存在的问题 b) Mybatis的架构 c) Mybatis的入门程序 3.Dao的开发方法 ...

  4. MyBatis第一个案例-----永远的HelloWorld 含所有代码

    1.创建表emp CREATE DATABASE mybatis; USE mybatis; CREATE TABLE emp( id INT(11) PRIMARY KEY AUTO_INCREME ...

  5. mybatis第一天——入门与概述

    大纲摘要: 1.mybatis的介绍 2.Mybatis的入门 a) 使用jdbc操作数据库存在的问题 b) Mybatis的架构 c) Mybatis的入门程序 3.Dao的开发方法 a) 原始da ...

  6. mybatis第一篇

    1.mybatis介绍 1.介绍 ​ MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google co ...

  7. 持久层之 MyBatis: 第一篇:快速入门

    MyBatis入门到精通 JDBC回顾 1.1.认识MyBatis 1.1.使用IDEA创建maven工程 1.2.引入mysql依赖包 1.3.准备数据 1.4 使用JDBC手写MyBatis框架 ...

  8. MyBatis第一个程序

    创建一个maven项目,并且在pom.xml导入myBatis和jdbc的jar包 <dependencies> <dependency> <groupId>org ...

  9. 【翻译习作】 Windows Workflow Foundation程序开发-第一章02

    1.2      Windows Workflow概览 微软的Windows Workflow Foundation(简称WF)是.NET框架3.0版的一部分..NET3.0其它主要部分是Window ...

随机推荐

  1. 0226 rest接口设计

                背景 为了更方便的书写和阐述问题,文章中按照第一人称的角度书写.作为一个以java为主要开发语言的工程师,我所描述的都是java相关的编码和设计. 工程师的静态输出就是代码和文 ...

  2. 手把手教你快速使用数据可视化BI软件创建互联网用户数据分析大屏

    灯果数据可视化BI软件是新一代人工智能数据可视化大屏软件,内置丰富的大屏模板,可视化编辑操作,无需任何经验就可以创建属于你自己的大屏.大家可以在他们的官网下载软件.   本文以互联网用户数据分析大屏为 ...

  3. python笔记23(面向对象课程五)

    今日内容 上节作业 单例模式 class Foo: pass obj1 = Foo() # 实例,对象 obj2 = Foo() # 实例,对象 日志模块(logging) 程序的目录结构 内容回顾 ...

  4. JavaBIO利用装饰器模式来组织和扩展接口

    Stream接口,它直接负责字节流的传输. Reader/Writer接口,它本身不能读直接读写数据,而是以Stream接口为内部核心,在外围装饰增强,负责字符流的读写.字符和字节的转换过程必须指定字 ...

  5. Burp Suite 实战指南--说明书

       burp使用指南 网址:https://t0data.gitbooks.io/burpsuite/content/

  6. 关于对 softirq、work_queue、tasklet 学习后的一点总结

    本文基于linux版本:4.14.111 简单的总结下 softirq.work_queue.tasklet 三种中断下半部的工作原理及区别,并附上三种形式的简单实例. 一.运行原理① softirq ...

  7. java提取字符串数字,Java获取字符串中的数字

    ================================ ©Copyright 蕃薯耀 2020-01-17 https://www.cnblogs.com/fanshuyao/ 具体的方法如 ...

  8. 【MVC+EasyUI实例】对数据网格的增删改查(上)

    前言 此案例是针对之前做的一个小例子的后台框架的修改,从以前的三层框架改为现在的MVC框架,也是做了一次MVC和EasyUI的结合,分为2篇文章来阐述. 界面如下: 点击"添加"按 ...

  9. redis深入学习

    Redis持久化 官方文档: https://redis.io/topics/persistence 1.RDB和AOF优缺点 RDB: 可以在指定的时间间隔内生成数据集的时间点快照,把当前内存里的状 ...

  10. c#日期时间段判断

    select * from 表名 where (case when ISDATE(字段名)=1 then CONVERT(varchar(100),cast(字段名 as datetime),23) ...