mybatis入门笔记(一)
mybatis入门笔记(一)
——2018年11月12日
导入mybatis的两种方式:
- maven依赖:
- 导入mybatis jar包:
下载地址:https://github.com/mybatis/mybatis-3/releases
对比JDBC编程出现的问题凸显mybatis的好处:
先来看看jdbc的编程步骤:
①.加载数据库驱动
②.创建并获取数据库连接
③.创建jdbc statement对象
④.设置sql语句
⑤.设置sql语句中的参数(使用preparedStatement)
⑥.通过statement执行sql并获取结果
⑦.解析sql执行结果
⑧.释放资源
问题总结:
①.数据库连接,使用时就创建,不使用时就释放,对数据库的连接进行频繁开启和关闭,造成数据库资源浪费,影响性能。
②.如果更改Dao层sql,就需要重新编译java代码,不利于系统的维护。
这些问题在后面的mybatis的介绍中都可以解决。
Mybatis介绍:
1.Mybatis是个持久性的框架,是apache的*项目
2.Mybatis可以将向preparedStatement中的输入参数自动进行输入映射,将查询结果集灵活映射成java对象。
Mybatis框架执行过程:
Config.xml:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<settings>
<!--把数据中的下划线改为驼峰命名法-->
<setting name="mapUnderscoreToCamelCase" value="true"/>
<!-- 要使延迟加载生效必须配置下面两个属性 -->
<!--全局性设置懒加载。如果设为'false',则所有相关联的都会被初始化加载-->
<setting name="lazyLoadingEnabled" value="true"/>
<!--当设置为true的时候,懒加载的对象可能被任何懒属性全部加载。否则,每个属性都按需加载-->
<setting name="aggressiveLazyLoading" value="false"/>
<!--指定日志记录-->
<setting name="logImpl" value="LOG4J" />
<!--开启二级缓存,二级缓存默认开启状态-->
<setting name="cacheEnabled" value="true"></setting>
</settings>
<typeAliases>
<package name="org.robert.entity"></package>
</typeAliases>
<environments default="mysql">
<environment id="mysql">
<!-- 指定事务管理类型,type="JDBC"指直接简单使用了JDBC的提交和回滚设置-->
<transactionManager type="JDBC"/>
<!-- dataSource指数据源配置,POOLED是JDBC连接对象的数据源连接池的实现 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url"
value="jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf8&allowPublicKeyRetrieval=true"/>
<property name="username" value="root"/>
<property name="password" value="ganhua0719"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="org.robert.mapper"></package>
</mappers>
</configuration>
操作数据库的映射文件:
创建方法接口StudentMapper.java:
测试类(单元测试):
也可以写一个工具类:
总结:
1.#{}和${}
#{}表示一个占位符号,#{}接收输入参数,类型可以是简单类型,pojo、hashmap。
如果接收简单类型,#{}中可以写成value或其它名称。
#{}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性…的方式获取对象属性值。
${}表示一个拼接符号,会引用sql注入,所以不建议使用${}。
${}接收输入参数,类型可以是简单类型,pojo、hashmap。
如果接收简单类型,${}中只能写成value。
${}接收pojo对象值,通过OGNL读取对象中的属性值,通过属性.属性.属性…的方式获取对象属性值。
2.SqlSession使用范围:
①.SqlSessionFactoryBuilder
通过SqlSessionFactoryBuilder创建会话工厂SqlSessionFactory将SqlSessionFactoryBuilder当成一个工具类使用即可,不需要使用单例管理SqlSessionFactoryBuilder。在需要创建SqlSessionFactory时候,只需要new一次SqlSessionFactoryBuilder即可。
②.SqlSessionFactory
通过SqlSessionFactory创建SqlSession,使用单例模式管理sqlSessionFactory(工厂一旦创建,使用一个实例)。将来mybatis和spring整合后,使用单例模式管理sqlSessionFactory。
③.SqlSession
SqlSession是一个面向用户(程序员)的接口。SqlSession中提供了很多操作数据库的方法:如:selectOne(返回单个对象)、selectList(返回单个或多个对象)。
SqlSession是线程不安全的,在SqlSesion实现类中除了有接口中的方法(操作数据库的方法)还有数据域属性。
SqlSession最佳应用场合在方法体内,定义成局部变量使用。