为什么要学习框架技术:
PTT模板举例:做ppt前, 总是会需要找一些模板, 优点;
不同公司,不同的人写代码都会有所不同...
框架的强大之处不是它可以让你,做什么而是,它不能让你做什么; —————— Rickard Oberg
一千个人心中有一千个哈姆雷特,框架使混乱的东西变大结构化,一千个人可以写出一千种 Servlet+JSP+JavaBean…
主流框架的介绍SSM集成框架指的就是 Spring 控制层 +SpringMVC 表现层 +MyBatis 持久层 技术框架 不同框架表示不同的技术领域
数据持久化概念
数据持久化是将数据模型
转换成 存储模型
同时可以 存储模式
转换为 数据模型
eg:文件的存储就是,数据读取等数据持久化操作,数据模型可以任何数据结构对象模型, 存储模型也可以是 XML 二进制 …
简介
MyBatis是一个开源的数据持久层框架, 内部封装 JDBC 访问数据库的操作, 支持普通的sql 数据库操作 存储过程 高级映射 , 几乎消除所有的JDBC代码和参数的手工设置以及结果集检索;
MyBatis作为持久层框架,主要思想是将大量的sql语句抛离出来,配置在配置文件中, 实现了Sql 的灵活配置, 这样做的好处是将sql 与程序分离在不修改代码的情况下直接在配置文件中修改Sql 语句;
MyBatis 前身是iBatis 本是Apace 的开源项目; 2013迁移至Github
MyBatis官网 | http://mybatis.org
Github 官网 | http://github.com/mybatis
ORM
ORM(Object/Relational Mapping) 即对象/关系映射,是一种对数据持久化操作;对DAO方法进行SQL映射;
它在对象模型 和 关系型数据库之间建立起对应关系,通过JavaBean对象去操作数据库表中的数据;
基于ORM, MyBatis在对象模型 和 关系型数据库的表之间建立一座桥梁, 通过MyBatis建立SQL关系映射 实现增删改查....
环境搭建
下载Jar包——部署Jar——编写核心配置文件——创建实体类 POJO —(创建接口)—映射文件——测试类实现;
一般将文件命名为 mybatis-config.xml 该文件需要配置 MyBatis的参数;
MyBatis-config.xml元素节点是有一定顺序,节点顺序若不安顺序排位那么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">
<!-- 通过这个配置文件完成mybatis与数据库的连接 -->
<configuration>
<!--引入database.properties文件 -->
<!-- <properties resource="database.properties" /> -->
<!--resource引用文件属性值的优先级高于property子节点配置的值,两者可以相互使用不会影响;或 URL:指定对应文件 (两个只能使用一个不能同时使用!)-->
<properties resource="datebase.properties">
<property name="username" value="root" />
<property name="password" value="ok" />
</properties>
<!-- 修改 MyBatis 在运行时的行为方式:可选 -->
<settings>
<setting name="logImpl" value="LOG4J" /> <!-- 设置MyBatis的log日志实现为LOG4J,即使用log4j实现日志功能。 -->
<!--设置resultMap的自动映射级别,NONE(禁止自动匹配),PARTIAL(默认)自动匹配所有属性,有内部嵌套(association、collection)的除外 且 数据库列与实体类名相同,FULL(自动匹配所有属性)比PARTIAL更强! -->
<setting name="autoMappingBehavior" value="FULL" />
</settings>
<!--typeAliases元素配置类型,方便在mapper配置文件中的使用(起简化作用) -->
<typeAliases>
<!-- <typeAlias alias="user" type="com.smbms.pojo.User" /> 给类型起别名,Mapper.xml文件可以直接使用 alias 获取表示 type的类型; -->
<!--package属性会根据name的包名自动扫描JavaBean的类名,更加简化了使用typeAlias属性配置实体类的别名,简化代码; -->
<package name="com.wsm.pojo" />
</typeAliases>
<!-- 配置环境 -->
<environments default="development"> <!-- 默认的运行环境 ID -->
<environment id="development"> <!-- 运行环境 ID -->
<!--MyBatis两种事务管理器 JDBC:利用java.sql.Connection对象完成对事务的使用; MANAGED:Mybatis自身不在去实现事务管理,而是让程序容器(JBOSS,WebLogic)实现事务管理 -->
<transactionManager type="JDBC"></transactionManager> <!-- 事务管理器配置 -->
<!-- MyBatis数据源: POOLED:mybatis自带连接池的数据源 JNDI:使用JNDl的数据源 UNPOOLED:不使用连接池的数据源-->
<dataSource type="POOLED"> <!-- 数据源配置:因为前面引用了,所以后面就可以直接使用 ${name} 形势取到值,进行赋值操作... -->
<property name="driver" value="${driver}"/> <!-- com.mysql.jdbc.Driver -->
<property name="url" value="${url}"/> <!-- jdbc:mysql://localhost:3306/数据库 -->
<property name="username" value="${user}"/> <!-- root -->
<property name="password" value="${password}"/> <!-- ok -->
</dataSource>
</environment>
<environment id="WSM" >
....
</environment>
<!-- 根据default 指定对应ID,配置不同的数据库... -->
</environments>
<!-- 将mapper映射文件加入到配置文件中
resource:引入隐射文件; 或使用 URL="file:///引入绝对路径,别忘了前缀"
-->
<mappers>
<mapper resource="指向映射文件 项目路径如果不好找可以,右击文件选择Copy Qualified Name "/>
<mapper resource="映射文件Mapper.xml" />
</mappers>
</configuration>
<!--
configuration:配置文件根元素节点
properties:通过resource属性引用外部的properties属性文件 (database.properties),该文件存放连接数据库的基本配置。
setting:设置MyBatis运行的行为,比如此处设置MyBatis的log日志实现为LOG4J,即使用log4j实现日志功能。
typeAliases : 默认名称:指定包下JavaBean的非限定类名
environments:配置MyBatis多套运行环境,将sql映射到多个不同的数据库上,该元素节点下可以配置多个environment子节点,但是必须指定其中一个默认运行环境(通过的default指定)
environment:配置MyBatis一套运行环境,指定运行环境的id,事务管理,数据源配置信息。
mappers:作用告诉MyBatis去哪里找到SQL映射文件(该文件内容是开发者定义的映射SQL语句),整个项目可以有一个或者多个SQL映射文件
mappers子元素节点,具体指定SQL映射文件路径
**MyBatis-config.xml元素节点是有一定顺序,节点顺序若不安顺序排位那么xml文件会报错。**
-->
setting功能:
例子:
<!--是否启用延迟加载-->
<settings>
<setting name="lazyLoadingEnabled" value="false" />
</settings>
datebase.properties配置文件
driver=com.mysql.jdbc.Driver url=jdbc:mysql://localhost:3306/数据库 #username=root #password=ok #: #表示注释, 注释的不会显示, 配置文件可以和 Mybatis-config.xml 中 < properties > 节点一起使用不会有影响l #Myelicpse:快速查询类 ctrl+shift+t 输入类名Driver可以查看 log4j.properties配置文件:
log4j.rootLogger=DEBUG,CONSOLE,file
#log4j.rootLogger=ERROR,ROLLING_FILE
log4j.logger.cn.smbms.dao=debug
log4j.logger.com.ibatis=debug
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=debug
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=debug
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=debug
log4j.logger.java.sql.Connection=debug
log4j.logger.java.sql.Statement=debug
log4j.logger.java.sql.PreparedStatement=debug
log4j.logger.java.sql.ResultSet=debug
log4j.logger.org.tuckey.web.filters.urlrewrite.UrlRewriteFilter=debug
######################################################################################
# Console Appender \u65e5\u5fd7\u5728\u63a7\u5236\u8f93\u51fa\u914d\u7f6e
######################################################################################
log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender
log4j.appender.Threshold=error
log4j.appender.CONSOLE.Target=System.out
log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout
log4j.appender.CONSOLE.layout.ConversionPattern= [%p] %d %c - %m%n
######################################################################################
# DailyRolling File \u6bcf\u5929\u4ea7\u751f\u4e00\u4e2a\u65e5\u5fd7\u6587\u4ef6\uff0c\u6587\u4ef6\u540d\u683c\u5f0f:log2009-09-11
######################################################################################
log4j.appender.file=org.apache.log4j.DailyRollingFileAppender
log4j.appender.file.DatePattern=yyyy-MM-dd
log4j.appender.file.File=log.log
log4j.appender.file.Append=true
log4j.appender.file.Threshold=error
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{yyyy-M-d HH:mm:ss}%x[%5p](%F:%L) %m%n
log4j.logger.com.opensymphony.xwork2=error
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="命名空间:一般引用对应的接口类地址,也可以随便起名,如果面向接口编程则必须要是对应接口的地址引用...">
<!-- Mybatis框架,底层会自动的实现接口方法; -->
<!--
id: 可以随意,如果是面向接口编程的则需要是对应接口的方法名即可;
resultType: 结果类型: result译:结果 Type译:类型;
一般只有查询语句会有的,返回结果类型,完整类名 或 通过MyBatis-Config.xml:typeAliases 元素设置的别名;
parameterType: 参数类型: Sql语句需要传入的参数类型,它支持基本数据类型 和 复杂数据类型
eg: String int 或实体类..typeAliases 元素设置的别名映射; 对于许多Java内建类型大小写并不敏感;
-->
<!-- 非面向接口 -->
<select id="all" resultType="User" >
SELECT * FROM `smbms_user`
</select>
<!-- 查询用户表记录数 -->
<select id="count" resultType="int">
select count(1) as count from User
</select>
<insert id="xinzeng" parameterType="map" >
INSERT into `smbms_user` values
(null,#{userCode},#{userName},#{userPassword},1,'1983-10-10','13688889999','北京市东城区前门东大街9号',2,1,'2020-08-18 09:56:31',NULL,NULL);
</insert>
</mapper>
上面的文件中的 <!DOCTYPE ... > 文档声明指定的是 url..路径, 一般还需要进行环境的配置..
Myelicpse DTD文件引入
MyBatis 两种配置文件:核心配置文件Mybatis-config.xml 和 Sql映射 mapper.xml 这两个配置文件都需要手动引入各自的 DTD文件,mybatis-3-config.dtd | mybatis-3-mapper.dtd 否则在编写配置文件时候,文件元素属性不能自动联想。 MyElicpse配置: 工具栏——window——preferences——输入XML——选择XMLCatalog——单击Add——弹框 Location: FileSystem 选择DTD文件位置——Key 中输入对应的属性;——ok 保存即可; mybatis-3-config.dtd key属性:**
-//mybatis.org//DTD Mapper 3.0//EN
mybatis-3-mapper.dtd *key属性:**-//mybatis.org//DTD Config 3.0//EN
Myelicpse创建对应xml : New——XML(Basic Templates)——起名,不要直接Finish, Next——选择DTD File——选择Select XML…,在下面XML_CataLog选择对应的Key…
因为经常常用所以建议创建一个类专门用于创建 SqlSession的类 MyBatisUtil.Java;
private static SqlSessionFactory factory;
//作用:SQLSessionFactory简单理解为SqlSession实例工厂。
//SqlSession session = sqlSessionFactory.openSession(boolean autoCommit); true:关闭事务控制(默认) false:开启事务控制
//如果是 false,则只能查看 赠删改 需要手动提交; sqlSession.commit();
//作用域:Application 生命周期与应用的生命周期相同
//单例模式: 存在于整个应用运行时,并且同时只存在一个对象实例
// 静态代码块
static {
try {// 1.获取mybatis-config.xml文件的输入流 读取XML文件构造方式:
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
//SqlSessionFactoryBuilder 负责构建SqlSessionFactory,并提供多个build方法的重载 常用的有↓👇
/*
build(InputStream inputStream, String environment, Properties properties)
build(Reader reader, String environment, Properties properties)
build(Configuration config)
配置信息以三种形式提供给SqlSessionFactory的build方法:
InputStream(字节流)、Reader(字符流)、Configuration(类)
*/
// 2.创建sqlsessionfactory对象,完成对配置文件的读取
factory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
}
}
// 3.创建SqlSession对象
//作用:执行持久化操作,类似于JDBC中的Connection提供执行Sql命令所需的所有方法,可以通过Sqlsession实例直接映射到SQL语句。
// •包含了执行SQL所需的所有方法 select(); update(); insert(); delete(); ...多种重载方法;
// •对应一次数据库会话,会话结束必须关闭 •线程级别,不能共享
//注意:关闭SqlSession非常重要,必须要确保正常关闭,在SqlSession里可以执行多次SQL语句,但一旦关闭了SqlSession就需要重新创建
public static SqlSession createSqlSession() {
// 参数false表是开启事务控制,不传参数表示默认为true(为自动提交事务)
return factory.openSession(false);
}
// 关闭Sqlsession对象
public static void closeSqlSession(SqlSession sqlSession) {
if (null != sqlSession) {
sqlSession.close();
}
}
核心对象 | 最佳生命周期 | 最佳作用域 |
---|---|---|
SqlSessionFactoryBuilder | 方法体内 | 方法体内(局部变量) |
SqlSessionFactory | 从应用服务启动开始一直到应用服务停止—application | 整个应用内 |
SqlSession | 一次请求的有效期 | 一次请求的有效期内 |
运行类
public static void main(String[] args) {
}
@Test //非面向接口形式查询全部;
public void all(){
// 获取SqlSession 对象;
SqlSession session = MyBatisUtil.createSqlSession();
// 根据SqlSession对象的 selectList(); 方法获取对应用户集合; 参数对应 Mapper.xml文件 命名空间.对应sql id;
List<User> users = session.selectList("com.wsm.dao.UserMapper.all");
// 关闭...
MyBatisUtil.closeSqlSession(session);
for (User user : users) {
System.out.println(user.getId() + "\t" + user.getUserCode() + "\t" + user.getUserName() + "\t" + user.getPhone()
+ "\t" + user.getAddress());
}
};
@Test //非面向接口形式查询全部;
public void add(){
//新增需要参数, 而且是多个参数,可以使用 对象 或 Map 或 @Param("") 注解...这里使用Map;
Map<String,Object> map = new HashMap<String, Object>();
//(null,#{userCode},#{userName},#{userPassword},1,'1983-10-10','13688889999','北京市东城区前门东大街9号',2,1,'2020-08-18 09:56:31',NULL,NULL);
map.put("userCode","lala");
map.put("userName","WSM");
map.put("userPassword","123123"); //根据Sql语句,Map 传对应的 key value; #{xx} 相当于 map.key取对应的value值;
SqlSession session = MyBatisUtil.createSqlSession();
int jg = session.insert("com.wsm.dao.UserMapper.xinzeng",map); //返回影响行数结果;
if(jg==1){
System.out.println("新增成功");
}else{
System.out.println("新增失败");
}
};
@Test
public void count(){
SqlSession session = MyBatisUtil.createSqlSession();
int count = session.selectOne("com.wsm.dao.UserMapper.count"); //返回结果;
MyBatisUtil.closeSqlSession(session);
System.out.println("总共"+count+"条数据");
}
}
这里只是笔记 代码还需多练—— 实例代码
MyBatisDemo
笔记还不全后面学习SSM 会继续填补,感谢支持留个心心♥呗~ ^y^