Mybatis–基础环境搭建
mybatis框架介绍
mybatis是Apache软件基金会下的一个开源项目,前身是iBatis框架。2010年这个项目由apache 软件基金会迁移到google code下,改名为mybatis。2013年11月又迁移到了github。
mybatis的优点
- 简单易学:mybatis本身就很小且简单。没有任何第三方依赖,最简单安装只要两个jar文件+配置几个SQL映射文件即可。
- 使用灵活:Mybatis不会对应用程序或者数据库的现有设计强加任何影响。SQL语句写在XML里,便于统一管理和优化。
- 解除SQL与程序代码的耦合:通过提供DAO层,将业务逻辑和数据访问逻辑分离,使系统的设计更清晰,更易维护,更易进行单元测试。SQL语句和代码的分离,提高了可维护性。
mybatis的不足
- 编写SQL语句时工作量很大,尤其是字段多、关联表多时,更是如此。
- SQL语句依赖于数据库,导致数据库移植性差,不能更换数据库。
- 框架还是比较简陋,功能尚有缺失,二级缓存机制不佳
ORM的概念
-
ORM概念:Object Relational Mapping 对应关系映射
java语言是面向对象的,mysql是关系型数据库,两者需要有一个映射机制,这个映射机制称为ORM。由框架自动去完成的。
-
mybatis的两种映射方式
-
通过XML的配置文件
-
通过注解
-
入门案例:环境的搭建
需求
利用mybatis框架,从MySQL中查询所有的用户
数据准备:
create table user (
id int primary key auto_increment,
username varchar(20) not null,
birthday date,
sex char(1) default '男',
address varchar(50)
);
insert into user values (null, '孙悟空','1980-10-24','男','花果山水帘洞');
insert into user values (null, '白骨精','1992-11-12','女','白虎岭白骨洞');
insert into user values (null, '猪八戒','1983-05-20','男','福临山云栈洞');
insert into user values (null, '蜘蛛精','1995-03-22','女','盤丝洞');
select * from user;
环境搭建步骤
-
创建项目(模块)
-
创建lib目录,复制以下包
-
日志记录包
-
mysql驱动
-
mybatis框架的包
-
-
核心配置文件:sqlMapperConfig.xml放在src目录下
-
日志记录的配置文件:log4j.properties
-
编写用户DAO接口(UserMapper)
-
编写用户DAO接口映射文件(UserMapper.xml)放在src目录下
-
修改核心配置文件中sqlMapConfig.xml,加载UserMapper.xml
-
编写测试代码
mybatis配置文件分两种,这2种都是XML文件
- 核心配置文件:配置数据库连接,连接池等属性
- 实体类映射文件:编写SQL语句,指定表与类ORM之间映射关系
环境图示
入门案例:配置文件和接口
核心配置文件:sqlMapConfig.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>
<typeAliases>
<!--将一个包下的实体类 统一定义别名,类名小写-->
<package name="com.itheima.entity"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<!--1. 配置连接池参数-->
<dataSource type="POOLED">
<!--数据库驱动类名-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<!--连接字符串-->
<property name="url" value="jdbc:mysql://localhost:3306/test"/>
<!--用户名-->
<property name="username" value="root"/>
<!--密码-->
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 指定实体类映射文件位置,这里不是包名,而是路径 -->
<mapper resource="ContactMapper.xml"/>
</mappers>
</configuration>
映射文件配置:ContactMapper.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">
<!--namespace:命名空间,指定接口的完全限定名字-->
<mapper namespace="ContactMapper">
<!--
id:表示接口中方法名
resultType:表示方法返回的数据类型,如果返回的是集合,这里指定集合中每个元素类型
select标签标签体就是SQL语句
-->
<select id="findAllContact" resultType="com.itheima.entity.Contact">
select * from contact
</select>
<select id="findById" resultType="com.itheima.entity.Contact" parameterType="java.lang.Integer">
select * from contact where id=#{id}
</select>
</mapper>
测试类:
public class Tset {
@Test
public void select() throws IOException {
InputStream inputStream = Resources.getResourceAsStream("sqlMapperConfig.xml");
//1.创建会话工厂建造类
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//2.创建会话工厂对象,读取核心配置文件
SqlSessionFactory factory = builder.build(inputStream);
//3.从工厂中获取会话对象,相当于获取数据库的连接对象
SqlSession sqlSession = factory.openSession();
List<Object> objects = sqlSession.selectList("ContactMapper.findAllContact");
for (Object object : objects) {
System.out.println(object);
}
sqlSession.close();
}
}
小结:核心配置文件功能:设置数据库连接参数等
映射配置文件功能:你要执行的sql语句
注意里面的标签,和sql语句对应
在测试类中调用:
1、使用mybatis提供的输入流读取核心配置文件
2、获取sql会话对象
3、使用映射文件namespace属性点调用id属性值,就像对象名.方法名。
核心配置文件属性介绍:
properties:
作用:加载外部的属性文件,扩展名为.properties
编写数据库连接属性资源文件(db.properties)
放在src目录下
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/test
jdbc.username=root
jdbc.password=root
在核心配置文件中引入:
<!--
加载外部的属性文件,自动在类路径下去找,将属性文件中所有的键和值加载到内存中
下面就可以通过${键名}获取值
resource:读取类路径下属性文件
url: 在网络上或本地其它路径读取属性文件
<properties url="file:///d:/db.properties"/>
<properties resource="db.properties"/>
如果内部和外部有同名键,先加载内部的,再加载外部,外部后加载会覆盖先加载的
-->
<properties resource="db.properties">
<!--在文档内定义键和值-->
<property name="jdbc.driver" value="com.mysql.jdbc.Driver"/>
<property name="jdbc.url" value="jdbc:mysql://localhost:3306/day25"/>
<property name="jdbc.username" value="root"/>
<property name="jdbc.password" value="root"/>
</properties>
typeAliases:
作用:给数据类型定义别名
在实体类映射文件中,编写SQL语句属性
resultType=“com.itheima.entity.User” 能不能简化它的写法呢?可以的
可以在核心配置文件中使用typeAliaes来给实体类定义别名
内置别名:
别名是小写的,以下类型可以直接使用
parameterType="java.lang.Integer" 换成 parameterType="int"
别名 | 真实类型 |
---|---|
_byte | byte |
_long | long |
_short | short |
_int | int |
_integer | int |
_double | double |
_float | float |
_boolean | boolean |
string | String |
byte | Byte |
long | Long |
short | Short |
int | Integer |
integer | Integer |
double | Double |
float | Float |
boolean | Boolean |
date | Date |
decimal | BigDecimal |
bigdecimal | BigDecimal |
object | Object |
map | Map |
hashmap | HashMap |
list | List |
arraylist | ArrayList |
collection | Collection |
iterator | Iterator |
自定义类的别名定义
分为两种:
单个定义
一个包下的自动扫名
<!--
给类型定义别名
子元素 typeAlias 属性:
type:指定实体类的完全限定名
alias:表示类的别名,可以省略。省略后默认就是类名,别名不区分大小
<typeAlias type="com.itheima.entity.User"/>
子元素:package 给整个包下实体类定义别名,别名就是类名
1. name属性指定要扫描包名
2. 如果有多个包在同一个父包下,只要配置父包就可以了,所有的子包会自动扫描
3. 也可以指定多个package来设置不同的名
-->
<typeAliases>
<package name="com.itheima.entity"/>
</typeAliases>
mappers
作用:加载外部的实体类映射文件,是XML配置文件
方式一:加载单个映射文件mapper
方式二:包扫描加载映射文件package
<!-- 加载其它映射文件 -->
<mappers>
<!--
子元素:mapper
属性:
resource:加载类路径下指定的配置文件,注:分隔符是/,而不是点号
url: 读取指定路径下配置文件,或者网络的配置文件
<mapper url="file:///d:/UserMapper.xml"/>
class: 指定接口的完全限定名,用于注解的配置,不需要XML文件。现在用不到
<mapper class="com.itheima.dao.UserMapper"/>
子元素:package
1. 指定扫描哪个包下所有的DAO接口,如果使用这种写法,接口名与配置文件名字要相同。
如:接口名UserMapper.java 配置文件名:UserMapper.xml
2. 接口与配置文件必须放在同一个包下
-->
<package name="com.itheima.dao"/>
</mappers>