Mybatis学习(一)-mybatis入门案例
一、Mybatis概述
1.1、mybatis简介
1)MyBatis 是支持定制化 SQL、存储过程以及高级 映射的优秀的持久层框架。
2)MyBatis 避免了几乎所有的 JDBC 代码和手动设 置参数以及获取结果集。
3)MyBatis可以使用简单的XML或注解用于配置和原 始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记 录
1.2、MyBatis历史
1)原是Apache的一个开源项目iBatis, 2010年6月这 个项目由Apache Software Foundation 迁移到了 Google Code,随着开发团队转投Google Code 旗下, iBatis3.x正式更名为MyBatis ,代码于2013年11月迁移到Github
2)iBatis一词来源于“internet”和“abatis”的组合,是 一个基于Java的持久层框架。 iBatis提供的持久 层框架包括SQL Maps和Data Access Objects (DAO)
1.3、为什么要使用MyBatis
1)MyBatis是一个半自动化的持久化层框架
2)JDBC
- SQL夹在Java代码块里,耦合度高导致硬编码内伤
- 维护不易且实际开发需求中sql是有变化,频繁修改的情况多见
package com.dianchou.dao; import java.sql.*; /** * @author lawrence * @create 2020-07-10 17:41 */ public class JDBCTest { 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", "root", "123456"); //定义sql语句 String sql = "select * from user where name = ?"; //获取预处理statement preparedStatement = connection.prepareStatement(sql); //设置参数,第一个参数为 sql 语句中参数的序号(从 1 开始),第二个参数为设置的参数值 preparedStatement.setString(1, "AA"); //向数据库发出 sql 执行查询,查询出结果集 resultSet = preparedStatement.executeQuery(); //遍历查询结果集 while (resultSet.next()) { System.out.println("id = " + resultSet.getString("id") + ", name = " + resultSet.getString("name")); } } catch (Exception e) { e.printStackTrace(); } finally { //释放资源 if(resultSet != null){ try { resultSet.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if(preparedStatement != null){ try { preparedStatement.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } if(connection != null){ try { connection.close(); } catch (SQLException throwables) { throwables.printStackTrace(); } } } } }
3)Hibernate和JPA
- 长难复杂SQL,对于Hibernate而言处理也不容易
- 内部自动生产的SQL,不容易做特殊优化。
- 基于全映射的全自动框架,大量字段的POJO进行部分映射时比较困难。 导致数据库性能下降。
4)对开发人员而言,核心sql还是需要自己优化
5)sql和java编码分开,功能边界清晰,一个专注业务、 一个专注数据
1.4、相关网站
官方中文:https://mybatis.org/mybatis-3/zh/getting-started.html
github:https://github.com/mybatis/mybatis-3/
二、搭建 Mybatis 开发环境
2.1、创建maven工程
可以先先出src目录,使其成为一个空project,然后创建module
2.2、创建依赖坐标
在父工程pom文件中添加依赖
<!--父工程--> <dependencies> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.10</version> <scope>test</scope> </dependency> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>1.2.12</version> </dependency> </dependencies>
2.3、创建测试表
CREATE TABLE employee( id INT PRIMARY key, last_name VARCHAR(30) NOT null, email VARCHAR(30) NOT null, gender VARCHAR(30) NOT null )ENGINE=InnoDB DEFAULT CHARSET=utf8;
测试数据:
2.4、创建对应的实体类
package com.dianchou.bean; /** * @author lawrence * @create 2020-07-10 19:32 */ public class Employee { private Integer id; private String lastName; //注意:与数据表字段不一样,可以使用别名 private String email; private String gender; public Employee() { } public Employee(Integer id, String lastName, String email, String gender) { this.id = id; this.lastName = lastName; this.email = email; this.gender = gender; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } @Override public String toString() { return "Employee{" + "id=" + id + ", lastName='" + lastName + '\'' + ", email='" + email + '\'' + ", gender='" + gender + '\'' + '}'; } }
2.5、编写持久层接口EmployMappper
package com.dianchou.dao; import com.dianchou.bean.Employee; import java.util.List; /** * @author lawrence * @create 2020-07-10 19:36 */ public interface EmployeeMapper { //获取全部emp对象 List<Employee> getEmps(); }
2.6、编写持久层接口的映射文件EmployMappper.xml
创建位置:必须和持久层接口在相同的包中。
名称:必须以持久层接口名称命名文件名,扩展名是.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.dianchou.dao.EmployeeMapper"> <select id="getEmps" resultType="com.dianchou.bean.Employee"> select * from employee </select> </mapper>
2.7、创建mybatis全局配置文件
<?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="development"> <!-- 配置 mysql 的环境 --> <environment id="development"> <!-- 配置事务的类型 --> <transactionManager type="JDBC"/> <!-- 配置连接数据库的信息:用的是数据源(连接池) --> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=true&useUnicode=true&characterEncoding=utf8"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <!--sql映射文件一定要注册到全局配置文件中--> <mappers> <mapper resource="com/dianchou/dao/EmployeeMapper.xml"></mapper> </mappers> </configuration>
2.8、加入log4j配置文件
# Set root category priority to INFO and its only appender to CONSOLE. #log4j.rootCategory=INFO, CONSOLE debug info warn error fatal log4j.rootCategory=debug, CONSOLE, LOGFILE # Set the enterprise logger category to FATAL and its only appender to CONSOLE. log4j.logger.org.apache.axis.enterprise=FATAL, CONSOLE # CONSOLE is set to be a ConsoleAppender using a PatternLayout. log4j.appender.CONSOLE=org.apache.log4j.ConsoleAppender log4j.appender.CONSOLE.layout=org.apache.log4j.PatternLayout log4j.appender.CONSOLE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n # LOGFILE is set to be a File appender using a PatternLayout. log4j.appender.LOGFILE=org.apache.log4j.FileAppender log4j.appender.LOGFILE.File=d:/axis.log log4j.appender.LOGFILE.Append=true log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout log4j.appender.LOGFILE.layout.ConversionPattern=%d{ISO8601} %-6r [%15.15t] %-5p %30.30c %x - %m\n
2.9、编写测试代码
@Test public void test01() throws IOException { //1.读取配置文件 InputStream in = Resources.getResourceAsStream("mybatis-config.xml"); //2.创建SqlSessionFactory构建者对象 SqlSessionFactoryBuilder builder= new SqlSessionFactoryBuilder(); //3.创建SqlSessionFactory SqlSessionFactory factory = builder.build(in); //4.使用 SqlSessionFactory 生产 SqlSession 对象 SqlSession sqlSession = factory.openSession(); //5.使用 SqlSession 创建 dao 接口的代理对象 EmployeeMapper mapper = sqlSession.getMapper(EmployeeMapper.class); //6.使用代理对象执行查询所有方法 List<Employee> emps = mapper.getEmps(); for (Employee emp : emps) { System.out.println(emp); } //7.释放资源 sqlSession.close(); in.close(); }
问题出现:
2.10、整体目录结构
2.11、基于注解方法
1)接口添加注解
public interface EmployeeMapper { //获取全部emp对象 @Select("select * from employee") List<Employee> getEmps(); }
2)修改主配置文件
在使用基于注解的 Mybatis 配置时,请移除 xml 的sql映射配置
<!--sql映射文件一定要注册到全局配置文件中--> <mappers> <mapper class="com.dianchou.dao.EmployeeMapper"></mapper> </mappers>
-------------------------------------------
个性签名:独学而无友,则孤陋而寡闻。做一个灵魂有趣的人!