1.Mybatis的生命周期
- SqlSessioFactoryBuilder:用于创建SqlSessionFactory,一旦sqlsessionfactory被创建成功就会被回收
-
- sqlsessionfactory:用于创建sqlsession,类似于jdbc的connection对象,而每次应用程序需要访问数据库,都需要创建sqlsession,所以sqlsessionfacttory在整个mybatis生命周期中。(每个数据库对应一个sqlsessionfactory,是单例产生到的)
- sqlsession:生命周期是存在于请求数据库处理事务的过程中,是一个线程不安全的对象(再多线程的情况下,需要特别注意),存活于一个应用的请求和申请,可以执行多条sql保证事务一致性。
- mapper:是一个接口,没有实现类。它的作用是发送sql,返回结果,或修改数据库表,所以它存活于一个sqlsession内,是一个方法级别的东西。当sqlsession被销毁的时候,mapper也会被销毁。
2.什么是mybatis
- mybatis是一款优秀的持久层框架,用于将数据持久化到数据库。(将断电即失的内存数据持久化到数据库中)
- mybatis几乎避免了jdbc代码和手动设置参数以及获取结果集。
- 数据持久化:将数据在持久状态和瞬时状态转化的过程。数据持久化可以有多种:例如持久化到数据库,io文件持久化。
-
- 为什么要持久化?
- 一些对象不能够让他丢掉
- 内存太贵
- 持久层:
- 完成持久化工作的代码。
- 层界限区分明显。
- 为什么需要mybatis
- 方便
- 传统的jdbc代码太复杂。简化。框架。自动化。
3.mybatis搭建的步骤
- 配置mybatis环境
-
创建数据库以及对应的表
-
pom导入mysql,mybatis,junit文件
-
根据对应的表的字段编写pojo基本类。
-
编写mybatis-config.xml配置文件
-
编写接口(在接口中写一个方法,记得写方法的返回值类型)
-
编写实现接口的mapper.xml文件:记得写namespace=“接口名”,
id:接口的方法名,resultType:接口的饭返回值结果类型。然后就是sql语句 -
将mapper写入mybatis-config.xml配置文件
-
在pom.xml中加入读取.xml的文件
4.sql的增删改查实现
- 第一步要在接口中定义不同的方法来实现增删改查。
- 第二步在mapper.xml文件中创建对应的sql语句以及id=接口中方法名。
5.万能的map
-
map能够简化我们编写代码的时间,如果我们需要在数据库中进行增加数据或者其他操作,当一个对象的属性过多的时候我们创建对象比较麻烦,使用我们可以使用map来简化我们创建对象。Map在mapper.xml的对象简写就是map
-
Map传递参数,直接在sql中取出key即可
-
对象传递参数,直接在sql中取出对象的属性即可
-
只有一个基本类型参数的情况下可以不写parameterType,可以直接在sql中取到。
-
mybatis中的模糊查询怎么写?
-
记住模糊查询需要使用 like 关键子
-
java代码执行的时候,传递通配符% %
-
List<User> userList=mapper.getUserLike("%李%")
-
在sql拼接中使用通配符
-
select * from mybatis.user where name like "%"#{ value}"%"
-
6.mybatis属性配置以及优化
- 环境配置(environments):
-
mybatis可以配置多个环境不过,每一个SqlSessionFactory实例只能选择一种环境。我们要学会配置多种环境。若要更改环境只需要修改default属性里面的值就可以了。
-
mybatis默认事务管理器就是JDBC,还有一种MANAGER因为太垃圾什么事都没做使用我们不用。默认连接池:POOLED
-
属性(properties):在mybatis-config.xml文件中写properties必须写在最前面。也可以在poperties中间写属性以及值。如果有相同的属性则优先使用外部文件的属性。
-
- #{}和${}的区别
-
mybatis在处理#{}时,会将#{}替换成为?,预编译sql,通过preparedStatement的setxxx的方法进行参数赋值。使用#{}可以有效防止sql注入
-
mybatis在处理#{}时,会直接把${}替换为参数值,存在sql注入的风险
-
#{}比 更 加 安 全 , 但 还 是 提 供 了 {}更加安全,但还是提供了 更加安全,但还是提供了{}这种动态替换参数的方式,是因为有些复杂的sql使用场景通过预编译的方式比较麻烦,且在代码中完全可以做到控制非法参数,有些参数可能是一些常量或字段值。
-
7.类型别名(typeAliases)
-
类型别名是为java类型设置一个短的名字。
-
存在的意义是为了减少类完全限定名的冗余。
<!--可以给实体类起别名-->
<typeAliases>
<typeAlias type="url" alias="别名"/>
</typeAliases>
```声明别名是顺序的第三个
- 也可以指定一个包名,mybatis会在包名下面搜索需要的java Bean,比如:扫描实体类的包,他的默认别名就为这个类的类名,首字母小写!
```xml
<!--可以给实体类起别名-->
<typeAliases>
<typeAlias name="包的地址"/>
</typeAliases>
在实体类较多的时候,使用第一种方式。
如果实体类十分多,建议使用第二种方式(默认为包中类名不区分大小写建议用小写)
第一种方式可以自定义别名,第二中不行(如需在第二种上自定义别名则需要添加注解,但是加了@Alias(“名”))在resultMap中原来的类名就不能够用了
@Alias("user")
public class User{
}
- 8大基本类型的别名在前面加_,其余的类在原来的基础上首字母小写就ok
8.载mybatis-config.xml上对mapper.xml进行绑定
三种方法:
- 使用resource进行绑定
<mappers>
<mapper resource="Iuser.xml"></mapper>
</mappers>
``````xml
<mappers>
<mapper class="类地址"></mapper>
</mappers>
- 使用扫描包进行注入绑定
<mappers>
<mapper name="包地址"></mapper>
</mappers>
注意:
- 在使用class或者扫描包进行绑定时,接口和他的mapper配置文件必须同名
- 在使用class或者扫描包进行绑定时,接口和他的mapper配置文件必须在同一个包下!
每一个mapper代表一个业务
9.ResultMap结果集映射
- 当我们的类属性名和数据库表字段名不一致的时候我们查询数据的时候就会显示不正确。这时候我们有两种解决方法:
- 在sql语句中使用别名使得两个名字一致
- 使用ResultMap结果集映射
- idea快速替换快捷键crtl+r
10.日志工厂
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
10.1Log4j
什么是Log4j?
- 我们可以通过Log4j控制日志信息输送的目的地是控制台、文件、GUI组件
- 我们也可以控制每一条日志的输出格式
- 通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程。
- 通过一个配置文件来灵活地进行配置,而不需要修改应用的代码