Mybatis介绍
- Mybatis是一个由Java编写的持久层框架,它封装了很多JDBC的细节,使开发者只需要关注sql语句本身,而无需关注注册驱动,创建链接等繁琐的过程,它使用了ORM思想,实现了结果集的封装。
ORM介绍
- Object Relational Mapping : 对象关系映射
就是把数据库表和实体类的属性对应起来,让我们操作实体类就能完成对数据库的操作。
开始搭建环境
- 创建maven工程
pom文件中导入下面的依赖
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.4</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.19</version> </dependency>
- 建立实体类,且此实体类继承
Serializable
- 实体类属性与表中字段对应
生成所有属性的
get
,set
方法(或者使用lombok的@Data
注解)package com.oylong.domain; import java.io.Serializable; import java.util.Date; public class User implements Serializable { private Integer id; private String username; private Date birthday; private String sex; private String address; 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 Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } }
建立dao层接口,写方法
package com.oylong.dao; import com.oylong.domain.User; import org.apache.ibatis.annotations.Select; import java.util.List; public interface UserDao { public List<User> findAll(); }
- 建立mybatis配置文件,在resources文件夹中新建一个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"> <!--配置文件约束头-->
配置环境
<?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"> <!--配置文件约束头--> <!--mybatis主配置文件--> <configuration> <!--配置环境--> <environments default="mysql"> <!--配置mysql环境--> <environment id="mysql"> <!--default的值与id一致--> <transactionManager type="JDBC"></transactionManager> <!--配置食物的类型--> <dataSource type="pooled"><!--配置连数据源--> <!--配置连接信息--> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://192.168.3.66:3306/test"/> <property name="username" value="root"/> <property name="password" value="123123"/> </dataSource> </environment> </environments>
<!--指定映射配置文件位置,指每个dao的独立的配置文件-->
<mappers>
<mapper resource="com/oylong/dao/UserDao.xml"></mapper> <!--这个路径必须手动一个一个创建,根目录为resources目录-->
</mappers>
</configuration>
建立映射配置文件,加入约束
<?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">
配置映射文件
<?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="com.oylong.dao.UserDao"> <!--类名--> <select id="findAll"> <!--这里必须与dao中的方法名一致,下面为sql语句--> select * from user </select> </mapper>
注意事项
- 在resources中创建目录时,不能用 ‘ . ' 快速创建目录,用了的话只会创建一个目录
- mybatis的映射配置文件位置必须和dao接口的包结构相同
- 映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名
映射配置文件的操作配置(如select),id属性必须是dao接口的方法名
如果遵循的这个规则,那么在开发中就无需在实现dao接口的实现类
mybatis的使用
- 创建测试类
- 读取配置文件
- 创建SqlSessionFactory工厂
- 使用工厂建立SqlSession对象
- 使用SqlSession创建dao代理接口的代理对象
- 使用代理对象执行方法
- 释放资源
一个异常!!!
运行之后,出现了错误如下:A query was run and no Result Maps were found for the Mapped Statement
为什么出现这个异常呢,因为在我们的 mapper 映射文件中,并没有指明返回类型,那么mybatis框架就不知道要将返回的结果封装成什么类型,所以就出现了这个no result maps were found
的异常了。
解决方案: 在映射文件的中,加入返回类型,如下:
<?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="com.oylong.dao.UserDao"> <!--类名-->
<select id="findAll" resultType="com.oylong.domain.User"> <!--此处加入resultType-->
select * from user
</select>
</mapper>
运行
之后即可正常运行,运行代码如下:
public static void main(String[] args) throws IOException {
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
SqlSession session = factory.openSession();
UserDao userDao = session.getMapper(UserDao.class);
List<User> userList = userDao.findAll();
System.out.println(userList);
session.close();
in.close();
}