MyBatis 框架 概述
- mybatis是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql 语句本身,而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。
- mybatis通过 xml 或注解的方式将要执行的各种statement配置起来,并通过java对象和statement 中
sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。 - 采用 ORM 思想解决了实体和数据库映射的问题,对 jdbc进行了封装,屏蔽了 jdbc api 底层访问细节,使我们不用与 jdbc api 打交道,就可以完成对数据库的持久化操作。
JDBC解析Mybatis使用理由
- JDBC回顾
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
//加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//通过驱动管理类获取数据库链接
connection = DriverManager
.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8","ro
ot", "root");
//定义 sql 语句 ?表示占位符
String sql = "select * from user where username = ?";
public static void main(String[] args) {
Connection connection = null;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
//加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
//通过驱动管理类获取数据库链接
connection = DriverManager
.getConnection("jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8","ro
ot", "root");
//定义 sql 语句 ?表示占位符
String sql = "select * from user where username = ?";
- 分析JDBC问题
- 首先主要是JDBC主要是为了实现sql语句,操纵数据库的数据
- 但是传统JDBC的操作过于繁琐,以至于会大大增加程序员的工作量
- 所以mybatis框架就是解决这一问题,将繁琐的代码封装起来,让程序员把心思放在解决业务上。
- 解析JDBC
- 数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库链接池可解决此问题。
- Sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变 java代码。
- 使用 preparedStatement 向占有位符号传参数存在硬编码,因为 sql 语句的 where 条件不一定,可能多也可能少,修改 sql 还要修改代码,系统不易维护。
- 对结果集解析存在硬编码(查询列名),sql 变化导致解析代码变化,系统不易维护,如果能将数据库记录封装成 pojo 对象解析比较方便。
Mybatis环境搭建(IDEA)
- 步骤:
- 第一步:创建maven工程并导入坐标
- 第二步:创建实体类和dao的接口
- 第三步:创建Mybatis的主配置文件
- SqlMapConifg.xml
- 第四步:创建映射配置文件
- IUserDao.xml
- 注意事项:
- 创建IUserDao.xml 和 IUserDao.java时名称是为了和我们之前的知识保持一致。在Mybatis中它把持久层的操作接口名称和映射文件也叫做:Mapper,所以:IUserDao 和 IUserMapper是一样的
- 在idea中创建目录的时候,它和包是不一样的
- 包(package)在创建时:com.itheima.dao它是三级结构
- 目录(directory)在创建时:com.itheima.dao是一级目录
- mybatis的映射配置文件位置必须和dao接口的包结构相同
- 映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名
- 映射配置文件的操作配置(select),id属性的取值必须是dao接口的方法名
- 当我们遵从了第三,四,五点之后,我们在开发中就无须再写dao的实现类。
-
打开IDEA
-
点击Create New Project,进入页面
-
左边栏里找到Maven,点击后
-
可以选择勾选create from archetype
-
也可以不选(当作普通的JAVA工程项目),点next到下一页,上面都是自由填写
-
一直点next
-
通过网站mybatis依赖,找到依赖注入
-
还需要一些其他的依赖
-
创建实体类
public class User implements Serializable{
private Integer id;
private String username;
private Date biethday;
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 getBiethday() {
return biethday;
}
public void setBiethday(Date biethday) {
this.biethday = biethday;
}
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;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", biethday=" + biethday +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
}
- 创建Dao接口
public interface IUserDao {
List<User> findAll();
}
- 创建Mybatis的主配置文件SqlMapConifg.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="mysql">
<!--配置mysql环境-->
<environment id="mysql">
<!--配置事务环境-->
<transactionManager type="JDBC"></transactionManager>
<!--配置数据源(连接池)-->
<dataSource type="POOLED">
<!--连接池的基本四项信息-->
<property name="driver" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis"></property>
<property name="username" value="root"></property>
<property name="password" value="123456"></property>
</dataSource>
</environment>
</environments>
<!--指定映射配置文件的位置,映射配置文件指的是每个DAO独立的配置文件-->
<mappers>
<mapper resource="com/lwb/dao/IUserDao.xml"></mapper>
</mappers>
</configuration>
- 创建映射配置文件 IUserDao.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="com.lwb.dao.IUserDao">
<!--查询所有-->
<select id="findAll">
SELECT * FROM USER
</select>
</mapper>
- 测试案例
import com.lwb.dao.IUserDao;
import com.lwb.domain.User;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.InputStream;
import java.util.List;
public class test1 {
public static void main(String[] args)throws Exception {
// 第一步:读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapConifg.xml");
// 第二步:创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory sqlSessionFactory = builder.build(in);
// 第三步:创建SqlSession
SqlSession session = sqlSessionFactory.openSession();
// 第四步:创建Dao接口的代理对象
IUserDao dao = session.getMapper(IUserDao.class);
// 第五步:执行dao中的方法
List<User> users= dao.findAll();
System.out.println(users);
// 第六步:释放资源
session.close();
in.close();
}
}