MyBatis_01 入门、安装
一、JDBC
Java程序是通过JDBC(Java Data Base Connectivity)连接数据库的,JDBC是由SUN公司提出的 一系列规范,但是它只定义了接口的规范,而具体的实现是交给了各个数据库厂商去实现的, JDBC是一种典型的桥接模式
JDBC编程步骤
-
使用JDBC编程需要连接数据库,注册驱动和数据库信息
-
操作Connection,打开Statement对象
-
通过Statement执行SQL,返回结果到ResultSet对象
-
使用ResultSet读取数据,然后通过代码转换为具体的POJO对象
-
关闭数据库相关资源
JDBC弊端
-
工作量大
-
编程复杂
-
SQL代码和JAVA代码混在一起
二、ORM模型
ORM取代了JDBC,所有的ORM模型都是基于JDBC进行封装的,不同ORM模型对JDBC封装的强 度是不一样的
ORM:对象关系映射(Object Relational Mapping),简单的说ORM框架就是数据库的表和简单 Java对象的映射关系模型,我们通过这层映射关系就可以简单迅速地把数据库表的数据转化为 POJO
java程序---->映射配置---->数据库
java程序-<----映射配置<----数据库
目前较为流行的ORM框架:
-
Hibernate:ORM鼻祖,功能强大,能自动生成SQL,但是使用起来较为复杂
-
JPA:与Hibernate为同一作者
-
MyBatis:轻量级,简单易用
三、Hibernate
Hibername一问世就成为了Java世界首选的ORM框架,它是建立在POJO和数据库 表模型的直接映射关系上的
Hibernate应用程序<------hbm.xml<-------DataBase
Hibernate应用程序------>hbm.xml------->DataBase
Hibernate优势:
-
消除了代码的映射规则,它全部被分离到了XML或者注解里面去配置
-
无需再管理数据库连接,它也可以配置在XML里面
-
一个会话中,不要操作多个对象,只要操作Session对象即可
-
关闭资源只需要关闭一个Session便可
Hibernate缺陷:
-
全表映射带来了不便,比如更新时需要发送所有的字段
-
无法根据不同的条件组装不同的SQL
-
对多表关联和复杂SQL查询支持较差,需要自己写SQL,返回后,需要自己将数据组装为 POJO
-
不能有效支持存储过程
-
虽然有HQL,但是性能较差, 大型互联网系统往往需要优化SQL,而hibernate做不到
四、Mybatis
为了解决Hibernate的不足,一个半自动映射的框架MyBatis应运而生 mybatis是一个java持久层框架,它封装少、高性能·可优化、维护简单等优点成为了目前java移动 互联网网站服务的首选持久层框架,它特别适合分布式和大数据网络数据库编程 之所以称它为半自动,是因为它需要手工匹配提供POJO、SQL和映射关系,而全表映射的 Hibernate只需要提供POJO和映射关系便可
历史
Mybaits的前身是Apache的一个开源项目iBatis,2010年这个项目由apache software foundation 迁移到了 google code 并且改名为Mybatis,2013年11月迁移到Github,目前 mybaits是由Github维护的
名称
iBatis一词来源于“internet”和“abatis”的组合 mybaits所需要提供的映射文件包含以下三个部分
-
SQL
-
映射规则
-
POJO
什么时候用mybaits
-
Hibernate只适用于场景不太复杂,要求性能不太苛刻的时候
-
Mybatis拥有动态列,动态表名,存储过程支持,同时提供了简易的缓存、日 志、级联,但是它的缺陷是需要你提供映射规则和sql,所以它的开发工作量 比Hibernate略大一些
五、创建表
六、开发工具
JDK要求:>=1.8
七、创建项目
1、创建实体类(和表对应)
package com.turing.mybatis.entity; /** * 学生实体类--和表对应 * @author fred * */ public class Student { private int id; private String name; private int age; private String email; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } @Override public String toString() { return "Student [id=" + id + ", name=" + name + ", age=" + age + ", email=" + email + "]"; } }
2、引入jar包(mybatis的jar包和mysql的驱动jar包)
注意:如mybatis的版本比较高时,数据库的驱动也要使用高版本,例如mybatis版本为3.5.6 时,mysql驱动包需使用5.1.48版本,否则就会报错!
3、创建资源目录包(放在资源目录中的文件和放在根目录是一样的)
4、创建mybatis全局配置文件:mybatis-config.xml(名称可以随便取)
<?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"> <!-- 配置 --> <configuration> <!-- 多个环境 --> <environments default="development"> <!-- environment:一个环境 id:给该环境取一个标识符--> <environment id="development"> <!-- 事务管理: 使用JDBC自带的--> <transactionManager type="JDBC" /> <!-- dataSource:数据源,POOLED就是数据源的一个默认实例 --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <property name="url" value="jdbc:mysql://localhost:3306/java16" /> <property name="username" value="root" /> <property name="password" value="root" /> </dataSource> </environment> </environments> <!-- mappers:映射文件列表 --> <mappers> <!-- mapper:某一个映射 --> <mapper resource="StudentMapper.xml" /> </mappers> </configuration>
POOLED:(POOLED实则就是数据源的一个实例名)
5、创建测试类,获取SqlSessionFactory对象
package com.turing.mybatis.entity; import java.io.IOException; import java.io.InputStream; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; public class Test { public static void main(String[] args) { try { //通过XML配置文件来构建SqlSessionFactory对象 String resource = "mybatis-config.xml"; InputStream inputStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); //获取SqlSessionq(其实就相当于我们以前的Connection对象) //打开session SqlSession session = sqlSessionFactory.openSession(); try { Student stu = session.selectOne("com.turing.haha.selectStu", 1); System.out.println(stu); } finally { //关闭session session.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
6、创建映射文件StudentMapper.xml
<?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"> <!-- mapper:映射 namespace:名字空间 id:定义该条执行语句的标识符 resultType:返回类型,写全包名(全限定名) #{id}:类似于以前的占位符? --> <mapper namespace="com.turing.haha"> <select id="selectStu" resultType="com.turing.mybatis.entity.Student"> select id,p_name name,age,email from student where id = #{id} </select> </mapper>
MyBatis_02 日志、全局配置
一、配置日志(LOG4J)
使用日志可以监控SQL的执行情况,目前日志框架也非常成熟,如log4j。
1、导入jar包(可以去mybatis的lib包下拷贝)
2、加入配置文件,名称必须为:log4j.properties。(不需要手写,可以去网上拷贝一个 模板)
log4j.rootLogger=DEBUG,Console log4j.appender.Console=org.apache.log4j.ConsoleAppender log4j.appender.Console.layout=org.apache.log4j.PatternLayout log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p - %m%n log4j.logger.org.apache=INFO
3、效果(在控制台或指定文件中,输出执行过程)
二、全局配置(mybatis-config.xml)
1、配置文件头(固定写法,建议不要手写,从官网拷贝,或自己保存为一个模板,其中dtd为标签约束文 件,当电脑联网会自动下载,否则没有提示)
<?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">
2、configuration
<configuration> ... </configuration>
配置根节点,不能缺少,所有标记都必须在该标签下
3、environments
环境列表,表示在该标签下,可以配置多个environment标签,default可以指定一个默认环境。 使用场景:例如配置两个environment,一个为开发环境,一个为上线环境,开发时使用mysql,上线时使 用oracle。这样不用改变明细代码,而只用改变default就可以随意切换,非常方便
<environments default="development"> <environment id="development"> <transactionManager type="JDBC" /> <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> </environment> </environments>
-
<environment id="development"> 环境配置标签,id为该环境的唯一标识符
-
<transactionManager type="JDBC" /> 事务管理器配置,type="JDBC"表示使用JDBC自带的事务管理器,“JDBC”表示事务管理器的一个实 例,这里使用默认值即可。
-
<dataSource type="POOLED"> 数据源的配置,这里可以配置三种选项:
-
UNPOOLED:不使用连接池技术
-
POOLED:使用连接池技术
-
JNDI:使用JNDI的方式
-
4、mappers:映射器
1)概念
-
映射器是MyBatis最复杂、最核心的组件。
-
映射器提供DAO层接口到mapper.xml文件的映射,我们只需要调用DAO层的方法,就可以以执行对应 的SQL语句,这里用到的是java的动态代理特性。
-
mappers:配置mapper列表,专门放置我们写好的xxxMapper.xml配置文件。
-
mapper:resource指定xxxMapper.xml配置文件的所在路径。
2)配置映射器
<!-- 配置mappers --> <mappers> <!-- 配置单个mapper,指定文件路径 resource:指定类路径下的映射文件路径 --> <mapper resource="StudentMapper.xml" /> <!-- <mapper resource="com/turing/mapper/StudentMapper2.xml" /> --> <!-- 使用类名注册 1、指定xxxMapper映射接口的类路径 2、xxxMapper.xml文件要和映射接口在同一目录,且名称要保持一致。 3、没有sql映射文件,所有sql通过注解写在接口中。 --> <!-- <mapper class="com.turing.mapper.StudentMapper"/> --> <!-- 批量注册:指定包名,全包扫描,但xml映射文件要和映射接口放在同一包下 --> <package name="com.turing.mapper"/> </mappers>
3)使用注解配置,就不需要xxxMapper.xml配置文件,但需要配置接口或扫描接口
public interface StudentMapper { //根据id查询学生对象 @Select("select * from student where id=#{id}") Student findById(int id); }
注意:
-
注解虽然使用方便,但并不推荐,毕竟SQL写在代码中,产生了高耦合,维护起来不方便。
-
实际开发中,也可以混合使用,重要的复杂的写在xml中,不重要的简单的可以使用注解。
4)批量注册
批量注册:指定包名,全包扫描,但xml映射文件要和映射接口放在同一包下
<package name="com.turing.mapper"/>
我们通常可以在资源包下,创建一个和映射接口一模一样的文件。
5、properties:配置全局参数
<properties resource="jdbc.properties"></properties>
properties可以配置全局参数,例如可以把jdbc的四要素配置在一个properties后缀的文件中
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql:///t146 jdbc.username=root jdbc.password=root
6、typeAliases:别名设置
<typeAliases> <!-- 设置单个别名 --> <!-- <typeAlias type="com.turing.entity.Student" alias="Student"/> --> <!-- 设置批量别名 --> <package name="com.turing.entity"/> </typeAliases>
注意:
-
不管是通过 typeAlias 标签配置,还是通过package 标签配置的别名,在mapper.xml文件中使 用的时候,是可以忽略大小写的。
-
如果不手动设置别名,默认是类名的小写。
-
如果配置了注解别名,注解别名会覆盖上面的所有配置。
@Alias("stu") public class Student { ... }
7、settings:设置选项(本章不作为重点)
<settings> <!-- 是否开启驼峰命名 --> <setting name="mapUnderscoreToCamelCase" value="true"/> ... </settings>
其它设置选项和对应的值:
配置项 | 作用 | 配置选项 | 默认值 |
---|---|---|---|
cacheEnabled | 该配置影响所有映射 器中配置缓存的全局 开关 | TRUE|FALSE | T |