这是学习Mybatis的第一天,冲冲冲! 简而言之,框架其实就是某种应用的半成品,就是一组组件,供你选用完成你自己的系统。简单说就是使用别人搭好的舞台,你来做表演。而且,框架一般是成熟的,不断升级的软件。 框架一般处在低层应用平台(如 J2EE)和高层业务逻辑之间的中间层,框架封装了很多细节,使开发者可以用极简的方式开发功能,大大提高了开发效率。 mybatis是一个优秀的基于 java 的持久层框架,它内部封装了 jdbc,使开发者只需要关注 sql语句本身, 而不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。 以上都不是框架: 1、数据库链接创建、释放频繁造成系统资源浪费从而影响系统性能,如果使用数据库连接池可解决此问题。 第一步:创建maven工程并导入坐标 环境搭建的注意事项 3.编写 User 实体类 通过快速入门示例,我们发现使用 mybatis 是非常容易的一件事情,因为只需要编写 Dao 接口并且按照 mybatis 要求编写两个配置文件,就可以实现功能。远比我们之前的 jdbc 方便多了。(我们使用注解之后,将变得 更为简单,只需要编写一个 mybatis 配置文件就够了。)初识Mybatis,您可太棒了
一. 什么是框架
框架的重要性
框架的重要性在于它实现了部分功能,并且能够很好的将低层应用平台和高层业务逻辑进行了缓和。
为了实现软件工程中的“高内聚、低耦合”。把问题划分开来各个解决,易于控制,易于延展,易于分配资源。我们常见的 MVC 软件设计思想就是很好的分层思想。
刚从javaweb上来的同学有必要了解一下三层架构在ssm框架中的对应关系:
Mybatis框架概述
mybatis通过xml 或注解的方式将要执行的各种statement配置起来,并通过java对象和statement 中 sql 的动态参数进行映射生成最终执行的 sql 语句,最后由 mybatis 框架执行 sql 并将结果映射为 java 对象并 返回。
采用 ORM 思想解决了实体和数据库映射的问题,对 jdbc进行了封装,屏蔽了 jdbc api 底层访问细节,使我 们不用与 jdbc api 打交道,就可以完成对数据库的持久化操作。
ORM: object relational Mappging 对象关系映射
简单的说就是: 把数据库表实体类及实体类的属性对应起来,让我们操作实体类就实现操作数据库表.
实体类中的属性要和数据库表的字段名保持一致:
user User
id id
user_name user_name二. 持久层技术解决方案
connection
preparedStatement
ResultSet
Spring对jdbc的简单封装
它和spring的JdbcTemplate很像,也是对Jdbc的简单封装
JDBC是规范
spring的JdbcTemplate和Apache的Dbutils都是工具类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 = ?"; //获取预处理 statement preparedStatement = connection.prepareStatement(sql); //设置参数,第一个参数为 sql 语句中参数的序号(从 1 开始),第二个参数为设置的 参数值 preparedStatement.setString(1, "王五"); //向数据库发出 sql 执行查询,查询出结果集 resultSet = preparedStatement.executeQuery(); //遍历查询结果集 while(resultSet.next()){ System.out.println(resultSet.getString("id")+" "+resultSet.getString("username")); } } catch (Exception e) { e.printStackTrace(); }finally{ //释放资源 if(resultSet!=null){ try { resultSet.close(); } catch (SQLException e) { e.printStackTrace(); } } if(preparedStatement!=null){ try { preparedStatement.close(); } catch (SQLException e) { e.printStackTrace(); } } if(connection!=null){ try { connection.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } } 上边使用 jdbc 的原始方法(未经封装)实现了查询数据库表记录的操作。
jdbc 问题分析
2、Sql 语句在代码中硬编码,造成代码不易维护,实际应用 sql 变化的可能较大,sql 变动需要改变 java 代码。
3、使用 preparedStatement 向占有位符号传参数存在硬编码,因为 sql 语句的 where 条件不一定,可能 多也可能少,修改 sql 还要修改代码,系统不易维护。
4、对结果集解析存在硬编码(查询列名),sql 变化导致解析代码变化,系统不易维护,如果能将数据库记 录封装成 pojo 对象解析比较方便。三. Mybatis入门
mybatis环境搭建
第二步:创建实体类和dao的接口
第三步:创建Mybatis的主配置文件
sqlMapconfig.xml
第四步:创建映射配置文件
IUserDao.xml
第一个:创建IUserDao.xml和IUserDao.java是为了和我们之前的知识保持一致。
在Mybatis中把持久层的操作接口名称和映射文件也叫作:mapper
所以IUserDao和IUserMapper是不一样的
第二个:在idea中创建目录的时候,它和包是不一样的包在创建时,com.zzd.dao是三级结构,目录在创建时com.zzd.dao是一级目录。
关于如何建目录创建多级package:
点击取消即可
第三个:
mybatis的映射配置文件位置必须和dao接口的包结构相同
第四个:
映射配置文件的mapper标签namespace属性的取值必须是dao接口的全限定类名
第五个:
映射配置文件的操作配置(select),id属性的取值必须是dao接口的方法名IDEA创建步骤
<dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> <scope>runtime</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.12</version> </dependency> </dependencies>
package com.zzd.domain; import java.util.Date; /** * @author 张振东 * @version V1.0 * @Title: * @Package * @Description: (用一句话描述该文件做什么) * @date: */ public class User { 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; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + ''' + ", birthday=" + birthday + ", sex='" + sex + ''' + ", address='" + address + ''' + '}'; } }
package com.zzd.dao; import com.zzd.domain.User; import java.util.List; /** * @author 张振东 * @version V1.0 * @Title: * @Package * @Description: (用一句话描述该文件做什么) * @date: */ public interface IUserDao { /** * 查询所有用户 * @return */ List<User> findAll(); }
要求: 创建位置:必须和持久层接口在相同的包中。
名称:必须以持久层接口名称命名文件名,扩展名是.xml<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "https://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.zzd.dao.IUserDao"> <!-- 配置查询所有操作 --> <select id="findAll" resultType="com.zzd.domain.User"> select * from user </select> </mapper>
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "https://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!-- 配置 mybatis 的环境 --> <environments default="mysql"> <!-- 配置 mysql 的环境 --> <environment id="mysql"> <!-- 配置事务的类型 --> <transactionManager type="JDBC"></transactionManager> <!-- 配置连接数据库的信息:用的是数据源(连接池) --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/firstdb?useUnicode=true&characterEncoding=UTF-8"/> <property name="username" value="root"/> <property name="password" value="zzd..000"/> </dataSource> </environment> </environments> <!-- 告知 mybatis 映射配置的位置 --> <mappers> <mapper resource="com/zzd/dao/IUserDao.xml"/> </mappers> </configuration>
import com.zzd.dao.IUserDao; import com.zzd.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; /** * @author 张振东 * @version V1.0 * @Title: * @Package * @Description: (用一句话描述该文件做什么) * @date: */ public class MybatisTest { public static void main(String[] args) throws Exception { //1.读取配置文件 InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml"); //2.创建 SqlSessionFactory 的构建者对象 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //3.使用构建者创建工厂对象SqlSessionFactory SqlSessionFactory factory = builder.build(in); //4.使用 SqlSessionFactory 生产 SqlSession 对象 SqlSession session = factory.openSession(); //5.使用 SqlSession 创建 dao 接口的代理对象 IUserDao userDao = session.getMapper(IUserDao.class); //6.使用代理对象执行查询所有方法 List<User> users = userDao.findAll(); for (User user : users) { System.out.println(user); } //7.释放资源 session.close(); in.close(); } }
补充(基于注解的 mybatis 使用)
/** * * <p>Title: IUserDao</p> * <p>Description: 用户的持久层操作</p> * * <p>Company: https://www.itheima.com/ </p> * */ public interface IUserDao { /** * 查询所有用户 * @return */ * @Select("select * from user") * List<User> findAll(); }
<!-- 告知 mybatis 映射配置的位置 --> <mappers> <mapper class="com.itheima.dao.IUserDao"/> </mappers>
小结
但是,这里面包含了许多细节,比如为什么会有工厂对象(SqlSessionFactory),为什么有了工厂之后还 要有构建者对象(SqlSessionFactoryBuilder),为什么 IUserDao.xml 在创建时有位置和文件名的要求等等。
这些问题我们在自定义 mybatis 框架的章节,通过层层剥离的方式,给大家讲解。
请注意:自定义 Mybatis 框架,不是让大家回去自己去写个 mybatis,而是让我们能更好了了解 mybatis 内部是怎么执行的,在以后的开发中能更好的使用 mybatis 框架,同时对它的设计理念(设计模式)有 一个认识
END!!! 下篇接着介绍。
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算