第一章
1.前置概念
三层架构
- 界面层:和用户打交道的,接受用户的请求参数,显示处理结果。
- 业务逻辑层:接收了界面层传递的数据,计算逻辑,调用数据库,获取数据。
- 数据访问层:访问数据库,CRUD
三层对应的包
- 界面层:Controller
- 业务逻辑层:service包
- 数据访问包:dao包
三层中类的交互
- 用户使用界面层-->业务逻辑层-->数据访问层(持久层)-->数据库(mysql)
三层对应的处理框架
- 界面层:springMVC
- 业务逻辑层:spring
- 数据访问层:mybatis
2.JDBC的缺陷
- 代码比较多,效率低
- 需要关注Connection,Statement,ResultSet对象创建和销毁
- 对ResultSet查询的结果,需要自己封装为List
- 重复的代码比较多
- 业务代码和数据库的操作混在一起
3.mybatis框架
- sql mapper:sql映射
可以把数据库表中的一行数据 映射为一个java对象
一行数据可以看做是一个java对象。操作这个对象,就相当于操作表中的数据
- Data Access Object(DAOS):数据访问,CRUD
4.mybatis提供的功能
- 提供了Connection,Statement,ResultSet的能力,不用创建了。
- 提供执行sql语句的能力
- 提供了循环sql,把sql的结果转化为java对象,集合List的能力。
- 提供了关闭资源的能力,不用关闭Connection,Statement,ResultSet。
开发人员要做的事:提供sql语句。
实现步骤:
-
新建的student表
-
加入maven的mybatis坐标,mysql的驱动坐标
-
创建实体类,Student--保存表中的一行数据的
-
创建持久层的dao接口,定义操作数据库的方法
-
创建一个mybatis使用的配置文件
叫做sql映射文件:写sql语句的。一般一个表一个sql映射文件。文件是xml文件。
写在接口所在的目录中,文件名和接口保持一致
-
创建mybatis的主配置文件:
一个项目就一个主配置文件。
主配置文件提供了数据库的连接信息和sql映射文件的位置信息。
-
创建使用mybatis的类,通过mybatis访问数据库。
第二章
1.主要类的介绍
Resources:mybatis中的一个类,负责读取主配置文件
InputStream in = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactoryBuilder:创建SqlSessionFactory对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
SqlSessionFactory:重量级对象,程序创建这个对象耗时长,整个项目中有一个就够用了。
接口的实现类:DefaultSqlSessionFactory
作用:获取SqlSession对象
openSession方法说明:
- openSession():无参数的,获取非自动提交事务的SqlSession对象
- openSession(boolean):openSession(true) 获取自动提交事务的SqlSession对象
SqlSession sqlSession = factory.openSession();
SqlSession接口:定义了操作数据的方法,例如selectOne,selectList,insert,update,delete,commit,roolback
使用要求:Sqlsession对象不是线程安全的,需要在方法内部使用,在执行sql语句之前,要使用openSession()获取Sqlsession对象。在执行完sql语句后,需要关闭他。才能保证其线程安全。
第三章
1.动态代理
传统的dao的增删改查太过冗余,所有可以通过dao中方法的返回值确定MyBatis要调用的SqlSession方法。
MyBatis的动态代理:mybatis根据dao的方法调用,获取执行sql语句的信息
mybatis根据你的dao接口,创建出一个dao接口的实现类,并创建这个类的对象,完成SqlSession调用方法,访问数据库。
使用mybatis的动态代理机制,使用SqlSession.getMapper(dao接口)
getMapper能获取dao接口对于的实现类对象。
2.传入参数
从java代码中把数据传入到mapper文件的sql语句中。
parameterType:
写在mapper文件中的一个属性,表示dao接口中方法的参数的数据类型。不是强制的,可以通过反射机制能够发现接口参数的类型,一般不写。
传入一个简单参数
简单类型:mybatis把java的基本数据类型和String都叫简单类型
在mapper文件获取简单类型的一个参数的值 #{}
传入多个参数
- 使用@Param
接口:public List<Student> selectMulitParam(@Param("stuName") String name,@Param("stuAge") Integer age);
mapper文件:select * from student where name=#{stuName} or age=#{stuAge}
- 使用对象
需要创建一个QueryParam类,有stuName和stuAge两个属性
接口: public List<Student> selectMulitParam(QueryParam param);
mapper文件:select * from student where name=#{stuName} or age=#{stuAge}
#和$两种占位符
#,告诉mybatis使用实际的参数值替代。并使用PrepareStatement对象执行sql语句,#{...}代替sql语句的?。安全,迅速,这是首选做法。
$,字符串替换,告诉mybatis使用$包含的字符串替换所在的位置。使用Statement把sql语句和${}的内容连接起来。主要用在替换表名,列名,不同列排序等操作。效率比#低,容易引起sql注入。
select * from studnet order by ${colName}
3.封装MyBatis输出结果
resultType:结果类型
指sql语句执行完毕后,数据转为的java对象,java类型是任意的,不必非得是实体类,可以自定义另一个对象。
简单类型:resultType="int",可以直接放别名,也可放入全限定名称。
Map:列名是map的key,列值是map的value。只能执行返回值是一行的记录。
resultMap:结果映射
指定列名和java对象的属性对应关系
应用:
- 你自定义列值赋给哪个属性
- 当你的列名和属性名不一样时,一定使用resultMap
<resultMap id="studentMap" type="com.mybatisCourse.domain.Student">
<id column="id" property="id"></id>
<result column="name" property="name"></result>
<result column="email" property="email"></result>
<result column="age" property="age"></result>
</resultMap>
<select id="selectAllStudentByMap" resultMap="studentMap">
select id,name,email,age from student
</select>
Like模糊
java代码指定like的内容
<select id="selectLikeOne" resultType="com.mybatisCourse.domain.Student">
select id,name,email,age from student where name like #{name};
</select>
第四章 动态SQL
sql语句的内容是变化的,可以根据条件获取到不同的SQL语句,主要是where部分发生变化
动态sql的实现,使用的是mybatis提供的标签,<if> <where> <foreach>
<if test="判断java对象的属性值">
部分sql语句
</if>
<where> 用来包含多个<if>,当多个if有一个成立时,<where>会自动增加一个where关键字,并去掉if中多余的and,or等
第五章 配置文件
1.主配置文件
<?xml version="1.0" encoding="UTF-8" ?>
<!--
mybatis的主配置文件:主要定义了数据库的配置信息,sql映射文件的位置
1.约束文件
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
2.configuration 根标签,配置信息
-->
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--
settings:控制mybatis全局行为
-->
<settings>
<!--日志-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
</settings>
<!--
1.环境配置:数据库的链接信息
default:必须和某个environment的id值一样。告诉mybatis使用哪个数据库的连接信息
-->
<environments default="development">
<!--
environment:一个数据库信息的配置,环境
id:唯一值,自定义
-->
<environment id="development">
<!--
transactionManager:mybatis的事务类型
type:JDBC(表示使用的jdbc中的Connection对象的commit,roolback做事务处理)
MANAGED 把mybatis的事务处理委托给其他的容器,一个服务器软件,一个框架(spring)
-->
<transactionManager type="JDBC"/>
<!--
dataSource:表示数据源,连接数据库
java 体系中,规定实现了javax.sql.DataSource接口的都是数据源
type:表示数据源的类型,POOLED表示使用链接池
1) POOLED:使用连接池,mybatis会创建POOLedDataSource类
2) UPOOLED:不使用连接池,在每次执行sql语句,先创建连接,执行sql,再关闭连接(一般不用)
3) JNDI:java命名和目录服务,类似于windows注册表,不重要
-->
<dataSource type="POOLED">
<!--
driver,url,username,password 是固定的,不能自定义
-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/student"/>
<property name="username" value="root"/>
<property name="password" value="cong0917"/>
</dataSource>
</environment>
</environments>
<!--sql映射文件的位置-->
<mappers>
<!--
一个mapper标签指定一个文件的位置
从类路径开始的路径信息
-->
<mapper resource="com/mybatisCourse/dao/StudentDao.xml"/>
</mappers>
</configuration>
2.数据库的属性配置文件:
把数据库连接信息放到一个单独的文件中。和mybatis主配置文件分开。
目的是便于修改,保存,处理多个数据库的信息。
- 在resources目录中定义一个属性配置文件,xxx.properties,例如jdbc.properties。在属性配置文件中,定义数据,格式是key-value。
jdbc.driver=com.mysql.cj.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/student
jdbc.username=root
jdbc.password=cong0917
- 在mybatis的主配置文件中,使用
<property>指定文件的位置。在需要使用的地方,${key}
<!--指定properties文件的位置-->
<properties resource="jdbc.properties" />
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
3.指定多个mapper文件
<!--第一种:挨个指定-->
<mappers>
<!--
一个mapper标签指定一个文件的位置
从类路径开始的路径信息
-->
<mapper resource="com/mybatisCourse/dao/StudentDao.xml"/>
</mappers>
<!--
第二种,使用包名
name:mapper文件所在的包名,这个包中的所有xml文件一次都能加载给mybatis
使用package的要求:
1.mapper文件名称需要和接口名称一样,区分大小写
2.mapper文件和dao的接口需要在同一目录
-->
<mappers>
<package name="com.mybatisCourse.dao"/>
</mappers>