mybatis
2021-12-27 21:08:58 42 举报
AI智能生成
MyBatis
作者其他创作
大纲/内容
框架概述
三层架构
三层架构及对应的包
1、界面(视图)层:接收用户的请求参数,显示处理结果。(jsp、html、servlet)
controller包(servlet)
2、业务逻辑层:接收了界面层传递的数据,计算逻辑,调用数据库,获取数据。
service包(XXXService类)
3、数据访问(持久)层:访问数据库,执行对数据的查询、修改、删除等。
dao包(XXXDao类)
controller包(servlet)
2、业务逻辑层:接收了界面层传递的数据,计算逻辑,调用数据库,获取数据。
service包(XXXService类)
3、数据访问(持久)层:访问数据库,执行对数据的查询、修改、删除等。
dao包(XXXDao类)
三层中类的交互
用户使用界面层——>业务逻辑层——>数据访问层(持久层)——>数据库
框架是什么
框架是一个舞台,是一个模板。半成品软件,定义好了一个领域的基础功能。
三层对应的处理框架
界面层--servlet--SpringMVC
业务逻辑层--service类--Spring
数据访问层--dao类--MyBatis
业务逻辑层--service类--Spring
数据访问层--dao类--MyBatis
MyBatis作用
使用JDBC的缺陷:效率低、重复代码多等
Mybatis与JDBC相比有什么优势
1.sql语句与java代码分离。
2.对结果集的映射,mybatis会帮我们将数据进行封装。
3.mybatis底层用到了连接池,不用每次都从数据库获取以及关闭资源,节省资源。
4.动态sql语句方便,如果是传统的JDBC要进行关键字查询时需要写多条代码。
1.sql语句与java代码分离。
2.对结果集的映射,mybatis会帮我们将数据进行封装。
3.mybatis底层用到了连接池,不用每次都从数据库获取以及关闭资源,节省资源。
4.动态sql语句方便,如果是传统的JDBC要进行关键字查询时需要写多条代码。
MyBatis框架概述
MyBatis历史
MyBatis是持久性框架(半自动),和Hibernate(全自动)不同。
iBatis到MyBatis
SQL映射框架:MyBatis SQL Mapper Framework for Java
1、sql mapper:sql映射
可以把数据库表中的一行数据,映射为一个java对象。
2、Data Access Objects(DAOs):数据访问,对数据库执行CRUD
iBatis到MyBatis
SQL映射框架:MyBatis SQL Mapper Framework for Java
1、sql mapper:sql映射
可以把数据库表中的一行数据,映射为一个java对象。
2、Data Access Objects(DAOs):数据访问,对数据库执行CRUD
MyBatis能力
1、提供了Connection,Statement,ResultSet;
2、执行sql;
3、提供了循环sql,把sql结果转为java对象,List集合的能力。
4、提供了关闭资源的能力,不用开发人员关闭Conn等。
2、执行sql;
3、提供了循环sql,把sql结果转为java对象,List集合的能力。
4、提供了关闭资源的能力,不用开发人员关闭Conn等。
总结:MyBatis是一个sql映射框架,提供的数据库操作能力,增强的JDBC,使用MyBatis让开发人员集中写SQL即可。
不必关心Connection、Statement、ResultSet的创建,销毁,sql执行。
不必关心Connection、Statement、ResultSet的创建,销毁,sql执行。
MyBatis框架快速入门
搭建MyBatis开发环境
第一个入门的mybatis例子
实现步骤
1、pom文件中加入maven依赖
<!--MyBatis依赖-->
<!--MySQL驱动-->
静态资源文件:
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>false</filtering>
</resource>
</resources>
2、创建dao接口:定义操作数据的方法
3、创建mapper文件,也叫sql映射文件写sql语句的,mybatis会执行这些sql
1、指定约束文件
<?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">
mybatis-3-mapper是约束文件的名称,扩展名是dtd的。
<?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">
mybatis-3-mapper是约束文件的名称,扩展名是dtd的。
2、约束文件作用:限制,检查在当前文件中出现的标签,属性必须符合mabatis的要求
3、mapper是当前文件的根标签,必须的。
namespace:叫做命名空间,唯一值的,可以是自定义的字符串。
要求使用dao接口的全限定名称。
namespace:叫做命名空间,唯一值的,可以是自定义的字符串。
要求使用dao接口的全限定名称。
4、在当前文件中,可使用特定的标签,表示数据库的特定操作
<select> <update><insert><delete>
<select> <update><insert><delete>
5、id:要执行的sql语法的唯一标识,mybatis会根据id值找到要执行的sql语句,建议和接口名方法一致
resultType:表示结果类型的,sql语句执行后得到ResultSet,遍历ResultSet得到java对象的类型,值
写类型的全限定名称。
resultType:表示结果类型的,sql语句执行后得到ResultSet,遍历ResultSet得到java对象的类型,值
写类型的全限定名称。
例:
<select id="selectStudents" resultType="com.kx.bean.Student">
select id, name, email, age from Student order by id
</select>
<insert id="insertStudent">
insert into student values(#{id},#{name},#{email},#{age})
</insert>
<select id="selectStudents" resultType="com.kx.bean.Student">
select id, name, email, age from Student order by id
</select>
<insert id="insertStudent">
insert into student values(#{id},#{name},#{email},#{age})
</insert>
mybatis主文件配置
<?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">
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
//configuration根标签
<!--环境配置:数据库的连接信息-->
<environments default="online">
<!--environment:一个数据库信息的配置环境
id(development):一个唯一值,自定义,表示环境名称
default:必须和某个environment的id值一样。
告诉mybatis使用哪个数据库的连接
-->
<environment id="development">
<!--transactionManager:mybatis的事务类型
type:JDBC(表示使用jdbc中的Connection对象的commit,rollback做事务处理)
-->
<transactionManager type="JDBC"/>
<!--dataSource:表示数据源,连接数据库的
type:表示数据源的类型,POOLED表示使用连接池
-->
<dataSource type="POOLED">
<!--driver、url、username、password固定不能自定义-->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
<environment id="online">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/ssm"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--环境配置:数据库的连接信息-->
<environments default="online">
<!--environment:一个数据库信息的配置环境
id(development):一个唯一值,自定义,表示环境名称
default:必须和某个environment的id值一样。
告诉mybatis使用哪个数据库的连接
-->
<environment id="development">
<!--transactionManager:mybatis的事务类型
type:JDBC(表示使用jdbc中的Connection对象的commit,rollback做事务处理)
-->
<transactionManager type="JDBC"/>
<!--dataSource:表示数据源,连接数据库的
type:表示数据源的类型,POOLED表示使用连接池
-->
<dataSource type="POOLED">
<!--driver、url、username、password固定不能自定义-->
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
<environment id="online">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/ssm"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<!--settings:控制mybatis全局行为-->
<settings>
<!--设置mybatis输出日志-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!--环境配置:数据库的连接信息-->
<settings>
<!--设置mybatis输出日志-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!--环境配置:数据库的连接信息-->
<!--sql mapper(sql映射文件)的位置-->
<mappers>
<!--一个mapper标签指定一个文件的位置
从类路径开始的路径信息。 target/classes
-->
<mapper resource="org/kx/dao/StudentDao.xml"/>
</mappers>
<mappers>
<!--一个mapper标签指定一个文件的位置
从类路径开始的路径信息。 target/classes
-->
<mapper resource="org/kx/dao/StudentDao.xml"/>
</mappers>
主要类的介绍
1、Resources:mybatis中的一个类,负责读取主配置文件
InputStream in = Resources.getResourceAsStream("mybatis.xml");
InputStream in = Resources.getResourceAsStream("mybatis.xml");
2、SqlSessionFactoryBuilder:创建SqlSessionFactory对象
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
3、SqlSessionFactory:重量级对象,程序创建一个对象耗时比较长,使用资源多。
在这个项目中,有一个就够用了。
SqlSessionFactory:接口,接口实现类:DefaultSqlSessionFactory
SqlSessionFactory作用:获取SqlSession对象
SqlSession sqlSession=sqlSessionFactory .openSession();
openSession()方法说明:
1、openSession():无参数的,获取是非自动提交事务的SqlSession对象
2、openSession(boolean):openSession(true)获取自动提交事务的SqlSession
openSession(false)非自动提交事务的SqlSession
在这个项目中,有一个就够用了。
SqlSessionFactory:接口,接口实现类:DefaultSqlSessionFactory
SqlSessionFactory作用:获取SqlSession对象
SqlSession sqlSession=sqlSessionFactory .openSession();
openSession()方法说明:
1、openSession():无参数的,获取是非自动提交事务的SqlSession对象
2、openSession(boolean):openSession(true)获取自动提交事务的SqlSession
openSession(false)非自动提交事务的SqlSession
4、SqlSession
SqlSession接口:定义了操作数据的方法,例如:selectOne/selectList/insert/update/delete/commit/rollback
SqlSession接口的实现类DefaultSqlSession。
使用要求:SqlSession对象非线程安全,需在方法内部使用,执行完sql后,需关闭,执行sqlSession.close()。
SqlSession接口:定义了操作数据的方法,例如:selectOne/selectList/insert/update/delete/commit/rollback
SqlSession接口的实现类DefaultSqlSession。
使用要求:SqlSession对象非线程安全,需在方法内部使用,执行完sql后,需关闭,执行sqlSession.close()。
MyBatis工具类获取sqlSession
public class MyBatisUtils {
private static SqlSessionFactory sqlSessionFactory = null;
static {
String config = "mybatis.xml"; //需要和你的项目中的文件名一致
try {
InputStream in = Resources.getResourceAsStream(config);
//创建SqlSessionFactory对象
sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
} catch (IOException e) {
e.printStackTrace();
}
}
//获取SqlSession的方法
public static SqlSession getSqlSession() {
SqlSession sqlSession = null;
if (sqlSessionFactory != null) {
sqlSession = sqlSessionFactory.openSession(); //非自动提交事务
}
return sqlSession;
}
}
private static SqlSessionFactory sqlSessionFactory = null;
static {
String config = "mybatis.xml"; //需要和你的项目中的文件名一致
try {
InputStream in = Resources.getResourceAsStream(config);
//创建SqlSessionFactory对象
sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
} catch (IOException e) {
e.printStackTrace();
}
}
//获取SqlSession的方法
public static SqlSession getSqlSession() {
SqlSession sqlSession = null;
if (sqlSessionFactory != null) {
sqlSession = sqlSessionFactory.openSession(); //非自动提交事务
}
return sqlSession;
}
}
MyBatis框架动态代理
什么是动态代理
动态代理分类
JDK:实现接口;
CGLIB:继承类;
CGLIB:继承类;
使用MyBatis的动态代理:MyBatis帮我们创建dao接口的实现类,
使用SqlSession.getMapper(dao接口.class)获取这个dao接口的对象
//获得接口的代理对象,例如:
StudentDao dao=sqlSession.getMapper(StudentDao.class);
使用SqlSession.getMapper(dao接口.class)获取这个dao接口的对象
//获得接口的代理对象,例如:
StudentDao dao=sqlSession.getMapper(StudentDao.class);
使用动态代理方式
1、获取SqlSession对象,SqlSessionFactory.openSession()
2、使用getMapper()获取某个接口的对象,sqlSession.getMapper(接口.class)
3、使用dao接口的方法,调用方法就执行了mapper文件中的sql
使用动态代理方式的要求
1)dao接口和mapper文件放在同一个目录
2)dao接口和mapper文件名称一致
3)mapper文件中的namespace的值是dao接口的全限定名称
4)dao接口中方法不要使用重载方法
5)mapper文件中的id是接口中方法名称
2)dao接口和mapper文件名称一致
3)mapper文件中的namespace的值是dao接口的全限定名称
4)dao接口中方法不要使用重载方法
5)mapper文件中的id是接口中方法名称
理解参数
从java代码中把实际的值传入到mapper文件中
1、一个简单类型的参数:#{任意字符}
2、多个简单类型的参数,使用@Param("自定义名称")
例:
接口 public List<Student> selectMultiParam(@Param("myname") String name,@Param("myage") Integer age);
接口 public List<Student> selectMultiParam(@Param("myname") String name,@Param("myage") Integer age);
3、使用一个java对象,对象的属性值作为mapper文件找到参数,#{java对象的属性名称}
4、使用位置传参,语法#{arg0},#{arg1},mybatis3.4之前的版本,使用#{0},#{1}
5、使用Map作为参数,#{map的key}
#和$区别
1、#使用 ? 在sql中做占位的,表示列值的,放在等号右侧。
使用jdbc中的PreparedStatement对象执行sql,效率高,避免sql注入。
使用jdbc中的PreparedStatement对象执行sql,效率高,避免sql注入。
2、$占位符,表示字符串的连接,把sql语句连接成一个字符串。
使用Sjdbc中tatement对象执行sql,效率低,有sql注入
$:可以替换表名或者列名
使用Sjdbc中tatement对象执行sql,效率低,有sql注入
$:可以替换表名或者列名
MyBatis返回结果
resultType
表示sql语句执行结果,数据转为的java对象的类型,java类型任意。
类型的全限定名称
类型的别名
例如java.lang.Integer别名是int
resultMap
指定列名和java对象的属性对应关系
自定义列值赋值给哪个属性
当你的列名和属性名不一样
like
在java代码中指定like的内容
在mapper中拼接like
动态SQL
sql的内容是变化的,可以根据条件获取到不同的sql语句。
主要是where部分发生变化。
主要是where部分发生变化。
<if>
<if test="判断java对象的属性值">
判断条件的,条件为true,就会把if之间的sql加入到主sql之后
<where>
用来包含多个if的,当多个if有一个成立,会自动增加一个where关键字,
并去掉if中多余的and、or等
并去掉if中多余的and、or等
<foreach>
循环java中的数组,list集合的。主要用在sql的in语句中。
collection:表示接口中的方法参数的类型,如果是数组使用array,List集合使用list
item:自定义表示数组和集合成员的变量
open:循环开始时的字符
close:循环结束时的字符
separator:集合成员之间的分隔符
item:自定义表示数组和集合成员的变量
open:循环开始时的字符
close:循环结束时的字符
separator:集合成员之间的分隔符
例:学生id是1004、1005、1006的三个学生
select *from student where id in (1004,1005,1006);
<foreach collection="" item="" open="" close="" separator="">
select *from student where id in (1004,1005,1006);
<foreach collection="" item="" open="" close="" separator="">
sql代码片段,复用
步骤
先定义<sql id="自定义名称唯一">sql语句,表名,字段等</sql>
再使用<include refid="id的值">
主配置文件
1、数据库的属性配置文件的使用
1)在resources目录中定义一个属性配置文件,xx.properties,
例:jdbc.properties,在属性配置文件中,定义数据,格式是key=value
key:一般使用"."做多级目录的(清晰)。
例:jdbc.mysql.driver
例:jdbc.properties,在属性配置文件中,定义数据,格式是key=value
key:一般使用"."做多级目录的(清晰)。
例:jdbc.mysql.driver
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false&allowPublicKeyRetrieval=true
jdbc.user=root
jdbc.password=123456
jdbc.url=jdbc:mysql://localhost:3306/ssm?serverTimezone=UTC&characterEncoding=utf8&useUnicode=true&useSSL=false&allowPublicKeyRetrieval=true
jdbc.user=root
jdbc.password=123456
2)在mybatis的主配置文件中,使用<property>指定文件的位置
在需要使用值的地方,${key}
在需要使用值的地方,${key}
2、mapper文件的位置
使用resource和package指定路径
<!--sql mapper(sql映射文件)的位置-->
<mappers>
<!--第一种,单个文件映射-->
<mapper resource="org/kx/dao/StudentDao.xml"/>
<!--第二种,使用包名-->
<package name="org.kx.dao"/>
</mappers>
<!--sql mapper(sql映射文件)的位置-->
<mappers>
<!--第一种,单个文件映射-->
<mapper resource="org/kx/dao/StudentDao.xml"/>
<!--第二种,使用包名-->
<package name="org.kx.dao"/>
</mappers>
扩展
pageHelper做数据分页,支持多种数据库。
功能:实现多种数据库的分页,mysql就是代替limit语句的
实现步骤
1)加依赖
<!--PageHelper依赖-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.3.0</version>
</dependency>
<!--PageHelper依赖-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.3.0</version>
</dependency>
2)mybatis中配置插件
<!--配置插件-->
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"/>
</plugins>
<!--配置插件-->
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"/>
</plugins>
3)在查询条件前,加方法调用
//加入PageHelper方法,分页
//pageNum:第几页,从1开始
//pageSize:一页有多少行数据
PageHelper.startPage(3,3);
List<Student> studentList = dao.selectAll()
//加入PageHelper方法,分页
//pageNum:第几页,从1开始
//pageSize:一页有多少行数据
PageHelper.startPage(3,3);
List<Student> studentList = dao.selectAll()
0 条评论
下一页