一、typeAlias 类型别名【自定义别名、系统自带别名】

1、类型别名:为 Java 类型设置一个缩写名字。 它仅用于 XML 配置,意在降低冗余的全限定类名书写

2、配置自定义别名:

(1)方式一:为具体某个类配置别名

//在全局配置文件中添加别名的配置:
<configuration>
<!-- 类型别名 -->
<typeAliases>
<typeAlias type="com.shan.hello.User" alias="User"/>
</typeAliases>
</configuration> //在Mapper文件中使用:
<select id="get" parameterType="java.lang.Long" resultType="User">
select * from t_user where id = #{id}
</select>

★(2)方式二:为具体包配置别名【一般包名就写到domain包即可】,然后包下的类 直接类首字母小写 即可使用:

//在全局配置文件中添加别名的配置:
<configuration>
<!-- 类型别名 -->
<typeAliases>
<!-- <typeAlias type="com.shan.hello.User" alias="User"/>-->
<!-- 一般包写到domain包即可,系统自动为该包的类起别名,使用直接是简单类首字母小写 -->
<package name="com.shan.hello"/>
</typeAliases>
</configuration> //在Mapper文件中使用:
<select id="get" parameterType="java.lang.Long" resultType="user">
select * from t_user where id = #{id}
</select>
  • myBatis中别名是不区分大小写的

(3)方式三:使用注解的方式,贴标签到domain类上 @Alias("**")

3、系统自带的别名【基本类型+包装类型,还有map类型】---作用:需要返回值时,设置返回类型 resultType

---就是基本类型加个下划线,包装类型的别名就是基本类型啦。例如int的别名是_int, Integer的别名是int

■ 举例: 查询的返回类型是整型,使用别名int:

 <!-- 查询总数 -->
<select id="getCounts" resultType="int">
select count(id) from t_user;
</select> /* 测试查询总数 */
@Test
public void testGetCounts() throws IOException {
SqlSession session = MyBatisUtil.getSession();
//4、进行数据库操作(CRUD)
int count = session.selectOne("com.shan.hello.UserMapper.getCounts");
System.out.println(count);
//5、关闭资源
session.close();
}

■ 举例: 查询的返回类型是部分列,使用别名map:

 <!-- 查询部分列,每一行记录以map[键值对]形式返回 -->
<select id="getPartCrows" resultType="map">
select id, name from t_user where id = #{id};
</select> /* 测试查询部分列 */
@Test
public void testGetPartCrows() throws IOException {
SqlSession session = MyBatisUtil.getSession();
//4、进行数据库操作(CRUD)
Map<String, Object> user = session.selectOne("com.shan.hello.UserMapper.getPartCrows", 2L);
System.out.println(user);
//5、关闭资源
session.close();
}

二、properties 属性配置 [动态引入]

1、动态替换:属性在外部进行配置,然后进行动态替换:

(1)建立一个外部的.properties 文件 【key=value形式】:

driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatisdemo
username=root
password=admin

(2)引入和动态替换,通过properties的resource引入,然后动态替换是使用${}:

 <configuration>
<!-- 属性properties配置 --> <!-- 文件的根目录是.classpath路径 -->
<properties resource="db.properties"/>
<environments default="dev">
<!-- 1、配置数据库的环境 -->
<environment id="dev">
<!-- ① 事务管理器 -->
<transactionManager type="JDBC"/>
<!-- ② 连接池【连接数据库4要素】 -->
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
</configuration>

三、resultMap [解决表的列名和对象的属性名不匹配的问题]

✿ 默认情况下,通过设置返回类型resultType 是要求表的列名和对象的属性名要一致,否则会出错。

1、方式一:使用别名:

 <select id="getList" parameterType="java.lang.Long" resultType="user">
select u_id id, u_name name, u_salary salary from t_user;
</select>

★ 2、方式二:使用resultMap:

  • resultMap 和 resultType不能同时使用
  <!-- resultMap 结果集合对象映射:解决表的列名和对象的属性名不匹配的问题
id:唯一标识
type:封装结果集的每一行记录的类型
子元素:result 匹配对象中的哪一个属性对应表的哪一列 【若是主键,建议使用id元素代替result元素提高性能】
-->
<resultMap id="BaseResultMap" type="User" >
<id column="u_id" property="id"/>
<result column="u_name" property="name"/>
<result column="u_salary" property="salary"/>
</resultMap> <select id="getList" parameterType="java.lang.Long" resultMap="BaseResultMap">
select u_id, u_name, u_salary from t_user;
</select>

四、Mapper接口和原理 [好比是DAO层]

1、回顾之前执行sql的方式是:使用namespace.id 的方式找到sql元素,并执行sql语句。

■ 该方式存在几个问题:

	public void testGet() throws IOException {
// 创建SqlSession会话对象,好比连接对象Connection
SqlSession session = MyBatisUtil.getSession();
// 进行数据库操作(CRUD)
User user = session.selectOne("com.shan.hello.UserMapper.get", 2L);//第一个参数是字符串无法编译时检查,第二个参数是Object类型也无法编译时检查
System.out.println(user);
// 关闭资源
session.close();
}

