目录
Mybatis:
简单上手
核心配置文件主要是用来干什么的?如何进行配置?
配置
1.configuration
2.properties
3.settings
4.typeAliases
5.typeHandlers
6.objectFactory
7.plugins
8.☆environments
9.mappers
Mybatis:
mybatis主要用于处理三层架构的数据访问层,也就是我们在Javaweb学习期间使用到的dao层数据。mybatis优化了JDBC操作数据库的繁琐操作,并且实现了类与sql语句之间的解耦
1.简单上手
1.创建普通maven项目,引入依赖
依赖有数据库连接jar包,mybatis核心jar包还有junit单元测试包
2.自行设计一个数据库表
3.更具数据库表内容设计对应pojo类
public class User { private Integer id; private String username; private String password; @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + ''' + '}'; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public User() { } public User(Integer id, String username, String password) { this.id = id; this.username = username; this.password = password; }}
4.设计dao层操作数据库
public interface UserDao { User findUserById(Integer id);}
5.在dao层中添加sql语句配置文件
<?xml version="1.0" encoding="UTF-8" ?>
注意:
1.public下方的连接为引入的约束文件,xml配置文件的标签是自定义的,那么在没有定义的情况下也就没有下文的标签,该约束文件中定义了一系列与操作数据库有关的标签,内容属性,以及层次结构的设计
2.mapper标签,用于识别内部的各个sql语句,其中namespace命名空间,如果学习过C#那么可能会听说过这个名称,设置标签命名空间位置,建议与对应的dao接口的全限定名称一致。
3.select标签:同类型的标签还有update,insert,delete,分别对应更新,插入和删除,该标签内部就用于书写有关类型的sql语句,其中id属性设置sql语句的名称,我理解为sql语句的变量名,就类似于String sql = "...";操作的sql。resultType用于设置返回值类型。
6.在resources目录下配置mybatis核心配置文件
<?xml version="1.0" encoding="UTF-8" ?>
注意:
1.property标签:用于设置DataSource的属性,里面有我们在使用jdbc时经常使用的变量,例如driver,url,username,password等,这四个属性的value值用于构成DataSource基础配置
2.最后的mapper标签:用于引入各个sql配置文件的路径,一般一个sql语句配置文件用于配置处理一张表下各种CRUD业务,每一个配置文件都需要在核心配置文件下注册。
7.使用测试方法测试程序运行
@Test public void test1() throws IOException { //定义mybatis核心配置文件在classes下的路径 String mybatisPath = "mybatisConfig.xml"; //根据路径获取字节输入流对象 InputStream is = Resources.getResourceAsStream(mybatisPath); //创建SqlSessionFactoryBuilder对象 SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder(); //通过SqlSessionFactoryBuilder对象的build方法创建SqlSessionFactory对象 SqlSessionFactory factory = sqlSessionFactoryBuilder.build(is); //通过工厂类的openSession方法获取sql执行对象 SqlSession sqlSession = factory.openSession(); //sql执行对象的selectOne方法 //获取第一个参数,即执行id:由namespace + 、+ SQL语句标签id String id = "com.ling.mybatis.dao.UserDao" + "." + "findUserById"; User user = sqlSession.selectOne(id); System.out.println(user); //关闭sqlSession sqlSession.close(); }
小结:
第一次使用mybatis比较一般的jdbc连接方法,初感受就是代码量上升了,但是在操作多条sql语句时重复的代码量减少了。
疑点:
1.dao配置文件主要是用来干什么的?如何进行配置?
2.核心配置文件主要是用来干什么的?如何进行配置?
3.使用测试方法测试程序运行是如何实现的?每条语句起什么作用?
主要执行步骤:
从核心配置文件中我们可以比较容易的看出jdbc那熟悉的四条连接配置:driver,url,username和password,由此得出这里使用来配置DataSource配置文件。再往下我们可以看到一个mappers标签,内部使用mapper配置相关dao层的配置文件。那么此时我们就可以了解到,核心配置文件可以完成数据库连接的初始化操作,同时完成导入其他配置文件的操作。而导入的文件正是我们在dao层配置的与数据库操作相关的配置文件。最后来到测试文件,测试文件的第一步定义了核心配置文件的路径名;第二步使用Resource的静态方法传入核心配置文件路径,获取字节输入流;第三步使用SqlSessionFactoryBuilder对象(该对象的最主要作用就是加载配置文件创建工厂对象)的build方法,传入字节输入流,建造了工厂类对象,这时,主配置文件完成了加载,并且程序可以通过住配置文件查找到对应的dao层sql语句配置文件;第四步使用工厂类对象(该对象最主要作用就是用于)获取SqlSession对象,该对象便是执行sql相关操作的对象,最后使用SqlSession对数据库进行操作。
1.核心配置文件主要是用来干什么的?如何进行配置?
通过主要步骤,我们可以看到核心配置文件是整个程序执行流程的控制中枢,他配置了与mysql连接的相关数据信息,同时配置了其他操作sql的xml配置文件。下面我们来深入学习一下总配置文件的相关内容。
查阅mybatis操作文档我们可以获取一下配置标签:
配置
MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文件内部的标签有序,配置文档的顶层结构如下:
configuration(配置)
properties(属性)settings(设置)typeAliases(类型别名)typeHandlers(类型处理器)objectFactory(对象工厂)plugins(插件)environments(环境配置)
environment(环境变量)
transactionManager(事务管理器)dataSource(数据源)databaseIdProvider(数据库厂商标识)mappers(映射器)
1.configuration
configuration为主标签,其他所有的配置文件标签都要在configuration内书写
2.properties
properties用于配置属性,properties中使用property,以键值对配置属性,如果使用properties进行属性配置,那么下方如果想要使用该属性,可以使用${name值}来引用该属性。同时properties可以获取properties配置文件中设置的属性。
properties配置文件信息:
jdbc.driver=com.mysql.cj.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mybatis?serverTimezone=UTC
主配置文件相关配置信息:
这里driver和url信息是来自于配置文件的信息,而username和password信息是来自于properties中配置的信息
3.settings
settings用于配置功能,改变程序运作模式,例如设置打印日志:
4.typeAliases
typeAliases用于给类取别名,取过别名的类在dao文件导入时,不需要写路径名,只需写别名即可。
设置别名有两种方法:
1.单独给某个类取别名,使用typeAlias标签
优点:类路径可以随意设置,别名可以任取
缺点:需要一个一个设置
2.批量设置别名
优点:不需要一个一个设置,可以批量处理
缺点:别名固定,为类名,不用区分大小写
5.typeHandlers
typeHandler被称作类型处理器,MyBatis在设置预处理语句(PreparedStatement)中的参数或从结果集中取出一个值时,都会用类型处理器将Java对象转化为数据库支持的类型或者将获取到数据库值以合适的方式转换成 Java类型。大多是情况下使用默认的转换类型即可,当遇到特殊类型需要单独转化时,你可以重写已有的类型处理器或创建你自己的类型处理器来处理不支持的或非标准的类型。 具体做法为:实现 org.apache.ibatis.type.TypeHandler 接口, 或继承一个很便利的类 org.apache.ibatis.type.baseTypeHandler, 并且可以(可选地)将它映射到一个 JDBC 类型。
6.objectFactory
objectFactory是对象工厂,每次 MyBatis 创建结果对象的新实例时,它都会使用一个对象工厂(ObjectFactory)实例来完成实例化工作。 默认的对象工厂需要做的仅仅是实例化目标类,要么通过默认无参构造方法,要么通过存在的参数映射来调用带有参数的构造方法。 如果想覆盖对象工厂的默认行为,可以通过创建自己的对象工厂来实现。
7.plugins
plugins为增添功能引入外部依赖
Interceptor用于指定引入的依赖的类,例如当需要完成分页操作引入分页依赖时
8.☆environments
environments用于配置连接资源环境,为重点。
一个environments中可以配置多个环境,每个环境都需要设置一个唯一的id名称,其中environments的default属性就是用来指定获取连接时默认启动的环境名称。不过重点是,尽管可以配置多个环境,但每个 SqlSessionFactory 实例只能选择一种环境。因此,如果你想连接两个数据库,就需要创建两个 SqlSessionFactory 实例,每个数据库对应一个。而如果是三个数据库,就需要三个实例,依此类推。
transactionManager属性管理器
在environment中有一个内部标签transactionManager属性管理器,mybatis中有两种类型的属性事务管理器:jdbc以及managed
jdbc配置会直接使用jdbc进行事务的提交,回滚等一系列操作,使用Connection对象,由mybatis自己完成事务处理,它依赖从数据源获得的连接来管理事务作用域。
managed配置几乎没做什么,他不会进行事务的提交和回滚,而是让容器来管理事务的整个生命周期,他将事务的处理交给容器实现(有其他软件完成事务的提交,回滚)
dataSource数据源
用于配置数据库连接资源,dataSource中有一个type属性,可以设置三个属性值
1.UNPOOLED:不适用数据库连接池技术,使用UnPooledDataSource每次实现会请求打开和关闭连接,虽然有点慢,但对那些数据库连接可用性要求不高的简单应用程序来说,是一个很好的选择
2.POOLED:使用数据库连接池,mybatis会在内存中创建PooledDataSource类管理多个Connection对象,避免了创建新的连接实例时所必需的初始化和认证时间。 这种处理方式很流行,能使并发 Web 应用快速响应请求。
3.JNDI:Java的命名和目录服务。
9.mappers
mappers用于配置执行sql的xml配置文件
1.使用mapper标签导入
优点:不需要固定配置文件位置
缺点:只能一个一个导入
2.使用package批量打包
优点:可以批量导入
缺点:配置文件名必须与接口名保持一致,并位于同一包下