MyBatis-01

一.什么是框架

框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另外,框架是可被应用开发者定制的应用骨架、模板。简单的说,框架其实是半成品软件,就是一组组件,供你使用完成你自己的系统。

框架安全的,可复用的,不断升级的软件。

MyBatis :
MyBatis 是一个优秀的基于 java 的持久层框架,内部封装了 jdbc,开发者只需要关注 sql 语句本身,而不需要处理加载驱动、创建连接、创建 statement、关闭连接,资源等繁杂的过程。MyBatis 通过 xml 或注解两种方式将要执行的各种 sql 语句配置起来,并通过 java 对象和 sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并返回。

mybatis是 MyBatis SQL Mapper Framework for Java (sql映射框架)

  1. sql mapper :sql映射可以把数据库表中的一行数据 映射为 一个java对象。一行数据可以看做是一个java对象。操作这个对象,就相当于操作表中的数据
  2. Data Access Objects(DAO) : 数据访问 , 对数据库执行增删改查。

1.1 回顾传统的JDBC代码步骤

public void findStudent() {
 Connection conn = null;
 Statement stmt = null;
 ResultSet rs = null;
 try {
 //1.注册 mysql 驱动
 Class.forName("com.mysql.jdbc.Driver");
 //连接数据的基本信息 url ,username,password
 String url = "jdbc:mysql://localhost:3306/数据库名";
 String username = "root";
 String password = "root";
 //2.获取连接
 conn = DriverManager.getConnection(url, username, password);
 //保存查询结果
 List<Student> stuList = new ArrayList<>();
 //3.获取连接数据库对象
 stmt = conn.createStatement();
 //4.执行SQL语句
 rs = stmt.executeQuery("select * from student");
 //5.查询操作对象
 while (rs.next()) {
 Student stu = new Student();
 stu.setId(rs.getInt("id"));
 stu.setName(rs.getString("name"));
 stu.setAge(rs.getInt("age"));
 //从数据库取出数据转为 Student 对象,封装到 List 集合
 stuList.add(stu);
 }
 } catch (Exception e) {
 e.printStackTrace();
 } finally {
 try {
 //6.关闭资源
 if (rs != null) ;
 {
 rs.close();
 }
 if (stmt != null) {
 stmt.close();
 }
 if (conn != null) {
 conn.close();
 }
 } catch (Exception e) {
 e.printStackTrace();
 }
 } }

因此可以看出JDBC的缺陷:

  1. 代码比较多,开发效率低
  2. 需要关注 Connection ,Statement, ResultSet 对象创建和销毁
  3. 对 ResultSet 查询的结果,需要自己封装为 List
  4. 重复的代码较多
  5. 业务代码和数据库的操作混在一起

1.2 MyBatis 解决的主要问题

使用MyBatis可以减轻使用 JDBC 的复杂性,不用编写重复的创建 Connetion , Statement ; 不用编写关闭资源代码。直接使用 java 对象,表示结果数据。让开发者专注 SQL 的处理。 其他分心的工作由 MyBatis 代劳。
MyBatis 可以完成的功能有如下:

  1. 注册数据库的驱动,例如 Class.forName(“com.mysql.jdbc.Driver”))
  2. 创建 JDBC 中必须使用的 Connection , Statement, ResultSet 对象
  3. 从 xml 中获取 sql,并执行 sql 语句,把 ResultSet 结果转换 java 对象
    List list = new ArrayLsit<>();
    ResultSet rs = state.executeQuery(“select * from student”);
    while(rs.next){
    Student student = new Student();
    student.setName(rs.getString(“name”));
    student.setAge(rs.getInt(“age”));
    list.add(student);
    }
  4. 关闭资源
    ResultSet.close() , Statement.close() , Conenection.close()

总结:使用Mybatis的目的:开发人员提供sql语句—>mybatis处理sql—>开发人员得到List集合或java对象

二、MyBatis快速入门

2.1 搭建MyBatis环境

2.1.1 创建Maven工程

选择模板,如下图所示
在这里插入图片描述GroupId: 项目的包名
ArtifactId: 项目名称
Version:项目的版本号
在这里插入图片描述
建成项目后的结构:
在这里插入图片描述

2.1.2 加入Maven坐标

在pom.xml文件中加入依赖

<dependencies>
	 <!--单元测试依赖-->
	 <dependency>
		 <groupId>junit</groupId>
		 <artifactId>junit</artifactId>
		 <version>4.11</version>
		 <scope>test</scope>
	</dependency>
		 <!--MyBatis依赖-->
	 <dependency>
		 <groupId>org.mybatis</groupId>
		 <artifactId>mybatis</artifactId>
		 <version>3.5.1</version>
	 </dependency>
	 	 <!--mysql驱动-->
	 <dependency>
		 <groupId>mysql</groupId>
		 <artifactId>mysql-connector-java</artifactId>
		 <version>5.1.9</version>
	 </dependency>
 </dependencies>

加入Maven插件
解析:在Idea中,如果没有添加resources插件,只会扫描到resources目录下的xml文件。所以如果要指定编译器把不同路径下的xml文件也要扫描进去,就得添加插件。
<resource>

 <build>
	 <resources>
		 <resource>
			 <directory>src/main/java</directory><!--所在的目录-->
			 <includes><!--包括目录下的.properties,.xml 文件都会扫描到-->
			 <include>**/*.properties</include>
			 <include>**/*.xml</include>
			 </includes>
			 <filtering>false</filtering>
		 </resource>
	</resources>
	 <plugins>
		 <plugin>
			 <artifactId>maven-compiler-plugin</artifactId>
			 <version>3.1</version>
			 <configuration>
				 <source>1.8</source>
				 <target>1.8</target>
			 </configuration>
		 </plugin>
	 </plugins>
 </build>
