1.1.mybatis
三层架构:
表现层
用于展示数据
业务层
处理业务需求
持久层
和数据库交互的
什么是mybatis?
- mybatis 是一个优秀的基于 java 的持久层框架
- 它内部封装了 jdbc,使开发者只需要关注 sql 语句本身,
- 不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。
- 使用了ORM的思想实现了结果集的封装
什么是ORM思想?
也叫对象关系映射;
简单来说:
就是把数据库表和实体类及属性一一对应起来,让我们可以操作实体类就可以改变数据库
简单回顾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,使开发者只需要关注 sql 语句本身,
- 不需要花费精力去处理加载驱动、创建连接、创建 statement 等繁杂的过程。
- 使用了ORM的思想实现了结果集的封装
特别注意:当你完成一下三个条件,那么就可以不用写实现类了
- mybatis的映射配置文件的位置必须要和dao接口的包结构相同
- 映射配置文件mapper标签的namespace属性,必须是dao接口的全限定类名
- 映射配饰文件的操作配置,必须是dao接口的方法名
初学mybatis的环境搭建
第一步:创建maven工程并导入依赖
<!-- 打包为jar包--> <packaging>jar</packaging> <dependencies> <!-- 导入mybatis依赖 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> <!-- 导入mysql依赖--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.6</version> </dependency> <!-- 导入日志--> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.12</version> </dependency> <!-- 导入单元测试--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> </dependencies>
第二步:创建实体类和dao的接口
略
第三步:创建mybatis的主配置文件(SalMapConfig.xml);注意是在resource目录下
<?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 name="url" value="jdbc:mysql://localhost:3306/eesy_mybatis?characterEncoding=utf8"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <!-- 告知 mybatis 映射配置的位置 --> <mappers> <mapper resource="com/itheima/dao/IUserDao.xml"></mapper> <!--之后需要,在resource同级别的目录之下,有一个同名的配置文件--> </mappers> </configuration>
第四步:创建映射配置文件(IUserDao.xml);注意是在resource目录下,包的结构必须要和dao接口的结构一致
<?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"> <!--namespace:必须是dao接口的全限定类名--> <mapper namespace="com.itheima.dao.IUserDao"> <!--配置查询所有,id:必须是dao接口中的的方法名; resultType:把数据封装在哪个对象中,而且要写这个对象的全限定类名--> <select id="findALL" resultType=""> select * from user; </select> </mapper>
第五步:测试
// 1.读取配置文件 InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml"); // 2.创建SqlSessionFactory工厂 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); SqlSessionFactory factory = builder.build(in); // 3.使用工厂生产session对象 SqlSession session = factory.openSession(); // 4.使用session对象创建dao接口的代理对象 IUserDao userDao = session.getMapper(IUserDao.class); // 5.使用代理对象执行接口中的方法 List<User> user = userDao.findAll(); for(User user1 : user){ System.out.println(user1); } // 6.释放资源 session.close(); in.close();
...