【无标题】

尚硅谷mybatis学习笔记
mybatis:封装jdbc,Java的持久化框架

一、mybatis的环境准备
1.创建maven引入依赖

使用idea自带maven

2.创建maven工程,引入所需的依赖

创建gav坐标,方便后续使用

org.mybatis mybatis 3.5.7 junit junit 4.12 test mysql mysql-connector-java 5.1.3

3.创建mybatis核心文件file文件(resources)
(1)核心文件,建议命名mybatis-config.xml

(2)映射文件(命名规则:实体类+mapper.xml)

4.创建mapper接口(相当于dao)
(1)创建pojo,数据实体类
(2)创建mapper接口(dao)对应一个表,对应一个mapper映射文件
tips:在mapper映射文件中写对应的sql语句
*MyBatis面向接口编程的两个一致

  • 1.映射文件的namespace要和mapper接口的全类名保持一致
  • 2.映射文件中SQL语句的id要和接口中的方法名一致
    //加载核心配置文件
    InputStream is = Resources.getResourceAsStream(“mybatis_config.xml”);
    //获取sqlSessionFactoryBuilder
    SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
    //获取sqlSessionFactory(将io文件is编译成sqlSession)
    SqlSessionFactory sqlSessionFactory = sqlSessionFactoryBuilder.build(is);
    //获取sqlSession
    SqlSession sqlSession = sqlSessionFactory.openSession();
    //通过sqlSession获取Mapper接口对象(直接对接口编程)
    UserMapper mapper = sqlSession.getMapper(UserMapper.class);
    //调用插入方法,返回影响行数

流程:配置好文件之后,在接口中加入抽象方法,然后在mapper.xml问价中加入方法对应的映射,最后在方法中加入mapper文件,获取sqlSession,使用getmapper()方法调用sql方法。

tips:核心文件标签,mapper标签中的一个xml文件对应的是一个表。当有多个表时,可以通过以包为单位引入映射文件
(1)mapper接口所在的包与映射文件的所在的包一致(包名)
(2)mapper接口要和映射文件的名字一致
映射文件的包在resource创建时使用/代替.分割。

(2).标签

5.创建配置模板 (1)核心配置模板

(2)映射文件配置模板
同上

五、MyBatis获取参数值的两种方式(重点)
MyBatis获取参数值的两种方式:${}和#{}
KaTeX parse error: Expected 'EOF', got '#' at position 14: {}的本质就是字符串拼接,#̲{}的本质就是占位符赋值 my…{}将字符串放入(where id = #{XXX}),无论是否是参数名都可以,但是注意 的 单 引 号 问 题 ( ′ {}的单引号问题(' {}’)
tips:去除映射文件select中的黄条

