- 1、概述
- 2、JDBC编程问题
- 3、MyBatis架构
- 4、MyBatis环境搭建
- 导入MyBatis 的jar包数据库驱动包
- 设置log4j的配置文件:
- 创建MyBatis全局配置文件
- 创建映射文件
- 插入数据
- 修改数据
- 删除数据
- 查询数据
- 其他查询
- Mybatis-Dao 层 Mapper 接口
- 测试MyBatis
- 5、 Mybatis日志
- 6、参数传递
- 7、结果处理
- 返回简单基本类型
- POJO对象输出映射
- 定义resultMap
- 8、多表关联处理结果集
- 懒加载
- 9、注解方式
- 10、Mybatis动态SQL
- 11、特殊符号处理
- 为什么使用缓存?
- 一级缓存
- 二级缓存
原始Apache的一个开源项目iBatis,2010年6月这个项目由Apache Software Foundation 迁移到了Google Code,随着开发团队转投Google Code 旗下,iBatis3.x正式更名为MyBatis。是一个基于Java的持久层框架。iBatis提供的持久层框架包括SQL Maps和Data Access Objects(DAO)。
MyBatis 是一款优秀的持久层框架,他支持定制化SQL,存储过程以及高级映射。
MyBatis避免了几乎所有的JDBC代码,手动设置参数以及获取结果集。MyBatis 可以使用简单的XML或注解来配置和映射原生信息,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录,是一种ORM(ORM Object Relational Mapping 对象关系映射)实现。
MyBatis将基本的JDBC常用接口封装,对外提供 *** 作即可。
Mybatis 中文官网 https://mybatis.org/mybatis-3/zh/getting-started.html
要使用MyBatis,只需将mybatis-x-x.jar 文件置于类路径中即可。
如果使用Maven 来构建项目,则需要将下面的依赖代码置于pom.xml文件中:
org.mybatis mybatis3.4.2
传统JDBC编程
1、加载数据库驱动
2、创建并获取数据库链接
3、创建statement对象
4、拼写sql语句
5、设置sql语句中的占位符的值
6、执行sql语句并获取结果
7、对sql执行结果进行解析处理
8、释放资源
1、数据库连接的创建,释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库连接池可解决该问题。
2、SQL语句编写在Java代码中,这种硬编码造成代码不易维护,当SQL变动时需要修改java源代码。
3、使用preparedStatement向占位符传参数存在硬编码,因为SQL语句的where条件中占位符的个数可能会变化,修改SQL还要修改java源代码,系统不易维护。
4、对结果集解析存在硬编码,SQL语句变化导致解析代码变化,系统不易维护。
org.mybatis mybatis3.4.2
下载地址:https://mvnrepository.com/artifact/org.mybatis/mybatis
log4j.rootLogger = debug,stdout,D #System out Console log4j.appender.stdout = org.apache.log4j.ConsoleAppender log4j.appender.stdout.Target = System.out log4j.appender.stdout.layout = org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern = [%p] %d{yyyy-MM-dd HH:mm:ss,SSS} %m%n #System out File log4j.appender.D = org.apache.log4j.FileAppender log4j.appender.D = org.apache.log4j.DailyRollingFileAppender log4j.appender.D.File = D://logs/log.log log4j.appender.D.Append = true log4j.appender.D.layout = org.apache.log4j.PatternLayout log4j.appender.D.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss} [ %t:%r ] - [ %p ] -[%l] %m%n创建MyBatis全局配置文件
MyBatis 的配置文件包含了对MyBatis行为的设置信息。配置文档的顶层结构如下:
(标签需要按照特定的顺序排放)
configuration (配置)
properties(属性)
settings(设置)
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)
eg:
创建映射文件//环境配置 //环境变量 //映射器//事务管理器 //数据源
插入数据
insert into admin(account,password,sex)values(#{account},#{password},#{sex})
#{ } 占位符,经过预编译的,编译好的SQL语句再取值,# 方式能够防止sql注入 ,安全的
${ } 字符串拼接方式,不安全,多用了传列名,而不是传数据
删除数据update admin set account=#{account}, password=#{password}, sex=#{sex} where id=#{id}
查询数据delete from admin where id=#{id}
其他查询
Mybatis-Dao 层 Mapper 接口
Mapper 接口开发方法只需要编写Mapper接口(相当于Dao接口),
由Mybatis框架根据接口定义创建接口的动态代理对象。
Mapper接口开发需要遵循以下规范:
1、Mapper.xml文件中的namespace与mapper接口的类路径相同
2、Mapper 接口方法名和Mapper.xml中定义的statement 的id相同
3、Mapper接口方法的输入参数类型和Mapper.xml 中定义的每个sql的parameterType的类型相同
4、Mapper 接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同
Reader reader= Resources.getResourceAsReader("mybatisconfig.xml"); SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(reader); SqlSession sqlSession =sqlSessionFactory.openSession(); AdminMapper adminMapper =sqlSession.getMapper(AdminMapper.class); adminMapper.saveAdmin(admin); sqlSession.commit(); sqlSession.close();5、 Mybatis日志
Mybatis内置的日志工厂提供日志功能,具体的日志实现有一下几种方式:
SLF4J | LOG4 | LOG4J2 JDK_LOGGING
COMMONS_LOGGING STDOUT_LOGGING NO_LOGGING
配置日志
将以下settings配置在mapper中
6、参数传递
简单的参数形式不需要使用parameterType 参数定义,例如:
User seletUsers(int id);
多个参数使用@Param(“id”)传递多个参数,使用注解标签参数绑定
Admin getAdmin(@Param("acc")String account,@Param("sex")String sex);
select * from admin where account=#{acc} and sex=#{sex}
如果传入一个复杂的对象,就需要使用parameterType 参数进行类型定义,例如:
void insertUser(User user);
insert into users(id,username,password) values (#{id},#{username},#{password})
也可以使用Map对象传递
void insertUser(Map
在sql中使用表达式获取map的键即可。
返回admin的数量个数
int getAdminCount();
POJO对象输出映射SELECT COUNT(*) FROM ADMIN
如果表中类名与类中属性名完全相同,mybatis会自动将查询结果封装到POJO对象中
如果java中使用标准驼峰命名,数据库中使用下划线连接命名,可以开始全局设置实现自动转换
需要在xml中的settings中进行配置
Admin getAdminById(int id);
定义resultMapselect * from t_admin where id=#{id}
resultmap自定义映射,列名与类中属性名不同,关联关系(单个,集合)
resulttype 具体返回值类型
SELECT emp.id, emp.name ename, emp.sex, d.name dname, a.account FROM employee emp LEFT JOIN dept d ON emp.deptId=d.id LEFT JOIN ADMIN a ON emp.adminId =a.id WHERe emp.id=#{id}
(1)本例的输出映射使用的是resultMap ,而非resultType
(2)resultMap 引用了employeemap
resultMap 元素中association,collection元素
association - 复杂类型联合
一对一结果映射
collection - 复杂类型集合嵌套结果映射
多对一 与 一对多
懒加载SELECT d.id, d.name dname, a.account, emp.name ename FROM dept d LEFT JOIN ADMIN a ON d.adminId = a.id LEFT JOIN employee emp ON d.id = emp.deptId WHERe d.id=#{id}
概念:需要查询关联信息时,使用Mybatis 懒加载特性可有效减少数据库压力,首次查询只查询主表信息,关联表的信息在用户获取时再加载。
Mybatis一对一关联的association 和一对多的collection可以实现懒加载。懒加载时要用resultmap。
启动懒加载
(1)先在xml文件中配置setting 来开启懒加载
9、注解方式select id,name,sex,deptId,adminId from employee where id=#{id} select name from dept where id=#{id} select account from admin where id=#{id}
适用于简单的sql语句
常用的注解标签
@Insert : 插入sql
@Select : 查询sql
@Update : 更新sql
@Delete : 删除sql
@Param : 入参
@Results : 设置结果集合
@Result : 结果
eg:
@Select("select * from employee")10、Mybatis动态SQL
MyBatis 的一个强大的特性之一通常是它的动态SQL能力。如果你有使用JDBC或其他相似框架的经验,你就会明白条件的的串联SQL字符串在一起多么痛苦,确保不能忘了空格或在列表的最后省略逗号。动态SQL可以彻底处理这种痛苦
MyBatis 中用于实现动态SQL的元素主要有:
If
where
trim
set
choose(when ,otherwise)
foreach
If元素
if标签可以对传入的条件进行判断
where
对于查询条件个数不确定的情况,可以使用 元素
元素会进行判断,如果它包含的标签中有返回值的话,他就会插入一个‘where’。
此外,如果标签返回的内容是以AND和OR开头,他就会剔除掉AND或OR。
SELECT emp.id, emp.name ename, emp.sex, d.name dname, a.account FROM employee emp LEFT JOIN dept d ON emp.deptId=d.id LEFT JOIN ADMIN a ON emp.adminId =a.id emp.name =#{name} and emp.sex=#{sex}
trim元素
where标签,其实trim 也可以表示,当where 后紧随and或者or 的时候,就去除and或者or。
prefix前缀,prefixOverrides覆盖首部指定内容
SELECT emp.id, emp.name ename, emp.sex, d.name dname, a.account FROM employee emp LEFT JOIN dept d ON emp.deptId=d.id LEFT JOIN ADMIN a ON emp.adminId =a.id emp.name =#{name} and emp.sex=#{sex}
Choose元素
SELECT emp.id, emp.name ename, emp.sex, d.name dname, a.account FROM employee emp LEFT JOIN dept d ON emp.deptId=d.id LEFT JOIN ADMIN a ON emp.adminId =a.id emp.name =#{name} and emp.name='李华'
set元素
可以把最后一个逗号去掉
每次加载一类,需要的话,再加载下一个 (修改不一定要把所有内容修改,只修改要修改的部分)
update employee name=#{name}, sex=#{sex}, deptId=#{dept.id}, adminId=#{admin.id}, id=#{id}
Foreach元素
主要用在构建in条件中,他可以在SQL语句中进行迭代一个集合。foreach元素的属性主要有item,index,collection,open,separator,close。
item 表示集合中每一个元素进行迭代时的别名,
index指定一个名字,用于表示在迭代过程中,每次迭代到的位置,open表示该语句以什么开始,separator表示在每次进行迭代之间以什么符号作为分隔符,close表示以什么结束,在使用foreach的时候最关键的也是最容易出错的就是collection属性,该属性是必须指定的,但在不同情况下,该属性的值是不一样的。
11、特殊符号处理select * from employee where sex in #{sex} select * from employee where sex in #{sex} select * from employee where sex =#{sex}
对符号进行转义
< < > > " " ’ ' & &
可以用 来包裹特殊字符
为什么使用缓存?缓存(cache)的作用是为了减去数据库的压力,提高数据库的性能。缓存实现的原理是从数据库中查询出来的对象在使用完后不要销毁,而是存储在内存,当再次需要获取该对象时,直接从内存中直接获取,不再向数据库执行select语句,从而减少对数据库的查询次数,提高数据库性能。
一级缓存只是相对于同一个sqlSession 而言
生命周期:
a、MyBatis在开启一个数据库会话时,会创建一个新的sqlSession 对象,SqlSession 对象中会有一个新的Executor对象,Executor对象中持有一个新的PerpetualCache对象,如果SqlSession调用了close()方法,会释放一级缓存PerpetualCache对象,一级缓存将不可用。
b、如果SqlSession调用了clearCache(),会清空PerpetualCache对象中的数据,但该对象仍然可以用。
c、SqlSession中执行了任何一个update *** 作(update()、delete()、insert()),会清空PerpetualCache对象中的数据,但该对象仍然可以用。
二级缓存是SqlSessionFactory级别的,根据mapper的namespace划分区域,相同的namespace的mapper查询的数据缓存在同一区域,如果使用mapper代理方法每个mapper的namespace都不同,此时可以理解为二级缓存区域是根据mapper划分。
配置:
1、在SqlMapperConfig.xml中启动二级缓存
2、POJO序列化
接口实现Serializable
3、配置映射文件
@Test public void find5(){ SqlSession sqlSession = MybatisUtil.getSession(); EmployeeMapper employeeMapper =sqlSession.getMapper(EmployeeMapper.class); employeeMapper.getEmplyeeByAge2("男"); // employeeMapper.getEmplyeeByAge2("男"); sqlSession.commit(); sqlSession.close(); SqlSession sqlSession1 = MybatisUtil.getSession(); EmployeeMapper employeeMapper1 =sqlSession1.getMapper(EmployeeMapper.class); employeeMapper1.getEmplyeeByAge2("男"); sqlSession1.commit(); sqlSession1.close(); }
只查找一次,在内存中找到
@Test public void find4(){ SqlSession sqlSession = MybatisUtil.getSession(); EmployeeMapper employeeMapper =sqlSession.getMapper(EmployeeMapper.class); employeeMapper.getEmplyeeByAge2("男"); // sqlSession.clearCache();//会清空PerpetualCache 对象中的数据,但该对象仍然可以使用 Employee employee =new Employee(); employee.setName("aaaa"); Dept dept =new Dept(); dept.setId(1); employee.setDept(dept); Admin admin =new Admin(); admin.setId(1); employee.setAdmin(admin); employeeMapper.updateEmployee(employee); //sqSession中执行任何一个 update() delete() insert() 都会清空PerpetualCache 对象中的数据,但该对象仍然可以使用 employeeMapper.getEmplyeeByAge2("男"); sqlSession.commit(); sqlSession.close();
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)