(1)第一个参数:因为传入的是String类型的参数,可能会写错,写错检查也是等到运行时才发现

(2)第二个参数:Object类型,不需要被检查,万物皆对象

(3)每个操作【增删改查】的代码模板是相同的,可以抽取

--------解决:使用Mapper 接口,类似DAO接口,在Mapper接口中去定义每一个操作方法。

★ DAO诞生的背景:以前我们是把数据库的操作代码编写到客户端里:
跟业务代码混杂在一起;②而且每次操作数据库时都需要重复书写代码

2、Mapper组件:Mapper接口+Mapper文件

(1)Mapper 文件和Mapper 接口应该放到同一包下

(2)Mapper文件中的namespace 对应 Mapper接口的全限定名称

(3)Mapper文件中的操作元素的**id **对应 Mapper接口的方法名称

/* Mapper 接口*/
public interface UserMapper {
void save(User user);
void delete(Long id);
void update(User user, Long id);
void get(Long id);
List<User> getListAll();
}
<!-- Mapper文件 -->
<!-- Mapper文件的namespace对应Mapper 接口的全限定名 -->
<mapper namespace="com.shan.hello.mapper.UserMapper"> <!-- 保存操作 --> <!-- Mapper 文件的操作元素的id对应Mapper接口的方法名 -->
<insert id="save">
insert into t_user (name, salary) values (#{name}, #{salary});
</insert> <!-- 删除操作 -->
<delete id="delete">
delete from t_user where id = #{id};
</delete> <!-- 更改操作 -->
<update id="update">
update t_user set name = #{name}, salary = #{salary} where id = #{aid};
</update> <!-- 查询操作 -->
<select id="get" parameterType="java.lang.Long" resultType="user">
select * from t_user where id = #{id}
</select> <select id="getListAll" parameterType="java.lang.Long" resultType="user">
select * from t_user;
</select> </mapper>
/* 测试,调用Mapper接口操作数据库 */
@Test
public void testGetList() throws IOException{
SqlSession session = MyBatisUtil.getSession();
UserMapper userMapper = session.getMapper(UserMapper.class); List<User> users = userMapper.getListAll();
System.out.println(users);
}

五、参数处理【使用注解@Param实现处理多个参数】

---myBatis默认情况下只能处理一个参数,解决查询多个参数的方法:

1、方法一:封装成一个对象 【可以,但是麻烦,需要定义很多的javaBean对象】

2、方法二:封装成Map对象 (Map的key好比时javaBean对象的属性名,Map的value好比时javaBean的属性值)【也有点麻烦,因为每次都需要创建一个Map对象】

/* ClientMapper 接口 */
public interface ClientMapper {
//将多个参数封装成一个Map对象
Client login2(Map<String,Object> map);
} <!-- Mapper文件 -->
<mapper namespace="com.shan.params.mapper.ClientMapper">
<select id="login2" resultType="Client">
select id, username, password from client where username = #{username} and password = #{password} ;
</select>
</mapper> /* 测试 */
@Test
public void testLogin2() throws IOException {
Map<String,Object> paramMap = new HashMap<String, Object>() {
{
//设置map的元素的键值对的值
this.put("username", "shan");
this.put("password", "1");
}
};
SqlSession session = MyBatisUtil.getSession();
ClientMapper clientMapper = session.getMapper(ClientMapper.class);
Client client = clientMapper.login2(paramMap);
System.out.println(client);
session.close();
}

★ 3、方法三:使用Param注解,底层原理就是方式二,myBatis帮我们使用map来封装。

/* ClientMapper 接口 */
public interface ClientMapper {
//使用params注解封装多个参数
Client login3(@Param("username")String username, @Param("password")String password);
} <!-- Mapper文件 -->
<mapper namespace="com.shan.params.mapper.ClientMapper">
<select id="login3" resultType="Client">
select id, username, password from client where username = #{username} and password = #{password} ;
</select>
</mapper> /* 测试 */
@Test
public void testLogin2() throws IOException {
SqlSession session = MyBatisUtil.getSession();
ClientMapper clientMapper = session.getMapper(ClientMapper.class);
Client client = clientMapper.login3("shan", "1");
System.out.println(client);
session.close();
}

六、myBatis插件 [eclipse的插件MyBatipse]

  • 作用:编写映射文件时有代码提示

1、eclipse 安装 插件MyBatispse

■ 方式一(在线安装):看插件官网提供的方式【有的插件会提供拖动安装,重启eclipse即可】

● 通用:Help -> Eclipse Marketplace -> 搜 MyBatipse,然后进行安装即可

■ 验证是否安装成功,在eclipse的window->Preferences-> 搜 MyBatipse,有看到即成功

学习MyBatis必知必会(6)~Mapper基础的拓展的更多相关文章

  1. [ 学习路线 ] 2015 前端(JS)工程师必知必会 (2)

    http://segmentfault.com/a/1190000002678515?utm_source=Weibo&utm_medium=shareLink&utm_campaig ...

  2. 《SQL必知必会》学习笔记二)

    <SQL必知必会>学习笔记(二) 咱们接着上一篇的内容继续.这一篇主要回顾子查询,联合查询,复制表这三类内容. 上一部分基本上都是简单的Select查询,即从单个数据库表中检索数据的单条语 ...

  3. 学习《SQL必知必会(第4版)》中文PDF+英文PDF+代码++福达BenForta(作者)

    不管是数据分析还是Web程序开发,都会接触到数据库,SQL语法简洁,使用方式灵活,功能强大,已经成为当今程序员不可或缺的技能. 推荐学习<SQL必知必会(第4版)>,内容丰富,文字简洁明快 ...

  4. 《MySQL必知必会》学习笔记——前言

    前言 MySQL已经成为世界上最受欢迎的数据库管理系统之一.无论是用在小型开发项目上,还是用来构建那些声名显赫的网站,MySQL都证明了自己是个稳定.可靠.快速.可信的系统,足以胜任任何数据存储业务的 ...

  5. 《SQL必知必会》学习笔记整理

    简介 本笔记目前已包含 <SQL必知必会>中的所有章节. 我在整理笔记时所考虑的是:在笔记记完后,当我需要查找某个知识点时,不需要到书中去找,只需查看笔记即可找到相关知识点.因此在整理笔记 ...

  6. 《SQL必知必会》学习笔记(一)

    这两天看了<SQL必知必会>第四版这本书,并照着书上做了不少实验,也对以前的概念有得新的认识,也发现以前自己有得地方理解错了.我采用的数据库是SQL Server2012.数据库中有一张比 ...

  7. mysql学习--mysql必知必会1

     例如以下为mysql必知必会第九章開始: 正則表達式用于匹配特殊的字符集合.mysql通过where子句对正則表達式提供初步的支持. keywordregexp用来表示后面跟的东西作为正則表達式 ...

  8. mysql学习--mysql必知必会

      上图为数据库操作分类:     下面的操作參考(mysql必知必会) 创建数据库 运行脚本建表: mysql> create database mytest; Query OK, 1 row ...

  9. 数据库学习之中的一个: 在 Oracle sql developer上执行SQL必知必会脚本

    1 首先在開始菜单中打开sql developer: 2. 创建数据库连接 点击左上角的加号 在弹出的对话框中填写username和password 測试假设成功则点击连接,记得角色要写SYSDBA ...