(2)当mapper接口参数为多个参数时
当要传入多个参数时,mybatis会自动提供一个map,将参数作为值,自动提供arg1, arg0或param1, param2为键
参数使用map键值对的[arg1, arg0, param1, param2]为键,参数为值。(在#{arg0}或者#{param1})
(3)当mapper接口参数为多个时,可以手动将参数封装至map集合中
(4)当mapper接口参数为实体类时,将实体类对象的参数放入即可
a.在映射文件中,将参数放入即可

insert into t_user values(null,#{admin},#{password},#{age},#{sex},#{email})

b.在调用对象中,创建一个User对象
mapper.insertByUser(new User(null,“admin”,“password”,“23”,“男”,“123@qqcom”));
(5)@param注解自定义命名参数,可以解决除放入对象的所有问题(所以记住@param和插入对象即可)
在创建接口时,在参数前加上@param(“username”),就相当于创建了一个map集合以@param的参数为键,接口参数为值
User checkLoginByParam(@param(“username”)String username);
1.可以通过param1和param2为键
2.可以通过@param创建的值为键

@param源码解析

六、mybatis的各种查询功能(查询返回一个或多个结果时,实体类、集合、map)
1、查询结果为一个时,可以放入实体类或集合或map集合中
User{id=2, username=‘李四’, password=‘123’, age=23, sex=‘女’, email=‘1’}
2.查询结果为多个时,可以使用集合或list嵌套map集合接收
List 返回一个list集合
3.查询表的字段,使用Integer,resultType = int(Integer)—别名
4.将查询结果放入map集合中,result = map
{password=123, sex=女, id=2, age=23, email=1, username=李四}
查询多个结果返回,将map放在list集合中
List>
或者使用注解@MapKey
@MapKey(“id”)
tips:list和MapKey<“key”>的区别
list中:返回的是一个实体类
map中:返回的是一个map集合,将参数作为键,一个实体类对象(的数据)为值

七、SQL语句的特殊查询(几个需要使用 ) S e l e c t ∗ f r o m t u s e r w h e r e u s e r n a m e l i k e " 1. 使 用 模 糊 查 询 s e l e c t ∗ f r o m t u s e r w h e r e u s e r n a m e l i k e " 此 时 u s e r n a m e ( 占 位 符 ) 是 在 双 引 号 中 , 是 一 个 字 符 串 , 不 能 起 到 占 位 符 的 作 用 解 决 办 法 ( 1 ) 使 用 {}) Select* from t_user where username like "%?%"; 1.使用模糊查询 select * from t_user where username like "%#{username}%" 此时username(占位符)是在双引号中,是一个字符串,不能起到占位符的作用 解决办法 (1)使用 Selectfromtuserwhereusernamelike"1.使selectfromtuserwhereusernamelike"username()1使{username}
(2)使用concat拼接函数
select * from t_user where username like concat("%",#{username},"%");
(3)直接使用字符串拼接
select * from t_user where username like “%”#{usernme}"%"
tips:记得使用双引号
2.批量删除
假设要删除id为1,2,3的用户信息,将1,2,3放入一个集合ids
delete from t_user where id in( i d s ) 这 里 必 须 使 用 {ids}) 这里必须使用 ids)使{},使用#{}ids时一个字符串
3.动态设置表名
select * from ${tableName}
4.设置开启主键,并返回主键
两个标签userGeneratedKeys:是指开启主键
keyProperty:将主键的值存入自己设定的属性中

开启主键,并将值存入id中

八、解决字段名与属性名不一致的情况(三种)
1.使用列的别名
select eid,emp_name empName from t_Emp
2.在核心配置文件中,使用setting全局变量

将字段名中_改为驼峰式
即emp_name改为empName
3、使用resultMap




id与一致
标签用于主键
用于普通标签
用于属性名用于字段名
tips:使用在标签中

4、处理多对一的解决办法
如一个部门表对应多个员工表,查询一个员工及对应部门的信息
(1)使用级联赋值
在中使用


(2)使用association标签,在标签中property中对应字段,javaType中对应属性类型




(3)使用分步查询
分别查询员工表和部门表信息
再员工表中使用resultMap标签,使用association标签将表信息连接
select=“com.atguigu.mybatis.mapper.DeptMapper.selectEmpAndDeptByTwo”
column=“did”

property:返回数据类型 select:全类名+id column:两表连接的条件,外键

5.延时加载
使用在全局变量中


lazyLoadingEnabled,开启后根据情况加载所需要sql语句
fetchType标签:开启延时加载后,使用eager不受延时加载影响,也会先加载sql语句

6.使用collectios标签处理一对多
(1)使用collections标签,类似于association标签。将其中的javaType改成ofType(集合中的类型)
(2)使用分步查询,分别查询员工表和部门表的信息,在使用collection,将两表信息连接(参考association)
property:返回数据类型(集合名emps) select:全类名+id column:两表连接的条件,外键

tips:多对一,如多个员工对应一个部门表,在员工中创建一个对象
一对多,如多个部门对应一个员工表,在部门表中创建一个员工集合

九、动态SQL
多条件查询,根据设置的要求来查询返回数据
1.if标签:根据test来判断是否将标签中的内容加到where后
select * from t_emp where 1=1

and emp_name = #{empName}

例如查询名字相同的表中信息
首先使用标签判断传入的empName是否为空,为空不比较。不为空则查询表中empname相同的数据
为了防止数据都为空在where后添加1=1,后续判断使用and连接。
2.where标签
将if标签嵌套,如果if标签成立会自动去掉前面多余的and/or(不会去掉后面的and/or)–不用再写where 及1=1。
如果if标签不成立,则自动跳过
3.trim标签
嵌套if标签,如果if标签不成立,没有效果(同where)
如果if 标签成立可以使用trim中的标签
prefix/suffix:在if添加指定内容
prefixOverrides/suffixOverride:在if前后删除指定内容。

你可能感兴趣的:(intellij-idea,java,架构)