目录
第一章 框架的概述
1.三层架构
2.三层请求处理流程
3.为什么要使用三层架构
4.三层架构模式和框架
5.框架
6.框架解决的问题
7.jdbc访问数据库的优缺点
8.MyBatis框架简介
1.什么是mybatis?
2.mybatis能做什么?
第二章 Mybatis入门
1.第一个例子
2.概念
1.自动提交
2.手动提交事务
3.mybatis的一些重要对象
1.Resources
2.SQLSessionFactoryBuilder
3.SqlSessionFactory:重要对象
4.SqlSession对象
4.使用工具类和模板
第三章 MyBatis的Dao代理
1.dao代理
2.理解参数
1.parameterType
2.dao接口是一个简单类型的参数
3.dao接口方法有多个简单类型的参数
4.dao接口方法使用一个对象作为参数
5.dao接口中多个简单类型的参数,使用位置
6.dao接口是一个Map
3.占位符 # 和 $ 的区别
1.#占位符
2.$占位符
4.封装mybatis输出结果
1.resultType
2.resultMap
5.自定义别名
6.数据库中的列名和java对象属性名称不一样的解决方式
7.like
1.第一种方式:在java程序中,把like的内容组装好 。把内容传入到sql语句
2.第二种方式:在sql语句中,组织like内容
第四章 动态sql
1.if标签
2.where标签
3.foreach
1.第一种方式,循环简单类型的List
2.第二种方式,循环对象类型的List
4.sql标签
第五章 MyBatis配置文件
1.settings部分
2.typerAliases 别名
3.配置环境
4.使用数据库属性配置文件
5.mapper标签
第六章 PageHelper
第一章 框架的概述
1.三层架构
MVC:web开发中,使用mvc架构模式。Model:数据,View:视图,Controller:控制器
Controller控制器层:接受请求,调用service对象,显示请求的处理结果。当前使用servlet作为控制器
View视图层:现在使用jsp,html,css,js。显示请求的处理结果,把Model中的数据显示出来
Model数据层:来自数据库mysql,来自文件,来自网络
mvc作用:
1.实现解耦合
2.让mvc各司其职
3.使的系统扩展更好。更容易维护
三层架构:
1.界面层(视图层):接受用户的请求,调用service,显示请求的处理结果。包含jsp、html,servlet等对象。对应的包controller,包中很多的XxxController类,例如:UserController,StudentController
2.业务逻辑层:处理业务逻辑,使用算法处理数据。把数据返回给界面层。对应的是service包,包中很多XxxService类。例如:UserService,StudentService
3.持久层(数据访问层):访问数据库,或者读取文件,访问网络。对应的包dao。dao包中很多的XxxDao类,例如:UserDao,StudentDao
2.三层请求处理流程
1.请求处理流程
用户发起请求 -----> 界面层 -----> 业务逻辑层 -----> 持久层 -----> 数据库
3.为什么要使用三层架构
1.结构清晰。耦合度低,各级分工明确
2.可维护性高,可扩展性高
3.有利于标准化
4.开发人员可以只关注整个结构中的某一层的功能实现
5.有利于各层逻辑的复用
4.三层架构模式和框架
每一层都对应着一个框架
1.界面层 ---> SpringMVC框架
2.业务层 ---> Spring框架
3.持久层 ---> MyBatis框架
5.框架
1.什么是框架(framework)
框架:就是一个软件,完成部分的功能。软件中的类和类之间的方法调用都已经规定好了。通过这些可以完成某些功能。框架看作是模板。
框架是可以升级的,改造的。框架是安全的。框架是对某一方面有用的,不是全能的。
6.框架解决的问题
1.框架能实现技术的整合
2.提高开发效率。降低难度。
7.jdbc访问数据库的优缺点
优点:
1.直观,好理解
缺点:
1.创建很多的Connection,Statement,ResultSet
2.注册驱动
3.执行sql语句
4.使用ResultSet读取数据,然后通过代码转化为具体的POJO对象
5.关闭数据库相关的资源
6.sql语句和业务逻辑代码混在一起
8.MyBatis框架简介
1.什么是mybatis?
是一个持久层框架,原名ibatis,2013年改名为MyBatis,mybatis可以操作数据库,对数据进行增删改查。可以看作是高级的jdbc。解决jdbc的缺点。mybatis底层依然是jdbc。
mybatis – MyBatis 3 | 简介https://mybatis.org/mybatis-3/zh/index.html
2.mybatis能做什么?
1.注册驱动
2.创建jdbc中使用的Connection,Statement,ResultSet
3.执行sql语句,得到ResultSet
4.处理ResultSet,把记录集中的数据转化为java对象,同时还能把java对象放到List集合
5.关闭资源
6.实现sql语句和java代码的解耦合
第二章 Mybatis入门
1.第一个例子
1.在数据库中创建student表(id,name,Email。age)
2.新建maven项目
3.修改pom.xml
(1)加入依赖mybatis依赖,mysql驱动,junit
(2)在
4.创建实体类student。定义属性,属性名和列名相同
5.创建xml文件(mapper文件)写sql语句
(1)mybatis框架推荐是把sql语句和java代码分开
(2)mapper文件:定义到和dao接口同一目录
6.创建mybatis的主配置文件(xml文件):有一个,放在resources目录下
(1)定义创建连接实例的数据源(DataSource)对象
(2)指定其他mapper文件的位置
7.创建测试的内容
(1)使用main方法,测试mybatis访问数据库
(2)也可以使用junit访问数据库
mapper文件:
mybatis的主配置文件:
2.概念
1.自动提交
当你的sql语句执行完毕后,提交事务。数据库更新操作直接保存到数据库
2.手动提交事务
在你需要提交事务的位置,执行方法,提交事务或回滚事务
1.默认关闭自动提交事务
2.需要调用commit()方法
3.mybatis的一些重要对象
1.Resources
mybatis框架中的对象,一个作用读取主配置信息
InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
2.SQLSessionFactoryBuilder
负责创建SqlSessionFactory对象
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);
3.SqlSessionFactory:重要对象
SqlSessionFactory是重要级对象:创建此对象需要使用更多的时间和资源。在项目中有一个就可以了。
SqlSessionFactory接口:作用是SqlSession的工厂,就是创建SqlSession对象
DefaultSqlSessionFactory实现类:
public class DefaultSqlSessionFactory implements SqlSessionFactory { }
SqlSessionFactory接口中的方法
openSession():获取一个默认的SqlSession对象,默认是需要手工提交事务的
openSession(boolean):boolean参数表示是否自动提交事物
true:创建一个自动提交事务的SqlSession
false:等同于没有参数的openSession
SqlSession session = factory.openSession(true);
4.SqlSession对象
SqlSession对象是通过SqlSessionFactory获取的。SqlSession是接口
DefaultSqlSession:实现类
public class DefaultSqlSession implements SqlSession { }
SqlSession作用是提供了大量的执行sql语句的方法:
selectOne:执行sql语句,最多得到一行记录,多于一行报错。
selectList:执行sql语句,返回多行数据
selectMap:执行sql语句,得到一个Map结果
insert:执行insert语句
update:执行update语句
delete:执行delete语句
commit:提交事务
rollback:回滚事务
注意:SqlSession对象不是线程安全的,使用步骤
① 在方法内部,执行sql语句之前,先获取SqlSession对象
② 调用SqlSession的方法,执行sql语句
③ 关闭SqlSession对象,执行SqlSession.close()
4.使用工具类和模板
(1)创建模板,mapper文件模板和mybatis主配置模板
创建模板的步骤:
(2)创建MyBatisUtil工具类
package com.shangma.utils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class MyBatisUtil {
private static SqlSessionFactory factory = null;
static {
String config = "mybatis.xml";
try {
InputStream inputStream = Resources.getResourceAsStream(config);
factory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//创建方法,获取SqlSession对象
public static SqlSession getSqlSession(){
SqlSession sqlSession = null;
if (factory != null){
sqlSession = factory.openSession();//openSession(true);
}
return sqlSession;
}
}
第三章 MyBatis的Dao代理
1.dao代理
(1)mybatis提供代理
mybatis创建Dao接口的实现类对象,完成sql语句的执行。mybatis创建一个对象代替你的dao实现类功能
(2)使用mybatis代理要求
1.mapper文件的namespace一定是dao接口的全限定名称
2.mapper文件中标签的id是到接口方法名称
(3)mybatis代理实现方式
使用SQLSession对象的方法getMapper(dao.class)
例如:现在有StudentDao接口
SqlSession session = MybatisUtils.getSqlSession();
StudentDao dao = session.getMapper(Student.class);
Student student = dao.selectById(1001);
//上面的代码中
StudentDao dao = session.getMapper(Student.class);
等同于
StudentDao dap = new StudentDaoImpl();
代码演示:
package com.shangma;
import com.shangma.dao.StudentDao;
import com.shangma.entity.Student;
import com.shangma.utils.MyBatisUtil;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import java.util.List;
public class MyTest {
@Test
public void testSelectById(){
//1.获取SQLSession
SqlSession sqlSession = MyBatisUtil.getSqlSession();
//2.获取dao的代理
StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
Student student = studentDao.selectById(1006);
System.out.println(student);
//3.关闭SqlSession对象
sqlSession.close();
}
@Test
public void testSelectStudents(){
SqlSession sqlSession = MyBatisUtil.getSqlSession();
StudentDao dao = sqlSession.getMapper(StudentDao.class);
List students = dao.selectStudents();
for (Student student : students) {
System.out.println(student);
}
}
}
2.理解参数
1.parameterType
parameterType:表示参数的类型,指定dao方法的形式参数类型。这个形参的数据类型是给mybatis使用
mybatis在给sql语句的参数赋值时使用。preparedStatement.setXxx(位置,值)
第一种用法:
java类型的全限定名称 parameterType = "java.lang.Integer"
第二种用法:
mybatis定义的java类型的别名 parameterType = “int”
2.dao接口是一个简单类型的参数
简单类型:java基本数据类型和String
Student selectByName(String name);
mapper文件,获取这个参数值,使用#{任意字符}
3.dao接口方法有多个简单类型的参数
@Param:命名参数,在方法的形参前面使用的,定义参数名。这个名称可以用在mapper文件中
dao接口,方法的定义:
ListselectByNameOrAge(@Param("myName") String name, @Param("myAge") Integer age);
mapper文件:
4.dao接口方法使用一个对象作为参数
方法的形参是一个java对象。这个java对象表示多个参数。使用对象的属性值作为参数使用
java对象
dao接口中的方法定义
ListselectByObject(Student student); ListselectByQueryParam(QueryParam param);
mapper文件
5.dao接口中多个简单类型的参数,使用位置
参数位置:dao接口中方法的形参列表,从左到右,参数位置是0,1,2,3 ,...
语法格式:#{arg0},#{arg1}
dao接口的方法
ListselectByPosition(String name,Integer age);
mapper文件
select * from student where name = #{arg0} or age = #{arg1}
6.dao接口是一个Map
map作为dao接口的参数,使用key获取参数值
语法格式:#{key}
dao接口的方法
ListselectStudentByMap(Map map);
mapper文件
select * from student where name = #{myName} or age = #{myAge}
测试调用方法的位置
@Test
public void testSelectByMap(){
SqlSession sqlSession = MyBatisUtil.getSqlSession();
StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
//使用map传递参数
Map map = new HashMap<>();
map.put("myName", "李四");
map.put("myAge",14);
List students = studentDao.selectStudentByMap(map);
for (Student student1 : students) {
System.out.println(student1);
}
sqlSession.close();
}
3.占位符 # 和 $ 的区别
1.#占位符
语法#{字符}
mybatis处理#{}使用jdbc对象是prepareStatement对象
select * from student where id = #{studentId} mybatis创建PrepareStatement对象,执行sql语句
String sql = “select * from student where id = ?”
PrepareStatement pst = conn.prepareStatement((sql);
pst.setInt(1,1001);//传递参数
ResultSet rs = pst.executeQuery();//执行语句
#{}特点:
1.使用PrepareStatement对象,执行sql语句,效率高
2.使用的PrepareStatement对象,能避免sql语句注入,sql语句执行更安全
3.#{}常常作为列值使用的,位于等号的右侧,#{}的值和数据类型有关
2.$占位符
语法${字符}
mybatis执行#{}占位符的sql语句
select * from student where id = ${studentId} ${}表示字符串连接,把sql语句的其他内容和${}内容使用 + 号连接的方式连接在一起
String sql = “select * from student where id = ” + “1001”;
mybatis创建Statement对象,执行sql语句
Statement stmt = coon.createStatement(sql);
ResultSet rs = stmt.executeQuery();
1.使用Statement对象,执行sql语句,效率低
2.${}占位符的值,使用字符串连接的方式,有sql注入的风险。有代码安全问题
3.${}数据是原样使用的,不会区分数据类型
4.${}常作为表名或者列名,在能保证数据安全的情况下使用${}
4.封装mybatis输出结果
封装输出结果:mybatis执行sql语句,得到ResultSet,转为java对象
1.resultType
resultType属性:在执行select时使用,作为
resultType:表示结果类型,mybatis执行sql语句,得到java对象得的类型。它的值有两种
1.java类型的全限定名称 2.使用别名
1.resultType:表示java的自定义对象
Student selectById(Integer id);select * from student where id = #{studentId} resultType:现在使用java类型的全限定名称。表示的意思mybatis执行sql语句,把ResultSet中的数据转为Student类型的对象。mybatis会做以下操作:
1.调用com.shangma.entity.Student的无参构造方法,创建对象
Student student = new Student();//通过反射创建对象
2.同名的列赋值给同名的属性
student.setId( rs.getInt("id") );
student.setName( rs.getString("name") );
3.得到java对象
如果dao接口返回值是List集合,mybatis把student对象放到List集合
所以执行 Student myStudent = dao.selectById(1001);得到数据库中id=1001这行数据,这行数据的列值,赋给myStudent对象的属性。你能得到myStudent对象。
2.resultType表示简单类型
dao接口方法
long countStudent();
mapper文件
select count(*) from student
3.resultType:表示一个map结构
dao接口方法
//查询结果返回是一个Map Map
mapper文件
select id,name from student where id = #{stuId}
2.resultMap
resultMap:结果映射。自定义列名和java对象属性的对应关系。常用在列名和属性名不同的情况
用法:
1.先定义resultMap标签,指定列名和属性名称对应关系
2.在select标签使用resultMap属性,指定上面定义的resultMap的id值
java实体类对象
mapper文件
select * from student where id = #{id}
5.自定义别名
mybatis提供对java类型定义为简短好记的名称
自定义名称步骤:
1.在mybatis主配置文件,使用typeAliases标签声明别名
2.在mapper文件中,resultType=“别名”
声明别名(mybatis主配置文件)
mapper文件中使用
resultype = "别名"select * from student where id = #{studentId}
6.数据库中的列名和java对象属性名称不一样的解决方式
1.使用resultMap:自定义列名和属性名称对应关系
2.使用resultType:使用列别名,让别名和java对象属性名称一样
java实体类对象
mapper文件
select id studentId, name studentName,email studentEmail,age from student where id = #{studentId}
7.like
1.第一种方式:在java程序中,把like的内容组装好 。把内容传入到sql语句
//like的第一种方式
List selectLikeOne(@Param("name") String name);
//like的第一种方式 ListselectLikeOne(@Param("name") String name);
mapper文件
SELECT * FROM student WHERe name LIKE #{name}
测试,执行like
@Test
public void testSelectLikeOne(){
//1.获取SQLSession
SqlSession sqlSession = MyBatisUtil.getSqlSession();
//2.获取dao的代理
StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
List students = studentDao.selectLikeOne("%李%");
for (Student student : students) {
System.out.println(student);
}
//3.关闭SqlSession对象
sqlSession.close();
}
2.第二种方式:在sql语句中,组织like内容
sql语句like的格式:where name like “%” 空格 #{name} 空格 “%”
mapper文件
SELECT * FROM student WHERe name LIKE "%" #{name} "%"
测试,执行like
@Test
public void testSelectLikeOne(){
//1.获取SQLSession
SqlSession sqlSession = MyBatisUtil.getSqlSession();
//2.获取dao的代理
StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
List students = studentDao.selectLikeOne("李");
for (Student student : students) {
System.out.println(student);
}
//3.关闭SqlSession对象
sqlSession.close();
}
执行结果
第四章 动态sql
什么是动态sql:同一个dao的方法,根据不同条件可以表示不同的sql语句,主要是where部分有变化
使用mybatis提供的标签,实现动态sql的能力,主要有if,where、foreach,sql
使用动态sql的时候,dao方法的形参使用java对象
什么时候使用动态sql:
1.if标签
语法:
sql代码
在mapper文件中
select * form student
sql语句
sql语句
例子:
dao接口
//if
List selectIf(Student student);
mapper文件
select * from student
where id = -1
or name = #{name}
or age > #{age}
2.where标签
使用if标签时,容易引起sql语句错误。使用where标签解决if产生的语法问题
使用where,里边是一个或多个if标签,当有一个if标签判断为true,where标签会转换为WHERe关键字附加到sql语句的后面。如果if没有一个条件为true,忽略where和里边的if
where标签会删除离它最近的 or 或者 and
语法:
sql语句
sql语句
例子:
dao接口
//where
List selectWhere(Student student);
mapper文件
select * from student
or name = #{name}
or age = #{age}
3.foreach
使用foreach可以循环数组,list集合,一般在in语句中
语法:
item=“集合中的成员” separator="集合成员之间的分隔符">
#{item 的值}
标签属性:
collection:表示,循环的对象是数组,还是list集合。如果dao接口方法的形参是数组,
collection=“array”,如果dao接口形参是List,collection=“list”
open:循环开始时的字符
close:循环结束时字符
item:集合成员,自定义变量
separator:集合成员之间的分隔符
#{item 的值}:获取集合成员的值
1.第一种方式,循环简单类型的List
例子:
dao接口
//foreach-1
List selectForeachOne(List idList);
mapper文件
select * from student
where id in
#{myId}
测试
@Test
public void testSelectForeachOne(){
//1.获取SQLSession
SqlSession sqlSession = MyBatisUtil.getSqlSession();
//2.获取dao的代理
StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
List list = new ArrayList<>();
list.add(1001);
list.add(1003);
list.add(1005);
// list = null;
List students = studentDao.selectForeachOne(list);
for (Student student : students) {
System.out.println(student);
}
//3.关闭SqlSession对象
sqlSession.close();
}
2.第二种方式,循环对象类型的List
例子:
dao接口
//foreach-2
List selectForeachTwo(List studentList);
mapper文件
select * from student
where id in
#{stu.id}
测试
@Test
public void testSelectForeachTwo(){
//1.获取SQLSession
SqlSession sqlSession = MyBatisUtil.getSqlSession();
//2.获取dao的代理
StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
List list = new ArrayList<>();
Student stu1 = new Student();
Student stu2 = new Student();
// stu1.setId(1001);
// stu2.setId(1005);
list.add(stu1);
list.add(stu2);
List students = studentDao.selectForeachTwo(list);
for (Student student : students) {
System.out.println(student);
}
//3.关闭SqlSession对象
sqlSession.close();
}
4.sql标签
sql标签表示一段sql代码,可以是表名,几个字段,where条件都可以,可以在其他地方复用sql标签的内容
使用方式:
1.在mapper文件中定义sql代码片段?
部分sql语句 2.在其他位置,使用include标签引用某个代码片段
例子:
mapper文件
select * from student
where id = #{studentId}
第五章 MyBatis配置文件
mybatis配置文件两大类:
1.mybatis主配置文件,提供mybatis全局设置的,包含内容,日志、数据源,mapper文件位置
2.mapper文件:写sql语句的。一个表一个mapper文件
1.settings部分
settings是mybatis的全局设置,影响整个mybatis运行。这个设置一般使用默认值就可以了
2.typerAliases 别名
设置别名
3.配置环境
environments:环境标签,在它里边可以配置多个environment
属性:default,必须是某个environment的id属性值。表示mybatis默认连接的数据库
environment:表示一个数据库的连接信息
属性:id,自定义环境的标识,唯一值
transactionManager:事务管理器
属性:type,表示事务管理器的类型
属性值:(1)JDBC:使用connection对象,由mybatis自己完成事务的处理
(2)MANAGED:管理,表示把事务的处理交给容器实现(由其他软件
完成事务的提交回滚)
dataSource:数据源,创建connection对象,连接数据库
属性:(1)type:数据源的类型
属性值:(1) POOLED,mybatis会在内存中创建PooledDataSource类,管理多个connection连接对象,使用的连接池
(2)UNPOOLED,不使用连接池,mybatis创建一个UnPooledDataSource这个类,每次执行sql语句,最后关闭connection
(3)JNDI:java的命名和目录服务
environments:环境标签,在它里边可以配置多个environment
属性:default,必须是某个environment的id属性值。表示mybatis默认连接的数据库
environment:表示一个数据库的连接信息
属性:id,自定义环境的标识,唯一值
transactionManager:事务管理器
属性:type,表示事务管理器的类型
属性值:(1)JDBC:使用connection对象,由mybatis自己完成事务的处理
(2)MANAGED:管理,表示把事务的处理交给容器实现(由其他软件
完成事务的提交回滚)
dataSource:数据源,创建connection对象,连接数据库
属性:(1)type:数据源的类型
属性值:(1) POOLED,mybatis会在内存中创建PooledDataSource类,管理多个connection连接对象,使用的连接池
(2)UNPOOLED,不使用连接池,mybatis创建一个UnPooledDataSource这个类,每次执行sql语句,最后关闭connection
(3)JNDI:java的命名和目录服务
4.使用数据库属性配置文件
需要把数据库的配置信息放到一个单独文件中,独立管理。这个扩展名是properties,在这个文件中,使用自定义的key=value的格式表示数据
使用步骤:
1.在resources目录中,创建xxx.properties
2.在文件中,使用key=value的格式定义数据
例如:jdbc.url=jdbc:mysql:localhost:3306/springdb
3.在mybatis主配置文件,使用properties标签引用外部的属性配置文件
4.在使用值的位置,使用${key}获取key对应的value(等号右边的值)
例子:
jdbc,propertis
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/ssm jdbc.username=root jdbc.password=123456
mybatis配置文件
5.mapper标签
使用mappers指定其他mapper文件的位置
mapper标签使用的格式有两个常用的方式
例子:
第六章 PageHelper
PageHelper做数据分页。在你的select语句后面加入分页的sql内容,如果你使用的mysql数据库,它就是在 select * from student 后面加入 limit 语句
1.加入依赖pagehelper
com.github.pagehelper
pagehelper
5.1.0
2.在mybatis主配置文件,加入plugin声明
3.在select语句之前,调用PageHelper.startPage(页码,每页大小)
例子:
dao接口
//测试PageHelper
List selectAllStudent();
mapper文件
select * from student order by id
测试
@Test
public void testPageHelper(){
//1.获取SQLSession
SqlSession sqlSession = MyBatisUtil.getSqlSession();
//2.获取dao的代理
StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
PageHelper.startPage(2,3);
List students = studentDao.selectAllStudent();
for (Student student : students) {
System.out.println(student);
}
//3.关闭SqlSession对象
sqlSession.close();
}
对比:
没有使用PageHelper
select * from student order by id
使用PageHelper
SELECt count(0) FROM student
select * from student order by id LIMIT ?, ?



