mybatis
1. 三层架构:
* 表现层:spring MVC框架
用于展示数据
* 业务层:
用于处理业务需求
* 持久层:mybatis框架
用于数据库交互
2. 持久层技术解决方案:
* JDBC技术:
Connection
PreparedStatement
ResultSet
* Spring中的JdbcTemplate
Spring中队jdbc的简单封装
* Apache的DBUtils
类似JdbcTemplate,也是对jdbc的简单封装
以上技术都不能算是框架:JDBC作为规范,JdbcTemplate和DBUtils都是工具类
3. mybatis是一个优秀的基于java的持久层框架
它内部封装了jdbc,使开发者只需要关注sql语句本身
而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程
mybatis通过xml或注解的方式将要执行的各种statement配置起来
4. mybatis中的ORM:
a. ORM:Object Relational Mapping对象关系映射
将数据库表与实体类以及实体类的属性对应起来
使得操作实体类就可以实现操作数据库表
b. 类似之前的查询对象封装操作
list< Emp> list = template. query ( sql, new BeanPropertyRowMapper < Emp> ( Emp. class ) ) ;
c. 因此需要保证数据库的列名与实体类的属性保持一致
mybatis使用xml配置
1. mybatis使用:
a. 环境搭建:
1. 创建maven工程,并导入jar包坐标
mybatis
mysql- connector- java
log4j ( 可选)
2. 创建数据库表和对应的实体类和dao接口
3. 创建mybatis的主配置文件
SqlMapConfig. xml
其中包含mysql环境配置:
< ! -- 配置环境-- >
< environments default = "mysql" >
< ! -- 配置mysql-- >
< environment id= "mysql" >
< ! -- 配置事务的类型-- >
< transactionManager type= "JDBC" > < / transactionManager>
< ! -- 配置数据源( 这里选择数据库连接池) -- >
< dataSource type= "POOLED" >
< ! -- 配置连接数据库的4 个基本信息-- >
< property name= "driver" value= "com.mysql.cj.jdbc.Driver" / >
< property name= "url" value= "mysql连接数据库的url" / >
< property name= "username" value= "数据库用户名" / >
< property name= "password" value= "数据库密码" / >
< / dataSource>
< / environment>
< / environments>
还包含映射文件的配置:
< ! -- 指定映射文件的配置位置,映射文件指的是每个dao独立的配置文件-- >
< mappers>
< mapper resource= "cn/mysilent/dao/IUserDao.xml" / >
< ! -- 如果还有其他dao接口则需要再创建mapper标签-- >
< / mappers>
4. 创建映射配置文件:
IUserDao. xml
其中包含对应抽象接口中的抽象方法配置:
< ! -- namespace属性为dao接口的位置-- >
< mapper namespace= "cn.mysilent.dao.IUserDao" >
< ! -- 配置dao接口抽象方法的实现-- >
< ! -- 配置findAll方法的查询语句-- >
< ! -- 属性id的值必须为接口中对应的抽象方法名称,标签体为该抽象方法的sql查询语句-- >
< ! -- 属性resultType的值必须为查询后的结果封装的对象-- >
< select id= "findAll" resultType= "cn.mysilent.domain.User" >
select * from user;
< / select>
< / mapper>
5. 注意事项:
* 在mybatis框架的使用过程中,常有命名格式为IUserMapper来代替IUserDao
* 在IDEA中创建目录时和创建包时是有差异的
在创建包时:cn. mysilent. dao这是三级目录
在创建目录时:cn. mysilent. dao这是一级目录,需要分开创建cn目录mysilent目录dao目录才为三级目录
* mybatis要求配置文件在resources下的路径要与dao接口的包路径保持一致
因此,创建配置文件时,必须创建三级目录
cn/ mysilent/ dao/ IUserDao. xml
cn. mysilent. dao. IUserDao. java
* 映射配置文件的mapper标签属性namespace必须时dao接口的全类名
* 映射配置文件的select标签id属性必须为dao接口的方法名
* 映射配置文件的select标签resultType属性必须为查询结果的封装类全类名
此时,无需要在写dao的实现类,mybatis框架就可以自动实现
2. Mybatis使用步骤:
a. 读取配置的文件
InputStream in = Resources. getResourceAsStream ( "SqlMapConfig.xml" ) ;
* 读取配置文件建议方法:
1. 使用类加载器,只能读取类路径的配置文件
2. 使用ServletContext对象的getRealPath ( ) 方法
b. 创建SqlSessionFactory工厂
SqlSessionFactoryBuilder sb = new SqlSessionFactoryBuilder ( ) ;
SqlSessionFactory sf = sb. build ( in) ;
* 创建工厂时,mybatis使用的是构建者模式
即开发商包了一个建筑队,只需要给建筑队设计图纸和钱即可,最后生成建筑
隐藏了对象的实现细节,使用者直接调用方法即可拿到对象
c. 使用工厂生成SqlSession对象
SqlSession sqlSession = sf. openSession ( ) ;
* 生成SqlSession对象时,mybatis使用的是工厂模式
降低了类之间的依赖关系
d. 使用SqlSession创建Dao接口的代理对象 -- 即由mybatis框架来实现接口的实现类
IUserDao userDao = sqlSession. getMapper ( IUserDao. class ) ;
* 创建Dao接口的实现类时,mybatis使用了代理模式
不修改源码基础上增强方法
e. 使用代理对象执行方法
List< User> userDaoAll = userDao. findAll ( ) ;
for ( User user : userDaoAll) {
System. out. println ( user) ;
}
f. 释放资源
sqlSession. close ( ) ;
in. close ( ) ;
mybatis使用注解配置
1. mybatis使用:
a. 环境搭建:
1. 创建maven工程,并导入jar包坐标
2. 创建数据库表和对应的实体类和dao接口
3. 在dao接口的抽象方法上加上@Select 注解,注解参数为该方法对应的sql语句
@Select ( "select * from user" )
List< User> findAll ( ) ;
4. 创建mybatis的主配置文件
SqlMapConfig. xml
映射文件的配置与xml配置有所区别:
< ! -- 使用注解不再需要配置映射文件,直接指定添加了注解的全类名-- >
< mappers>
< mapper class = "cn.mysilent.dao.IUserDao" / >
< ! -- 如果还有其他dao接口则需要再创建mapper标签-- >
< / mappers>
5. 注意事项:
* 在mybatis框架的使用过程中,常有命名格式为IUserMapper来代替IUserDao
* 在IDEA中创建目录时和创建包时是有差异的
在创建包时:cn. mysilent. dao这是三级目录
在创建目录时:cn. mysilent. dao这是一级目录,需要分开创建cn目录mysilent目录dao目录才为三级目录
* mybatis要求配置文件在resources下的路径要与dao接口的包路径保持一致
因此,创建配置文件时,必须创建三级目录
cn/ mysilent/ dao/ IUserDao. xml
cn. mysilent. dao. IUserDao. java
* 映射配置文件的mapper标签属性namespace必须时dao接口的全类名
* 映射配置文件的select标签id属性必须为dao接口的方法名
* 映射配置文件的select标签resultType属性必须为查询结果的封装类全类名
此时,无需要在写dao的实现类,mybatis框架就可以自动实现
mybatis底层操作
1. 读取SqlMapConfig. xml文件:
a. 可以获取到数据库连接的相关信息
b. 由数据库连接信息可以获取到Connection对象
c. 可获取到dao接口的映射信息( 可选xml配置/ 注解配置两种配置方式)
2. 读取xml配置/ 注解配置信息
a. 可以获取需要执行的SQL语句
b. 可以通过SQL语句获取PreparedStatement对象
c. 可以获取到封装实体类的全限定类名
3. mybatis中selectList方法实现技术:
a. dom4j技术解析xml文档
b. 注册驱动,获取连接
c. 通过SQL语句获取PreparedStatement
d. 查询获取ResultSet结果集
e. 遍历结果集,封装对象
1. 由封装实体类的全限定类名得到实体类对象实例:反射技术
E element = ( E) Class. forName ( 全限定类名) . newInstance ( ) ;
2. 使用getXxx/ setXxx方法设置属性值
3. 将该对象放入List< E> 中
f. 返回List集合