随机推荐

  1. hud -5124-lines(线段树)

    题目的意思是求重合层数最多的段(把点也看成段). 给的数据范围为N<1e5; ai<1e9; 有于N只有1e5;那么离散化一下可以将ai的范围映射到1e5,而不改变原端点的相对大小. 接下 ...

  2. 1336 - Sigma Function

    1336 - Sigma Function   PDF (English) Statistics Forum Time Limit: 2 second(s) Memory Limit: 32 MB S ...

  3. Java代码性能优化

    (1)在合适的场合使用单例 使用单例可以减轻加载的负担,缩短加载的时间,提高加载的效率,但并不是所有地方都适用于单例,简单来说,单例主要适用于以下三个方面: 控制资源的使用,通过线程同步来控制资源的并 ...

  4. Java基础周测试(一)详解

    一.单选题 (题数:30,共 150.0 分) 1.下列选项不可作为Java语言变量名的是(    ).(5.0分) A.a1            B.$1           C._1       ...

  5. 使用 JavaScript 用循环嵌套输出乘法表。外循环控制行数,内循环控制当前行要输出的乘法表达式,在页面上输出九九乘法表

    查看本章节 查看作业目录 需求说明: 在页面上输出九九乘法表,实现效果如图所示 实现思路: 创建HTML页面 在页面中嵌入 <script type="text/javascript& ...

  6. 牛掰,在IDEA中,你可以安装小傅哥写的插件了!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.承认你优秀很难 很多码农,把路走窄了 捧一个,喷一个,很多码农都不会多一点思路看问题,总是 ...

  7. mysql总结笔记 -- 索引篇

    索引的作用 索引是用来高效的获取数据的 排好序 的 数据结构,如果没有索引,可能会导致查询某一条记录的时候遍历整张表:所以适当的索引可以大大的提升检索速度: 索引的数据结构 二叉树 假如说我们有一列数 ...

  8. AWS 15年(2):云原生兴起

    AWS创立云计算15年来,没有一个行业不跟云计算相关,没有任何一个颠覆性创新缺少云计算的参与,云已经是不可逆的滚滚洪流. AWS这15年,是云原生服务从无到有再到基本成熟的15年,是云原生应用兴起的1 ...

  9. MySQL数据库安装Version5.7

    MySQL数据库版本: mysql-5.7.22-linux-glibc2.12-x86_64 Linux服务器系统: CentOS 7.4 64bit MySQL安装用户: mysql/aliyun ...

  10. JZOJ5966. [NOIP2018TGD2T3] 保卫王国 (动态DP做法)

    题目大意 这还不是人尽皆知? 有一棵树, 每个节点放军队的代价是\(a_i\), 一条边连接的两个点至少有一个要放军队, 还有\(q\)次询问, 每次规定其中的两个一定需要/不可放置军队, 问这样修改 ...