什么是JDBC?
JDBC(JavaDataBase Connectivity)就是Java数据库连接,说白了就是用Java语言来操作数据库。原来我们操作数据库是在控制台使用SQL语句来操作数据库,JDBC是用Java语言向数据库发送SQL语句
请列举使用JDBC的步骤?
1.加载驱动
2.建立连接
3.创建PreparedStatemnet或Statemnet对象
4.执行查询,得到结果集
5.遍历查询结果
6.释放资源,关闭连接
为什么需要框架技术?
如何更快更好地写简历?使用word简历模板
使用模板有什么好处呢?
不用考虑布局、排版等,提高效率、可专心在简历内容上、结构统一,便于人事阅读、新手也可以作出专业的简历
主流框架的介绍:
Mybatis的前生是ibatis,最后升级版本后叫mybatis。mybatis是以纯sql操作数据(动态sql),是一个持久层框架,比Hibernate灵活,但移植性差。DAO层、实体类与SQL语句之间建立映射关系,半自动化的ORM(对象/关系映射)实现。
Spring(开源的、轻量级框架),是一个JavaEE框架,支持IOC、DI、AOP,对DAO层的支持等简化开发功能
Spring框架有很多的模块,例如我们可以使用AOP模块实现日志管理功能,事物管理功能等。
Spring的模块包括:Spring Core、Spring AOP、Spring Web、 Spring Context、Spring Web MVC、Spring ORM、Spring DAO 等
Spring还可以很方便地与SpringMVC、Struts2、Hibernate等框架集成 (粘合剂,将大家组装到一起)
SpringMVC是Spring框架提供的构建Web应用程序的全功能MVC模块,支持多视图技术。
Spring和SpringMVC的区别?
Spring是一个JavaEE框架,支持IOC、DI、AOP。Spring框架有很多模块,每个模块可以独立运行
SpringMVC是一个Spring的一个模块,实现MVC设计思想
Struts2是一个MVC框架,而MVC是模型、视图、控制器的意思,可以实现业务逻辑和页面显示的分离,扩展性好。它的核心原理就是用一个核心的过滤器实现前端控制器的功能,结合struts的配置文件,实现请求的分发,和结果页面的调用。
SpringMVC和Struts2的区别?
1、Spring MVC 开发效率和性能要优于Struts2。
2、Spring MVC继承了Ajax,使用@ResponseBody可以获取json数据,使用@RequestBody可以在请求中发送json数据。
3、Struts中使用Ajax 比较麻烦。
4、Spring MVC 通过前端控制器 DispatcherServlet 完成请求的分发。入口是一个Servlet
5、Struts2 通过 FilterDispatcher(2.1.3以前)或 StrutsPrepareAndExecuteFilter(2.1.3和以后)完成请求的分发。入口是一个 Filter。
6、Spring MVC 是基于方法级别传递数据。单实例情况下不存在线程安全的问题。因为SpringMVC的参数是在控制器的方法中传递的。
7、Struts2是基于类级别传输数据。Struts2单实例情况下有线程并发问题,多实例情况下没有线程并发问题,但是效率又很低。也可以在单实例情况下使用ActionContext类传递数据,但是比较麻烦。
hibernate是一个基于ORM持久化框架,可以让程序员以面向对象的思想操作数据库,提高生产效率。
hibernate是一个开放源代码的对象关系映射,将JDBC进行了封装
DAO层,对象与数据表之间建立映射关系
什么是ORM?
ORM是一种思想,意思是对象关系映射(Object Relation Mapping),是基于pojo(领域模型)层的映射,映射的是对象和表、属性和列。如hibernate可以让你以面向对象的方式去编程。封装了JDBC
JDBC和ORM区别?
JDBC只是一个java操作数据库的规范接口而已
ORM是一种思想,对象关系模型(Object Relation Mapping),以面向对象的方式去编程。封装了JDBC
Spring,SpringMVC ,Struts2,hibernate,mybatis 分别是解决什么问题的?
SpringMVC 和 Struts2 是MVC框架,主要是将系统分为视图、模型、控制器三个层次,负责接收请求,调用业务层接口,给视图层返回需要的数据。降低系统的耦合性。
hibernate 和 mybatis 是持久层框架,解决如何存取数据库中的数据的问题,提高数据操作的效率。
Spring 实现依赖注入的功能,例如将dao对象注入service 层,同时spring 面向切面的特性可以实现程序中事物管理的功能,日志记录的功能等。
持久化与ORM
持久化是程序数据在瞬时状态和持久状态间转换的过程
瞬时状态就是临时状态,保存在内存中
数据在读取的时候都是从内存中进行读取的
持久状态长期的保存,保存在硬盘光盘
硬盘中的数据读取出来,持久化的数据转换成瞬时状态的
MyBatis简介
Mybatis的前生是ibatis,官网 http://mybatis.org 或者 MyBatis · GitHub
半自动化的ORM实现,实体类与SQL语句之间建立映射关系
特点:基于sql语法,简单易学
能了解底层封装过程
SQL语句封装在配置文件中,便于统一管理与维护,降低程序的耦合度
方便程序代码调试
搭建MyBatis开发环境
1.下载mybatis-3.5.1.jar并将所需jar文件导入工程
2.编写MyBatis核心配置文件configuration.xml
3.创建实体类(POJO)
4.定义DAO层Mapper接口、定义SQL映射文件
5.创建测试类
读取MyBatis核心配置文件 mybatis-config.xml
创建SqlSessionFactory实例,读取配置文件
创建SqlSession实例
创建Mapper实例执行SQL映射文件中的SQL语句
具体在IDEA中的创建步骤详见 创建web项目+引入jar包+编写配置文件.pdf
mybatis核心配置文件主要用于配置数据库连接和mybatis运行时所需的各种特性,包含了设置和影响mybatis行为的属性
为了方便在框架集成时更好的区分各个配置文件,我们一般将此文件名命名为 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>
<!-- 引入database.properties文件,连接数据库 -->
<properties resource="database.properties"></properties>
<!-- 配置mybatis的log实现为LOG4J -->
<settings>
<setting name="logImpl" value="LOG4J"/>
</settings>
<!-- 配置mybatis多套运行环境 -->
<environments default="development">
<environment id="development">
<!-- 配置事物管理,采用JDBC的事物管理 -->
<transactionManager type="JDBC"></transactionManager>
<!-- POOLED:mybatis自带的数据源,JNDI:基于Tomcat的数据源 -->
<dataSource type="POOLED">
<!-- property中的name属性值 是固定的 不能变 -->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${name}"/>
<property name="password" value="${pwd}"/>
</dataSource>
</environment>
</environments>
<!-- 将Mapper文件加入到配置文件中 -->
<mappers>
<mapper resource=""></mapper>
</mappers>
</configuration>
解说
configuration:配置文件的根元素节点
mybatis-config.xml文件的元素节点是有一定顺序的,节点位置若不按顺序排位,那么xml文件会报错
配置文件如果没有提示 需要手动的引入
解压mybatis-3.5.1.jar后,在\org\apache\ibatis\builder\xml 路径中,如图
mybatis-3-config.dtd是MyBatis框架的核心配置文件的DTD文件
mybatis-3-mapper.dtd是SQL映射文件的DTD文件
创建实体
对象的属性与数据库表的字段名一致
注:数据表的字段命名按照java的驼峰命名规则,这样在进行实体映射的时候,一是方便开发者的工作,二是使用mybatis框架开发,也方便数据表字段与实体类的属性进行自动映射
定义实体类相关的Mapper接口--------实体名称+Mapper的规则来进行命名
public interface UserMapper {
//注意 下面的方法名字要与Mapper映射文件中的id值一致
//查询用户表的记录数
public int count();
//查询用户列表
List<User> getUserList();
}
创建SQL映射文件-------实体名称+Mapper的规则来进行命名
映射文件的配置,该文件位于dao包下 命名如:UserMapper.xml
SQL映射文件一般都对应于相应的实体,所以一般都是采用 实体名称+Mapper的规则来进行命名。
Mapper文件属于DAO层的操作,应该放置在dao包下
<?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">
<!-- namespace:用于区分不同的Mapper,全局唯一 -->
<mapper namespace="com.msds.user.dao.UserMapper">
<!--查询用户表的记录数 id值为方法名 resultType为方法的返回类型 -->
<select id="count" resultType="int">
SELECT COUNT(1) AS COUNT FROM smbms_user
</select>
<!--查询用户列表-->
<select id="getUserList" resultType="com.msds.bean.User">
SELECT * FROM smbms_user
</select>
</mapper>
编写测试类
将放入lib下
为便于分类管理测试代码,可以在项目中新建一个test目录,用来存放测试相关的代码。右击test目录,在弹出的快捷菜单中选择如下
public class TestUserMapper {
private Logger log = Logger.getLogger(TestUserMapper.class);
//查询总记录数
@Test
public void countTest() {
SqlSession sqlSession = null;
try {
//1.读取mybatis-config.xml框架的核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//2.使用SqlSessionFactoryBuilder读取配置文件并构建SqlSessionFactory实例
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//3.创建SqlSession实例
sqlSession = factory.openSession();
//4.创建UserMapper接口实例,调用其方法执行相关的SQL语句
int num = sqlSession.getMapper(UserMapper.class).count();
log.info("TestUserMapper count------>" + num);
} catch (IOException e) {
e.printStackTrace();
} finally {
sqlSession.close();//关闭会话
}
}
//查询用户列表
@Test
public void getUserListTest(){
SqlSession sqlSession = null;
try {
//1.读取mybatis-config.xml框架的核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//2.使用SqlSessionFactoryBuilder读取配置文件并构建SqlSessionFactory实例
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);
//3.创建SqlSession实例
sqlSession = factory.openSession();
//4.创建UserMapper接口实例,调用其方法执行相关的SQL语句
List<User> list = sqlSession.getMapper(UserMapper.class).getUserList();
for (User user:list){
log.info("getUserListTest------>" + user.getUserCode()+"\t"+user.getUserName());
}
} catch (IOException e) {
e.printStackTrace();
} finally {
sqlSession.close();//关闭会话
}
}
}
搭建MyBatis与JDBC直观对比
MyBatis框架的优缺点
浅谈mybatis优缺点_wangpeng047的博客-CSDN博客_mybatis的优缺点
优点:
1)与JDBC相比,减少了50%以上的代码量
2)学习曲线短、灵活
3)sql全部写在xml文件中(从程序中彻底分离),便于管理和优化
4)可以写动态sql
缺点:
1)编写sql工作量大
2)不易于数据库移植
3)查询出结果集后,如果列名和属性不匹配,必须手工组装
注:Mybatis专注SQL本身,是一个足够灵活地DAO层解决方案,适用于性能要求较高或者需求多变的互联网项目
MyBatis基本要素——核心对象
SqlSessionFactoryBuilder、SqlSessionFactory、SqlSession作用域(Scope)和生命周期 - OKevin - 博客园
1.核心对象——SqlSessionFactoryBuilder
1.用过即丢,其生命周期只存在于方法体内
2.可重用其来创建多个SqlSessionFactory实例
3.负责创建SqlSessionFactory,并提供多个build方法的重载
注:SqlSessionFactoryBuild的最大特点是:用过即丢。一旦创建了SqlSessionFactory对象之后,这个类就不在需要存在了,因此SqlSessionFactoryBuild的最佳范围就是存在于方法体内,也就是局部变量而已
2.核心对象——SqlSessionFactory
SqlSessionFactory是每个MyBatis应用的核心
作用:创建SqlSession实例
作用域:Application
SqlSessionFactory对象一旦创建,就会在整个应用运行过程中始终存在。
没有理由去销毁或在创建它,并且在应用运行中不建议多次创建SqlSessionFactory。
因此SqlSessionFactory的最佳作用域是Application
生命周期:SqlSessionFactory的生命周期与应用周期相同
单例:存在整个应用运行时,并且同时值存在一个对象实例
3.核心对象——SqlSession
SqlSession适用于执行持久化操作对象,类似于JDBC中的Connection
1.包含了执行SQL所需的所有方法
2.对应一次数据库会话,会话结束必须关闭
3.非线程安全,不能共享
SqlSession生命周期:对应着一次数据库会话。在每次访问数据库时需要创建它(注意:并不是说在SqlSession里只能执行一次SQL,是完全可以执行多次的,但是若关闭了SqlSession,那么就需要重新创建它)
创建SqlSession:SqlSessionFactory对象的openSession()方法
SqlSession作用域:request作用域或者方法体作用域内
SqlSession的两种使用方式
1.通过namespace+id字符串运行映射的SQL语句
2.基于Mapper接口方式执行SQL语句
在以上代码的基础上编写工具类,优化SqlSessionFactory实例
public class MybatisUtil {
private static SqlSessionFactory factory;
static {
try {
//1.读取mybatis-config.xml框架的核心配置文件
InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
//2.使用SqlSessionFactoryBuilder读取配置文件并构建SqlSessionFactory实例
factory = new SqlSessionFactoryBuilder().build(is);
} catch (IOException e) {
e.printStackTrace();
}
}
//创建SqlSession
public static SqlSession createSqlSession(){
return factory.openSession(false);//false 开启事物控制 在第2章节会有体现
}
//关闭SqlSession
public static void closeSqlSession(SqlSession sqlSession){
if(sqlSession!=null){
sqlSession.close();
}
}
}
MyBatis基本要素——核心配置文件
mybatis-config.xml 核心配置文件
一、配置properties元素的两种方式
方式1.通过外部指定的方式(database.properties),实现动态配置
<properties resource="database.properties"/>
方式2.直接配置为XML,实现动态配置
<properties>
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/......"/>
<property name="user" value="root"/>
<property name="password" value="123456"/>
</properties>
注:若两种方式同时都用了,resource属性值的优先级高于property子节点配置的值
二、settings元素
用来修改MyBatis运行时的行为方式
只要是MyBatis的一些全局配置属性的设置
三、typeAliases元素 [ˈeɪliəsɪz]
类型别名
仅仅只关联XML配置,简写冗长的Java类名
上面的这种方式的弊端在于如果一个项目中有多个实体类的时候,需要一一进行配置,所以简化的写法就是通过package的name属性直接指定包名,MyBatis会自动扫描指定包下的JavaBean,并默认设置一个别名,默认名称就是JavaBean的非限定类名。
四、environments元素 [ɪnˈvaɪrənmənts]
表示配置MyBatis的多套运行环境,将SQL映射到多个不同的数据库上
子元素节点:environment,但是必须指定其中一个默认运行环境(通过default指定)
每个SqlSessionFatory实例只能选择一个运行环境
transactionManager事务管理器,MyBatis有两种事务管理类型即JDBC、MANAGED
dataSource元素使用基本的JDBC数据源接口来配置JDBC连接对象的资源
有三种内建的数据源类型 [UNPOOLED|POOLED|JNDI]
五、mappers元素
映射器,定义SQL映射语句
须在配置中引用mapper映射文件
方式一:使用类资源路径获取资源
方式二:使用Mapper接口的包路径