一、数据库元数据
元数据:是指数据库、表、列的定义信息。即用来定义数据表的数据

回顾元注解
元注解是用来定义注解的注解
元数据分类
数据库元数据:可以获得数据库的版本,驱动版本等信息(了解)
参数元数据:用来获得占位符?的个数以及数据类型,参数指的是SQL语句中占位符?
结果集元数据:用来获得结果集中的列的数量,列的名称,以及列的类型
二、参数元数据–ParameterMetaData
ParameterMetaData(参数元数据)可用于获取有关Preparedstatement对象(预编译对象)中参数的个数和类型。
1 2 | select * from user where name=? and password=? // ParameterMetaData可以用来获取?的个数和类型 |
获取ParameterMetaData对象
通过 PreparedStatement(预编译对象)的getParameterMetaData() 方法来获取到 ParameterMetaData对象
1 | ParameterMetaData getParameterMetaData() |
ParameterMetaData对象方法
获取PreparedStatement的SQL语句参数?的个数
1 2 | //获得占位符?的个数 int getParameterCount() |
获取指定参数的SQL类型。
1 2 3 4 5 6 7 | //获得指定第几个占位符的数据类型,从1开始 String getParameterTypeName(int param) 即 //获得指定占位符的数据类型,索引从1开始(了解) String getParameterTypeName(int index) |
注意事项:
不是所有的数据库驱动都能获取到参数类型(MySQL会出异常)
参数元数据ParameterMetaData代码示例1
1 2 3 4 5 6 7 8 9 10 11 12 13 | public class Demo01 { public static void main(String[] args) throws Exception { Connection conn = DataSourceUtils.getConnection(); String sql = "INSERT INTO student (name, age, score) VALUES (?, ?, ?)"; PreparedStatement stmt = conn.prepareStatement(sql); ParameterMetaData md = stmt.getParameterMetaData(); System.out.println("参数个数: " + md.getParameterCount()); // Parameter metadata not available for the given statement // MySQL不支持获取参数类型 // System.out.println("参数类型: " + md.getParameterTypeName(1)); } } |
参数元数据ParameterMetaData代码示例2
需求:得到SQL语句的参数元数据。
1、创建学生表:学号,姓名,性别,生日
1 | -- 创建学生表:学号,姓名,性别,生日 |
2、获取参数元数据个数及数据类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | /** 目标:掌握参数元数据的作用和常用方法 ParameterMetaData参数元数据的作用:用来获得占位符?的个数以及数据类型 ParameterMetaData参数元数据常用方法: int getParameterCount() 获得占位符?的个数 String getParameterTypeName(int index) 获得指定占位符的数据类型,索引从1开始(了解) 如何获得ParameterMetaData参数元数据对象 通过PreparedStatement对象的方法获得,方法如下: ParameterMetaData getParameterMetaData(); */ public class JDBCDemo01 { public static void main(String[] args) throws Exception{ // 需求:往学生表添加一条记录 // 1. 获得连接对象 Connection conn = DataSourceUtils.getConnection(); // 2. 获得预编译对象 PreparedStatement ps = conn.prepareStatement("insert into student values(null,?,?,?)"); // 3. 给占位符赋值 ps.setString(1, "jack"); ps.setString(2, "男"); ps.setString(3, "1999-02-20"); // 4. 获得参数元数据对象 ParameterMetaData pmd = ps.getParameterMetaData(); // 调用参数元数据对象的方法获得占位符个数和类型 int parameterCount = pmd.getParameterCount(); System.out.println("parameterCount = " + parameterCount); for (int index = 1; index <= parameterCount; index++) { // 根据索引获得对应占位符的数据类型 String typeName = pmd.getParameterTypeName(index); System.out.println(typeName); } // 5. 执行SQL语句 System.out.println(ps.executeUpdate()); // 6. 关闭资源 DataSourceUtils.close(conn, ps); } } |
默认情况下:因为MySQL驱动的原因,不支持得到参数元数据的类型。
MySQL驱动对参数元数据的数据类型支持不理想,需要如下配置才能得到参数的MySQL数据类型,而且只能得到VARCHAR类型,如果不配置这个参数则会出现异常。
1 | jdbc:mysql://localhost:3306/数据库名?generateSimpleParameterMetadata=true |
小结
参数元数据的作用:用来获得占位符个数和类型(都是varchar类型)
如何获取参数元数据对象:通过PreparedStatement对象的方法获得,方法如下:
1 | ParameterMetaDate getParameteMetaData() |
| ParameterMetaData对象常用方法 | 说明 |
|---|---|
| int getParameterCount() | 获得占位符个数 |
| String getParameterTypeName(int param) | 获得指定占位符的数据类型 |
三、结果集元数据–ResultSetMetaData
ResultsetMetaData可用于获取有关Resultset对象中列的数量,列名和列的类型。只有查询才会有结果集元素数据。

获取ResultSetMetaData对象
查询获得ResultSet后,通过 ResultSet 的 getMetaData() 方法来获取到 ResultSetMetaData 对象
1 2 | //获得结果集元数据对象 ResultSetMetaData getMetaData() |
ResultSetMetaData对象方法
返回此ResultSet对象中的列数
1 2 | //获得列的数量 int getColumnCount() |
获取指定列的名称
1 2 | //获得指定列的名称,索引从1开始 String getColumnName(int column) |
获取指定列的数据库特定类型名称
1 2 | //获得指定列的类型,索引从1开始 String getColumnTypeName(int column) |
结果集元数据ResultSetMetaData代码示例1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // ResultSetMetaData public static void test02() throws SQLException { Connection conn = DataSourceUtils.getConnection(); String sql = "SELECT * FROM student WHERE id=1"; PreparedStatement stmt = conn.prepareStatement(sql); ResultSet rs = stmt.executeQuery(); // 获取结果集元数据 ResultSetMetaData md = rs.getMetaData(); int num = md.getColumnCount(); System.out.println("列数:" + num); for (int i = 0; i < num; i++) { System.out.println("列名:" + md.getColumnName(i + 1)); // 获取列列名 System.out.println("列类型:" + md.getColumnTypeName(i + 1)); // 获取类的 类型 System.out.println("-----------"); } } |
案例效果

结果集元数据ResultSetMetaData代码示例2
只有查询才会有结果集元素数据。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | /** 目标:掌握结果集元数据的作用和常用方法 如何获得结果集元数据对象 通过ResultSet对象的方法获得,方法声明如下: ResultSetMetaData getMetaData(); 结果集元数据对象的作用:用来获得结果集中的列的数量,列的名称,以及列的类型 结果集元数据对象常用方法: int getColumnCount(); 获得列的数量 String getColumnName(int index); 获得指定列的名称,索引从1开始 String getColumnTypeName(int index); 获得指定列的类型,索引从1开始 */ public class JDBCDemo01 { public static void main(String[] args)throws Exception { // 需求:查询所有学生 // 1. 获得连接对象 Connection conn = DataSourceUtils.getConnection(); // 2. 获得预编译对象 PreparedStatement ps = conn.prepareStatement("select id,name from student;"); // 3. 执行查询操作获得结果集对象 ResultSet rs = ps.executeQuery(); // 4. 通过结果集对象获得结果集元数据对象 ResultSetMetaData rsm = rs.getMetaData(); // 获得结果集中列的信息 // 获得列数量 int columnCount = rsm.getColumnCount(); System.out.println("columnCount = " + columnCount); // 遍历列获得列名称和类型 for (int index = 1 ; index <= columnCount; index++) { // 获得列名称 String columnName = rsm.getColumnName(index); // 获得列类型 String typeName = rsm.getColumnTypeName(index); System.out.println(columnName+"="+ typeName); } // 5. 关闭资源 DataSourceUtils.close(conn, ps, rs); } } |
四、数据库元数据应用-封装增删改查方法-简化开发(简版框架)
1、封装增删改方法
我们发现,增删改都需要获取连接,关闭连接,只是SQL语句不同。我们可以使用元数据来自动给SQL设置参数,合并成一个方法。
在 DataSourceUtils 中增加一个方法 update。
增删改都调用update方法,只需要编写SQL语句和设置参数即可,可以减少代码。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | /** 重构重复代码的思路 1. 将重复出现的代码抽取到一个方法中 2. 将不同的内容作为参数传递 */ public static int update(String sql, Object...params) throws Exception{ // 1. 获得连接对象 Connection conn = DataSourceUtils.getConnection(); // 2. 获得预编译对象 PreparedStatement ps = conn.prepareStatement(sql); // 3. 给占位符赋值 // 3.1 获得参数元数据对象 ParameterMetaData pmd = ps.getParameterMetaData(); // 3.2 获得占位符个数 1 2 3 int parameterCount = pmd.getParameterCount(); // 3.3 给占位符赋值 for (int index = 1; index <= parameterCount; index++) { // 给占位符赋值 ps.setObject(index, params[index-1]); } // 4. 执行SQL并获得结果 int row = ps.executeUpdate(); // 5. 释放资源 DataSourceUtils.close(conn, ps ); return row; } |
测试增删改方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | /** 需求:封装增删改方法 */ public class JDBCDemo02 { // 添加数据 @Test public void testInsert() throws Exception{ DataSourceUtils.update("insert into student values(null,?,?,?);","rose","女","1988-01-20"); } // 更新数据 @Test public void testUpdate()throws Exception{ int row = DataSourceUtils.update("update student set name = ? where id = ?;","玫瑰花",11); System.out.println(row); } // 删除数据 @Test public void testDelete()throws Exception{ DataSourceUtils.update("delete from student where id = ?;", 11); } } |
2、封装查询方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | /** * 执行指定的SQL语句 * @param sql 要执行的查询语句 * @param clazz 集合存储对象的类型 * @return 集合 */ public static <T> List<T> queryForList(String sql, Class<T> clazz) throws Exception{ // 创建集合对象 List<T> list = new ArrayList<>(); // 1. 获得连接对象 Connection conn = DataSourceUtils.getConnection(); // 2. 获得预编译对象 PreparedStatement ps = conn.prepareStatement(sql); // 3. 执行SQL语句获得结果集对象 ResultSet rs = ps.executeQuery(); // 获得结果集元数据对象 ResultSetMetaData rmd = rs.getMetaData(); // 获得结果集中列的数量 int columnCount = rmd.getColumnCount(); // 4. 遍历结果集对象 while (rs.next()){ // 4.1 每遍历到一条记录则创建一个对象 // 通过反射创建对象(传入的字节码对象,对应的实体类) T obj = clazz.getConstructor().newInstance(); // 遍历结果集中的列 for (int index = 1; index <= columnCount; index++) { // 根据索引获得列名:name gender 就是obj的成员变量名称 String columnName = rmd.getColumnName(index); // 根据列名获得值:小波 女 Object value = rs.getObject(columnName); // 获得成员变量Field对象 Field field = clazz.getDeclaredField(columnName); // 暴力反射 field.setAccessible(true); // 给对象obj的成员变量name赋值为value field.set(obj, value); } // 4.4. 将对象添加到集合中 list.add(obj); } // 5. 释放资源 DataSourceUtils.close(conn, ps, rs); // 返回集合 return list; } |
测试查询方法
1 2 3 4 5 6 7 8 9 10 11 12 13 | /** 目标:查询所有学生,得到List<Student> */ public class JDBCDemo03 { public static void main(String[] args)throws Exception { // 执行查询获得学生集合 List<Student> list = DataSourceUtils.queryForList("select id,name from student;", Student.class); for (Student stu : list) { System.out.println(stu); } } } |
五、框架概述
1、什么是框架?
框架(Framework)是整个或者部分系统的可重用设计,是J2EE底层技术的封装。框架是可以被应用开发者(程序员)定制的应用骨架。简而言之,框架其实就是别人搭好了舞台,你来做表演。

理解:Java框架对java原生代码进行一系列的封装使其具有更高的重用型。
2、框架解决的问题
框架解决了技术整合问题
在J2EE体系中,有着各种各样的技术。不同的软件企业,根据自身的业务需求选择不同的技术,容易造成应用依赖技术,增加了项目开发实现的复杂性和技术风险性。企业项目中应该将应用的设计与实现技术解耦。
框架解决了提升开发效率的问题
企业项目中使用框架,程序员不再需要重复造轮子,只需要专注实现业务需求。使用框架的方便性,提升了开发效率。
框架解决了稳定性的问题
一个成熟的框架,经过了在众多企业项目中的验证使用。稳定性有保障。
理解:
框架的好处:代码重用性高,达到简化开发。提高开发效率,降低开发难度
3、项目分层–三层架构
在J2EE应用中,通常把项目整体进行分层设计。分为表现层、业务层、持久层,称为三层架构。
简单理解:即把代码按作用分成三类,放在src下三个文件夹
表现层(也称web层):
业务层(也称service层):
持久层(也称dao层):

javaweb——初用idea创建一个三层架构的web项目(Dao,service,controller):https://blog.csdn.net/qq_38261445/article/details/87927006
4、项目分层后常用的框架

持久层框架MyBatis

关于持久层的框架,还有一个封装程度更高的框架(hibernate),该框架相对比较重量级,以及其它各个方面的原因, 目前流行程度下降了很多,企业项目中用的越来越少了。
业务层(通常不使用框架,业务逻辑自己实现)
表现层框架Spring MVC

解决技术整合的框架

小结
1、框架组合简称:
SSM:
springmvc
spring
mybatis
SSH
struct2
spring
hibernate
2、三层架构中,每一层最常用的框架分别是什么?
web层:springmvc
service层:spring
dao层:mybatis
六、MyBatis 框架快速入门
1、Mybatis框架介绍
mybatis是Apache软件基金会下的一个开源项目,前身是ibatis框架。2010年这个项目由apache软件基金会迁移到google code下,改名为mybatis, 2013年11月又迁移到了github (https://github.com/mybatis/mybatis3/releases)。github网站是全球最大的代码托管平台
mybatis是一个持久层的框架,是对jdbc操作数据库的封装,使开发者只需要关注业务本身,不需要花费精力去处理加载驱动、创建数据库连接对象、创建statement语句对象、参数设置、结果集处理等一系列繁杂的过程代码。
mybatis框架通过xml或注解进行配置,将java对象与sql语句中的参数自动映射生成最终执行的sql语句,并将sql语句执行结果自动映射成java对象
三句话概括介绍:
1、mybatis框架早期版本叫做ibatis, 目前源代码托管在github
2、mybatis框架是对jdbc操作数据库的封装,是一个持久层的框架
3、mybatis框架通过xml或者注解进行配置,实现java对象与sql语句的自动对应关系(映射)
2、官方网站及框架包下载
MyBatis官网
官方文档地址:http://www.mybatis.org/mybatis-3/

MyBatis框架包下载
官网下载

github下载框架地址:https://github.com/mybatis/mybatis-3/releases

3、使用MyBatis框架的开发方式
XML配置方式
注解配置方式
小结
官方文档地址:http://www.mybatis.org/mybatis-3/
下载框架地址:https://github.com/mybatis/mybatis-3/releases
1、Mybatis框架早期版本叫做ibatis,目前源代码托管在github。
2、Mybatis框架是对jdbc操作数据库的封装,是一个持久层的框架。
3、Mybatis框架通过xml或者注解进行配置,实现java对象与sql语句的自动对应关系(映射)
七、MyBatis入门案例体验
案例需求
使用mybatis框架查询数据库user表的全部用户数据,并打印到控制台上

数据准备
在MySQL数据库创建表和插入数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | -- 创建用户表 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; |
开发流程
1 创建项目
2 加入 mybatis 框架 jar 包
3 准备配置文件:sqlMapConfig.xml,log4j.properties
4 编写用户实体类(User)
5 编写用户 dao 接口(UserMapper)
6 编写用户 dao 接口映射文件(UserMapper.xml)
7 在 sqlMapConfig.xml 中,加载 UserMapper.xml
8 编写测试代码
开发流程实现(1-3)环境搭建
1、在IDEA项目创建模块,模块名自定义。
2、导入Mybatis框架jar包
模块下创建lib文件夹,加入jar包。
1、mybatis框架包
2、mysql数据库驱动包
3、log4j日志包
右键lib文件夹 -> “Add as Library”

Log4j是由Apache提供的日志操作包,用于帮助用户处理日志信息。
log4j是什么,log4j解决了什么问题,log4j怎么用:
https://blog.csdn.net/weixin_41356040/article/details/79102654
3、准备配置文件
sqlMapConfig.xml(mybatis核心配置,执行入口)
sqlMapConfig.xml它是 mybatis 框架的核心配置文件,是执行入口。
在src下创建文件,命名为sqlMapConfig.xml(右键src,new File->sqlMapConfig.xml)。先创建,等下编写
1 | <?xml version="1.0" encoding="UTF-8" ?> |
log4j.properties
在 src 下准备日志配置文件log4j.properties。
固定内容不用记,整个文件复制过来
1 2 3 4 5 6 | # Global logging configuration log4j.rootLogger=DEBUG, stdout # Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n |
开发流程实现–编写sqlMapConfig.xml文件
完成mybatis主配置文件相关信息的配置:数据库环境信息配置,包括如下:
1、导入mybatis约束(复制约束信息),即sqlMapConfig.xml开头约束
2、数据库事务配置
3、连接池配置
编写SqlMapConfig.xml主配置文件
1、配置要操作的数据库mysql
2、配置事务管理器:使用JDBC事务管理
3、配置数据源:数据库地址url、数据库驱动driver、账号username、密码password
4、使用mysql默认的连接池
5、dao接口映射文件(后面补充)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | <?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标签的作用:配置数据库环境:告诉mybatis框架要操作哪个数据 可以配置多个,但一般就一个 --> <environments default="mysql"> <!-- environment标签的作用:配置一个数据库环境 id属性:设置环境的唯一标识 transactionManager标签的作用:配置事务管理器 type属性:设置事务管理器的类型,可用值如下: "JDBC":mybatis的事务管理使用jdbc的事务管理方式,目前都选择该值 "MANAGED" 事务交个容器管理,后续事务都是交给spring容器管理 dataSource标签的作用:配置数据源(连接池) type属性:设置数据源的类型,可用值如下: pooled:使用mybatis自定义的连接池 unpooled:不使用连接池,每次都是重新获得连接对象,操作完毕直接销毁连接 jnid:使用外部配置的连接池 --> <environment id="mysql"> <!-- 配置事务管理器 --> <transactionManager type="JDBC"></transactionManager> <!--配置数据源--> <dataSource type="pooled"> <property name="url" value="jdbc:mysql:///day17"/> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <!--实体类映射文件,即dao接口映射文件--> <mappers> <mapper resource=""/> </mappers> </configuration> |
Mybatis主配置文件的作用:
配置事务管理器
配置数据源参数(连接池信息)
开发流程实现(4-7)编写代码
1、编写用户实体类(User)
在Java中,实体类就是一个拥百有Set和Get方法的类。实体类通常总是和数据库度之类的(所谓持久层数据)联系在一起。这种联系是借由框架知(如Hibernate)来建立的。
1、实体类的名字尽量和数据库的表的名字对应相同
2、实体类有属性和方法,属性对应数据库中表的字段,主要有getter和setter方法。有参、无参构造方法
2、实体类应该实现java.io.Serializable接口。
3、实体类还应该有个属性serialVersionUID(参考序列化流)
Java实体类(entity)作用
https://zhidao.baidu.com/question/299895038.html
实体类代码User.class
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | package com.itheima.entity; import java.util.Date; public class User { private int id; private String username; private String sex; private Date birthday; private String address; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } public String getAddress() { return address; } public void setAddress(String address) { this.address = address; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", sex='" + sex + '\'' + ", birthday=" + birthday + ", address='" + address + '\'' + '}'; } } |
2、编写用户 dao 接口(UserMapper)
DAO全称Data Access Object,即数据访问对象,是一个面向对象的数据库接口。
数据访问对象(data access object,DAO)是为某种类型的数据库或其他持久性机制提供一个抽象接口的对象。通过映射应用程序对持久层的调用,DAO提供一些特定的数据操作,而无需暴露数据库细节。
什么是 DAO:
https://www.leiue.com/2494
UserMapper接口
编写用户 dao 接口,提供操作数据库的方法
1 2 3 4 5 6 7 8 9 | /** 数据访问层接口 */ public interface UserMapper { /** * 查询所有用户 */ List<User> findAllUsers(); } |
3、编写用户 dao 接口映射文件(UserMapper.xml)
用户 dao 接口映射文件与dao接口一同放在dao包下。
UserMapper.xml
1、配置要映射的dao接口位置(dao接口路径)
2、映射的dao接口方法
3、方法返回值类型(封装数据的实体类)
4、方法要执行的SQL语句
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <?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:设置接口的位置:接口的类全名字符串 --> <mapper namespace="com.itheima.dao.UserMapper"> <!-- select标签作用:用来执行查询SQL语句 id属性:对应接口中方法的名称 resultType属性:设置方法返回值类型 * 如果是集合类型,则resultType设置集合元素的类型即可 * 如果引用类型(非集合),则直接引用类型的类全名字符串即可 标签体:要执行的SQL语句 --> <select id="findAllUsers" resultType="com.itheima.entity.User"> select * from user; </select> </mapper> |
4、在sqlMapConfig.xml中加载接口映射配置文件
在sqlMapConfig.xml中增加接口映射
SqlMapConfig.xml
1 2 3 4 5 6 7 | <mappers> <!--mapper标签的作用:关联接口映射文件 resource属性:关联本地的接口映射文件 url属性:关联互联网上的接口映射文件,比如:http://www.itcast.cn/xxx.xml --> <mapper resource="com/itheima/dao/UserMapper.xml"></mapper> </mappers> |
小结
使用Mybatis框架以后数据访问层还用写实现类吗?那么如何操作?
答:不需要有接口实现类,需要有接口映射文件
开发流程实现(8)编写测试代码
1、通过Resources类,加载sqlMapConfig.xml,得到文件输入流对象
2、实例化会话工厂创建类SqlSessionFactoryBuilder
3、通过会话工厂创建类,读取上面的输入流,得到会话工厂SqlSessionFactory类
4、使用SqlSessionFactory对象,创建SqlSession对象
a、它相当于JDBC中的Connection对象,提供了操作数据库的CRUD方法
b、它提供了一个getMapper()方法,获取接口的实现对象。
5、获取接口 UserMapper 实现类对象
6、执行数据库的查询操作,输出用户信息
7、关闭会话,释放资源。
测试类代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | /** * 测试类 */ public class TestUserMapper { @Test public void testFindAllUsers() throws Exception{ // 1. 通过Resources类,加载sqlMapConfig.xml,得到文件输入流对象 // Resources类专门从src下加载资源文件并获得输入流 InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml"); // 2. 实例化会话工厂创建类SqlSessionFactoryBuilder SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); // 3. 通过会话工厂创建类,读取上面的输入流,得到会话工厂SqlSessionFactory类 SqlSessionFactory sqlSessionFactory = builder.build(in); // 4. 使用SqlSessionFactory对象,创建SqlSession对象 (等价于Connection对象) SqlSession sqlSession = sqlSessionFactory.openSession(); // a) 它相当于JDBC中的Connection对象,提供了操作数据库的CRUD方法 // b) 它提供了一个getMapper()方法,获取接口的实现对象。 // 5. 获取接口 UserMapper 实现类对象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); System.out.println("userMapper ===>" + userMapper); // 6. 执行数据库的查询操作,输出用户信息 List<User> list = userMapper.findAllUsers(); for (User user : list) { System.out.println(user); } // 7. 关闭会话,释放资源。 sqlSession.close(); } } |
测试效果

UserMapper 这个对象是由 mybatis 生成的代理类

Mybatis入门案例项目结构
