Mybatis架构
SqlMapConfig.xml 核心配置文件。
mapper.xml 实体的映射配置文件,书写sql。
SqlSessionFactory session的工厂。
SqlSession 核心操作对象。
一、使用方法
1、导入jar包,依赖包和核心包都导入。并且需要导入mysql驱动jar包connection。
2、配置核心配置文件SqlMapConfig.xml
写入头(约束)后Configuration–environments(与sping整合后将废除,用于连接数据库)
<?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">
3、pojo映射文件,catalog.xml
写入头,mapper中写入sql语句。在主配置中告知位置。可以在mapper配置命名空间区分其他xml。
4、创建工厂 任意名称
1、加载核心配置文件
2、创建工厂
3、创建session
根据用户名模糊查询
添加用户 必须让sqlSession.commit
添加并且同时返回ID(SQL是先保存数据后生成ID)
- 修改
- 删除
(二)Mybatis的优点
1、在xml配置了连接池,使用连接池管理连接。
2、传参,自动映射实体,获得实体里的值。(动态sql,不用想怎么拼接)
3、Sql语句写在配置文件xml中,易维护。
4、自动将执行结果映射到java对象(pojo),通过resultType指定返回类型。
(jdbc写在代码中,通过statement.query方法传入sql语句以及返回类型,且解析前需要遍历)
(三)Mybatis和Hibernate的区别
不同:
MyBatis需要程序员自己编写Sql语句,通过xml或注解灵活运行。通过实体对象和sql合成成最终的sql。执行结果再映射成java对象。
不完全是一个ORM框架,mybatis需要程序员自己写SQL语句。mybatis可以通过XML或注解的方式灵活配置要运行的SQL语句。
Mybatis优点:
门槛低,容易学,灵活sql,适合对关系数据模型要求不高的软件开发。
注意:无法做到数据库无关性,变换数据库则需要定义多套sql映射。
Hibernate优点:
对象/关系映射能力强,数据库无关性好,适用关系模型要求高的软件。节省代码,提高效率。但门槛高,如何设计映射麻烦。不好维护。
(四)框架开发设计的方法
使用mybatis通常有两种方法,原始Dao或者mapper动态代理。
原始Dao设计方法
弊端:冗余太多,硬编码。
Dao层
Junit模拟service层
Mapper动态代理:写接口,自动帮我生成好对象并执行。
原则1:mapper接口的方法名与XML定义的statement的id相同。
原则2:输出,返回类型相同。
原则3:输入,参数类型相同。
原则4:XML的namespace与mapper接口的类路径相同。
优点:节省代码,防止硬编码。冗余少
写catalog mapper接口如下,满足4个原则
并于原catalog(mapper).xml配置
便可以直接调用方法。
(五)其他注意事项
核心SqlMapConfig.xml的其他配置
SqlMapConfig.xml中配置的内容和顺序如下:
properties(属性) 可以加载其他配置信息文件
settings(全局配置参数)
typeAliases(类型别名)(给某个类取别名,甚至可以直接别名一个包)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境集合属性对象)
—environment(环境子属性对象)
transactionManager(事务管理)
dataSource(数据源)
mappers(映射器)
其他注意事项:
1、在xml写sql语句的时候
#{vv} 相当于变量并且两边加单引号。
${value}不加单引号
#{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换。#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。
2、resultType 自动映射,resultMap 手动映射
3、selectOne查询一条记录,如果使用selectOne查询多条记录则抛出异常
动态代理对象调用sqlSession.selectOne()和sqlSession.selectList()是根据mapper接口方法的返回值决定,如果返回list则调用selectList方法,如果返回单个对象则调用selectOne方法。