2.1.3 创建mysql数据库和表

数据库名称为ssm

CREATE TABLE student (
 id int(11) NOT NULL ,
 name varchar(255) DEFAULT NULL,
 email varchar(255) DEFAULT NULL,
 age int(11) DEFAULT NULL,
 PRIMARY KEY (id)
);
2.1.4 编写实体代码以及接口类

创建包 com.abc.domain, 包中创建 Student 类

public class Student {
    private Integer id;
    private String name;
    private String email;
    private Integer age;
    //set(),get(),toString()
}

创建包 com.abc.dao, 包中创建 StudentDao接口

public interface studentDao {
    //查询所有数据
    List<Student> selectStudents();
}
2.1.5 编写 Dao 接口 Mapper 映射文件 StudentDao.xml

编写Mapper文件得要求:
1. 在 dao 包中创建文件 StudentDao.xml
2. 要 StudentDao.xml 文件名称和接口 StudentDao 一样,区分大小写的一样。

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace:必须有值,自定义的唯一字符串 
 	推荐使用:dao 接口的全限定名称--> 
 <mapper namespace="com.bjpowernode.dao.StudentDao">
 <!--
 <select>: 查询数据, 标签中必须是 select 语句
 id: sql 语句的自定义名称,推荐使用 dao 接口中方法名称, 
 resultType: 查询语句的返回结果数据类型,使用全限定类名 
 -->
 <select id="selectStudents" resultType="com.bjpowernode.domain.Student">
	 <!--执行的 sql 语句-->
	 select id,name,email,age from student
 </select>
</mapper>
2.1.6 创建mybaits主配置文件

项目 src/main/resources 目录下创建名称为 mybatis.xml的主配置文件
注意:resources目录必须设置为Resources root
说明:主配置文件名称是自定义的(推荐使用mybatis.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>
	 <!--配置 mybatis 环境-->
	 <environments default="mysql">
		 <!--id:数据源的名称-->
		 <environment id="mysql">
		 <!--配置事务类型:使用 JDBC 事务(使用 Connection 的提交和回滚)-->
		 <transactionManager type="JDBC"/>
		 <!--数据源 dataSource:创建数据库 Connection 对象
		 type: POOLED 使用数据库的连接池-->
		 <dataSource type="POOLED">
			 <!--连接数据库的四个要素-->
			 <property name="driver" value="com.mysql.jdbc.Driver"/>
			 <property name="url" value="jdbc:mysql://localhost:3306/abc"/>
			 <property name="username" value="root"/>
			 <property name="password" value="root"/>
		 </dataSource>
		 </environment>
	 </environments>
	 <mappers>
		 <!--告诉 mybatis 要执行的 sql 语句的位置-->
		 <mapper resource="com/bjpowernode/dao/StudentDao.xml"/>
	 </mappers>
</configuration>
2.1.7 创建测试类

在src/tst/java/com/abc/下创建mybaitsTest.java

@Test
public void testStart() throws IOException {
	 //1.mybatis 主配置文件 
	 String config = "mybatis-config.xml";
	 //2.读取配置文件 
	 InputStream in = Resources.getResourceAsStream(config);
	 //3.创建SqlSessionFactory 对象,目的是获取 SqlSession 
	 SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
	 //4.获取SqlSession
	 SqlSession session = factory.openSession();
	 //5.执行 SqlSession 的 selectList()
	 List<Student> studentList =session.selectList("com.abc.dao.StudentDao.selectStudents");
	 //6.循环输出查询结果 
	 studentList.forEach( student -> System.out.println(student));
	 //7.关闭 SqlSession,释放资源
	 session.close();
}

详解:

  1. Resources: 属于mybatis中的一个类, 负责读取主配置文件。
    InputStream in=Resources.getResourceAsStream(“mybatis.xml”);

  2. SqlSessionFactoryBuilder : 目的是为了创建SqlSessionFactory对象。
    SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
    //再通过SqlSessionFactoryBuilder调用build方法创建SqlSessionFactory对象
    SqlSessionFactory factory = builder.build(in);

  3. SqlSessionFactory : 重量级对象, 程序创建一个对象耗时比较长,使用资源比较多。因此,在整个项目中,有一个就够用了。
    SqlSessionFactory作用: 获取SqlSession对象。
    SqlSession sqlSession = factory.openSession();

    openSession()方法说明:
    Ⅰ. openSession() :无参, 获取是非自动提交事务的SqlSession对象
    Ⅱ. openSession(boolean):有参
    openSession(true) 获取自动提交事务的SqlSession.
    openSession(false) 非自动提交事务的SqlSession对象

  4. SqlSession接口 :定义了操作数据的方法 例如 selectOne() ,selectList() ,insert(),update(), delete(), commit(), rollback(),SqlSession接口的实现类DefaultSqlSession。

    说明: SqlSession对象不是线程安全的,需要在方法内部使用, 在执行sql语句之前,使用openSession()获取SqlSession对象。并且在执行完sql语句后,需要关闭它,执行SqlSession.close(). 这样能保证他的使用是线程安全的。

运行mybaitsTest.java得到的结果如下:
在这里插入图片描述
至此,myBatis的第一个入门项目已完成。
但是为了能更加清晰的了解mybatis的执行过程,可以为项目加入输出日志功能。
**添加日志:**在mybatis.xml文件中的加入如下命令即可。

<settings>
	<setting name="logImpl" value="STDOUT_LOGGING" />
</settings>

带有日志配置时,控制台输出的结果:
在这里插入图片描述

It is not more vacation we need-it is more vocation !
我们需要的不是更多的假期,而是更强的使命感!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值