框架
将重复的,繁琐的代码实现封装,让程序员将更多的精力放在业务的理解和分析上。
框架的作用
提高开发效率
隐藏细节
三大框架SSH --> SSM
1) 表述层: 用户交互 servlet SpringMVC/Struts2
2) 业务逻辑层:业务处理 javabean/ejb Spring
3) 数据持久层:数据库交互 jdbc Mybatis/Hibernate
传统JDBC的不足
1) 四个参数的使用有硬编码(配置文件)
2) statement的使用中有硬编码
3) 频繁打开和关闭连接(数据源(连接池))
Mybatis框架
MyBatis 是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。
Mybatis是一个优秀的ORM框架。
ORM:Object Relationship Mapping(对象关系映射)
Mybatis不需要开发人员过多关注数据库的连接关闭,stmt对象的创建;着重关注sql。
关注映射: 输入参数 和 输出结果。
1) mybatis下载
apache ibatis前身。
google code à Mybatis
github
2) https://github.com/mybatis/mybatis-3/releases
Mybatis的开发
1)配置文件 (xml)
a)xfg.xml:核心配置文件(全局配置文件)
连接信息的配置(连接池),事务管理
b) mapper.xml:映射文件
2) SqlSessionFactory:session工厂
3)SqlSession:面向程序员的接口(增删改查)
4)搭建
a) 创建java项目,导入jar
b)配置核心配置文件(xml)
核心配置文件:
<!-- DTD:定义/约束 --> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <!-- Mybtais核心配置文件:任何的地方都可以获取 --> <configuration> <!-- environments:环境集合(mysql/oracle) default:默认(环境的id) --> <environments default="development"> <!-- environment:代表一个环境 id:唯一标识 transactionManager:事务管理器(管理事务) type:jdbc dataSource:数据源(连接池) 连接池:当项目启动,向数据库请求初始化连接数条连接放置在连接池中管理; 当连接的请求多于初始化连接数,此时会根据步长来增加连接数(创建连接); 最大不超过最大连接数,人就不够时需要根据超时时间进行等待; 当连接的请求远低于当前的连接数,此时会根据最小连接数释放相应的连接。 好处:减少了连接的频繁关闭。 缺点:连接需要占用资源 必须配置四个参数 driver url username password 流行的数据源:DBCP C3P0 DROID type="POOLED"("池") --> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql:///bd1711"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <!-- 映射器 --> <mappers> <mapper resource="BookMapper.xml"/> </mappers> </configuration>
mapper映射文件
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <!-- mapper:描述对象和记录之间的映射关系 namespace:隔离sql,在mapper代理时由特殊用法 --> <mapper namespace="com.lee"> <!-- 查询的映射: (Statement对象) id:该标签的唯一标识 resultType:结果类型 (输出结果的映射) #{}:代表占位符 parameterType:输入参数类型(输入参数的映射)(可省略) --> <select id="selectBook" resultType="entity.Book"> select * from book where bid = #{bid} </select> </mapper>
测试代码
//加载配置文件为流
InputStream is = Resources.getResourceAsStream("Mybatis.xml");
//创建SqlSessionFactory(加载)
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);
//核心接口(发送增删改查语句)
SqlSession session = ssf.openSession();
Book book = session.selectOne("com.lee.selectBook", 1);
System.out.println(book);
//释放资源
session.close();
配置详解
核心配置文件
properties <!-- 1.配置(动态替换) 1.1 java的属性文件外部引入 resource="jdbc.properties" 1.2 property标签中配置 当两者冲突时,最终使用java的属性文件的配置。 --> <properties resource="jdbc.properties"> <!-- <property name="driver" value="com.mysql.jdbc.Driver"/> --> </properties> settings <!--2.settings 调整:影响整个Mybatis的行为 --> <settings> <!-- 缓存总开关: 默认true,开启缓存 / false关闭缓存 --> <setting name="cacheEnabled" value="true"/> <!-- 延迟加载总开关: 默认false,默认是立即加载 / true延迟加载 --> <setting name="lazyLoadingEnabled" value="true"/> </settings> typealiases <!-- 3.别名 typeAlias:单一类型起别名 type:需要设置别名的全限定名称 alias:别名 package:包 默认别名就是类型(首字母大小写均可) --> <typeAliases> <!-- <typeAlias type="entity.Book" alias="book"/> --> <package name="entity"/> </typeAliases> typeHandlers: 类型处理器 objectFactory:对象工厂 enviroment <environment id="development"> <!-- 事务管理器: JDBC: 和JDBC使用同样的提交和回滚策略 MANAGED:依赖于应用服务器上下文(context)的配置(必须在服务器上运行) --> <transactionManager type="JDBC"/> <!-- 数据源: c3p0,droid UNPOOLED:请求时连接,完毕时关闭 POOLED:连接池 JNDI:依赖于应用服务器(在上下文配置数据源,然后在java获取上下文的引用从而获取数据源) --> <dataSource type="POOLED"> <property name="driver" value="${db.driver}"/> <property name="url" value="${db.url}"/> <property name="username" value="${db.user}"/> <property name="password" value="${db.pwd}"/> </dataSource> </environment> mappers <!-- 映射器 :作用 寻找映射文件,sql--> <mappers> <!-- 1.相对于src映射文件的相对路径 --> <mapper resource="BookMapper.xml"/> <!-- 2.url:全路径 --> <!-- 3.class:使用mapper接口的class --> <!-- 4.package:注册整个包下所有的文件(mapper代理开发) --> </mappers>
映射文件
<!-- 1.使用二级缓存 --> <cache></cache> <!-- 2.引用其他命名空间缓存 --> <cache-ref namespace=""/> <!-- 3.实现复杂的类型封装 --> <resultMap type="" id=""></resultMap> <!-- 4.可被重用的语句块 --> <sql id="bookCols"> bid,bname,author,price </sql> 查询: select (查询一个,查询所有,模糊查询,分页查询) <!-- 模糊查询 :缺陷 有sql注入的风险 / 但是使用不同字段作排序时必须使用 --> <select id="selectLike" resultType="book"> select * from book where bname like '%${value}%' </select> <!-- 分页查询 1.编写类 2.map 3.rowbounds --> <select id="selectByPage" resultType="book" parameterType="map"> select * from book limit #{startRow},#{length} </select> <select id="selectByPage2" resultType="book"> select * from book </select> 增删改:insert update delete 主键返回 <!-- 插入 主键返回(用于建立多表之间的关系) --> <insert id="insertBook" parameterType="book" useGeneratedKeys="true" keyProperty="bid"> insert into book(bname,author,price) values(#{bname},#{author},#{price}) </insert> <insert id="insertBook2" parameterType="book"> <selectKey keyProperty="bid" order="AFTER" resultType="int"> <!-- select LAST_INSERT_ID() --> <!-- select SEQ_BOOK.nextval from dual --> </selectKey> insert into book(bname,author,price) values(#{bname},#{author},#{price}) </insert>
Eclipse导入本地dtd约束