一, 基本概念和介绍
数据持久化的概念
数据持久化是将内存中的数据模型转换为存储模型, 以及将存储模型转换为内存中的数据模型的统称. 例如, 文件的存储, 数据的读取等都是数据持久化操作. 数据模型可以是任何数据结构或对象模型, xml, 二进制流等.
当我们编写应用程序操作数据库, 对表数据进行增删改查的操作的时候就是数据持久化的操作.
Mybatis 框架简介
MyBatis 框架是一个开源的数据持久层框架. 它的内部封装了通过 JDBC 访问数据库的操作, 支持普通的 SQL 查询, 存储过程和高级映射, 几乎消除了所有的 JDBC 代码和参数的手工设置以及结果集的检索. MyBatis 作为持久层框架, 其主要思想是将程序中的大量 SQL 语句剥离出来, 配置在配置文件当中, 实现 SQL 的灵活配置. 这样做的好处是将 SQL 与程序代码分离, 可以在不修改代码的情况下, 直接在配置文件当中修改 SQL.
ORM
ORM(Object/Relational Mapping)即对象关系映射, 是一种数据持久化技术. 它在对象模型和关系型数据库直接建立起对应关系, 并且提供一种机制, 通过 JavaBean 对象去操作数据库表的数据, 如下图.
在我们实际的开发当中, 我们使用对象的技术操作数据库, 而当存储数据时, 使用的却是关系型数据库, 这样造成了很多的不便. ORM 在对象模型和关系型数据库的表之间建立了一座桥梁. 有了 ORM, 我们就不用再使用 SQL 语句操作数据库中的表, 使用 API 直接操作 JavaBean 对象就可以实现数据的增删改查等的操作. MyBatis 通过简单的 xml 或者注解的方式进行配置和原始映射, 将实体类和 SQL 语句之间建立映射关系, 是一种半自动 (之所以说是半自动, 因为我们要自己写 SQL) 的 ORM 实现.
二, MyBatis 框架的优缺点及其适用的场合
MyBatis 的优点
(1)与 JDBC 相比, 减少了 50% 以上的代码量.
(2)MyBatis 是嘴加单的持久层框架, 小巧并且简单易学.
(3)MyBatis 相当灵活, 不会对应用程序或者数据库的现有设计强加任何影响, SQL 写在 xml 文件里, 从程序代码中彻底分离, 降低耦合度, 便于统一的管理和优化, 并可重用.
(4)提供 xml 标签, 支持编写动态的 SQL, 满足不同的业务需求.
(5)提供映射标签, 支持对象与数据库的 ORM 字段关系映射.
MyBatis 的缺点
(1)SQL 语句的编写工作量较大, 对开发人员编写 SQL 的能力有一定的要求.
(2)SQL 语句依赖于数据库, 导致数据库不具有好的移植性, 不可以随便更换数据库.
MyBatis 框架的适用场合
MyBatis 专注于 SQL 自身, 是一个足够灵活的 DAO 层解决方案. 对性能的要求很高, 或者需求变化较多的项目, 例如 web 项目, 那么 MyBatis 是不二的选择.
三, 实操(简单例子)
目的: 通过 MyBatis 实现对我数据库中已经存在的表进行操作, 包括向表中插入, 修改, 查询和删除数据.
1. 准备数据库和表
- create database if not exists my_test charset utf8;# 创建数据库 my_test
- use my_test; #使用数据库
- create table student(Id int primary key auto_increment,Name varchar(20),Age int,Gender char(10)); #创建表 student
可以看到现在数据库中已经有表 student 了, 但是表示空的.
2. 下载 MyBatis 需要的 jar 文件
通过 GitHub 下载, 下载地址是 https://github.com/mybatis/mybatis-3/releases, 我选择的是 3.4.5 的版本, 注意要根据自己的 jdk 来选择, 可能高版本的不符合.
下载 MySQL 数据库驱动 jar 文件, 下载地址是 http://central.maven.org/maven2/mysql/mysql-connector-java
3. 在 Eclipse 中新建 JavaWeb 项目, 在 lib 目录下导入下载好的 jar
4. 创建 MyBatis 的核心配置文件, mybatis-config.xml, 内容如下. 其中 MySQL.properties 文件是引入的, 在该文件内配置的是数据库相关的信息, 包括数据库驱动, 链接数据库的 url, 数据库用户名和密码.
<?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>
- <!-- 引入外部 mysql 配置文件 -->
- <properties resource="mysql.properties"></properties>
- <!-- 配置 mybatis 的 log 实现为 log4j -->
- <settings>
- <setting name="logImpl" value="LOG4J"/>
- </settings>
- <!-- 为 JAVA Bean 起类别名 -->
- <typeAliases>
- <!-- 别名方式, 自动扫描, 将 JAVA 类的类名作为类的类别名 -->
- <package name="com.ydy.entiy"/>
- </typeAliases>
- <!-- 配置 mybatis 运行环境 -->
- <environments default="development">
- <environment id="development">
- <!-- type="JDBC" 代表使用 JDBC 的事务管理 -->
- <transactionManager type="JDBC" />
- <!-- mybatis 提供了 3 种数据源类型, 分别是: POOLED,UNPOOLED,JNDI -->
- <!-- POOLED 表示支持 JDBC 数据源连接池 -->
- <!-- UNPOOLED 表示不支持数据源连接池 -->
- <!-- JNDI 表示支持外部数据源连接池 -->
- <dataSource type="POOLED">
- <property name="driver" value="${Driver}" />
- <property name="url" value="${Url}" />
- <property name="username" value="${Username}" />
- <property name="password" value="${Password}" />
- </dataSource>
- </environment>
- </environments>
- <!-- 把 studentMapper 文件引入 -->
- <mappers>
- <mapper resource="com/ydy/mapper/studentMapper.xml"/>
- </mappers>
- </configuration>
接着, 配置 MySQL.properties 文件, 内容如下
- Driver=com.MySQL.jdbc.Driver
- Url=jdbc:MySQL:///my_test?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT+8&useSSL=false
- Username=root
- Password=root
5. 定义实体类, 这里的变量和数据库的字段是相对应的, 以及生成有参构造方法
- package com.ydy.entiy;
- import java.io.Serializable;
- public class Student implements Serializable{
- /**
- *
- */
- private static final long serialVersionUID = 1L;
- private int Id;
- private String Name;
- private int Age;
- private String Gender;
- public Student(String name, int age, String gender) {
- super();
- Name = name;
- Age = age;
- Gender = gender;
- }
- public Student(int id, String name, int age, String gender) {
- super();
- Id = id;
- Name = name;
- Age = age;
- Gender = gender;
- }
- public String toString() {
- return "Student [Id=" + Id + ", Name=" + Name + ", Age=" + Age + ", Gender=" + Gender + "]";
- }
- public int getId() {
- return Id;
- }
- public void setId(int id) {
- Id = id;
- }
- public String getName() {
- return Name;
- }
- public void setName(String name) {
- Name = name;
- }
- public int getAge() {
- return Age;
- }
- public void setAge(int age) {
- Age = age;
- }
- public String getGender() {
- return Gender;
- }
- public void setGender(String gender) {
- Gender = gender;
- }
- }
6. 定义接口方法 studentMapper.java
- package com.ydy.mapper;
- import java.util.List;
- import com.ydy.entiy.Student;
- public interface studentMapper {
- /**
- * 定义四个方法, 增删改查, 其中的增删改成功的话会返回 1, 查询的是所有, 故使用 List 来接收
- * @param student
- * @return
- * @throws Exception
- */
- public int insertStudent(Student student)throws Exception;;
- public int updateStudent(Student student)throws Exception;;
- public List<Student> selectAllUser()throws Exception;;
- public int deleteStudent(int id)throws Exception;;
- }
7. 创建 SQL 映射文件 studentMapper.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,namespace 的值习惯上设置成包名 + sql 映射文件名, 这样就能够保证 namespace 的值是唯一的
- 例如 namespace="com.ydy.mapper.studentMapper" 就是 com.ydy.mapper(包名)+studentMapper(studentMapper.xml 文件去除后缀)
- -->
- <mapper namespace="com.ydy.mapper.studentMapper">
- <!-- 自定义返回结果集 -->
- <resultMap id="studentMap" type="Student">
- <id property="Id" column="Id" javaType="java.lang.Integer"></id>
- <result property="Name" column="Name" javaType="java.lang.String"></result>
- <result property="Age" column="Age" javaType="java.lang.Integer"></result>
- <result property="Gender" column="Gender" javaType="java.lang.String"></result>
- </resultMap>
- <!-- 在各种标签中的 id 属性必须和接口中的方法名相同 , id 属性值必须是唯一的, 不能够重复使用. parameterType 属性指明查询时使用的参数类型, resultType 属性指明查询返回的结果集类型 -->
- <!--#{}中的内容, 为占位符, 当参数为某个 JavaBean 时, 表示放置该 Bean 对象的属性值 -->
- <!-- 向 student 表中插入记录 -->
- <insert id="insertStudent">
- insert into student (Name,Age,Gender) values (#{Name},#{Age},#{Gender})
- </insert>
- <!-- 更新 student 表中的记录 -->
- <update id="updateStudent" parameterType="int">
- update student set Name=#{Name},Age=#{Age},Gender=#{Gender} where Id=#{Id}
- </update>
- <!-- 查询 student 表中的所有记录 -->
- <select id="selectAllStudent" resultMap="studentMap">
- select * from student
- </select>
- <!-- 根据 id 删除 student 表中的记录 -->
- <delete id="deleteStudent" parameterType="int">
- delete from student where Id=#{Id}
- </delete>
- </mapper>
接着, 要在 mybatis.config.xml 里面把 SQL 映射文件引入
<?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>
- <!-- 引入外部 mysql 配置文件 -->
- <properties resource="mysql.properties"></properties>
- <!-- 配置 mybatis 的 log 实现为 log4j -->
- <settings>
- <setting name="logImpl" value="LOG4J"/>
- </settings>
- <!-- 为 JAVA Bean 起类别名 -->
- <typeAliases>
- <!-- 别名方式, 自动扫描, 将 JAVA 类的类名作为类的类别名 -->
- <package name="com.ydy.entiy"/>
- </typeAliases>
- <!-- 配置 mybatis 运行环境 -->
- <environments default="development">
- <environment id="development">
- <!-- type="JDBC" 代表使用 JDBC 的事务管理 -->
- <transactionManager type="JDBC" />
- <!-- mybatis 提供了 3 种数据源类型, 分别是: POOLED,UNPOOLED,JNDI -->
- <!-- POOLED 表示支持 JDBC 数据源连接池 -->
- <!-- UNPOOLED 表示不支持数据源连接池 -->
- <!-- JNDI 表示支持外部数据源连接池 -->
- <dataSource type="POOLED">
- <property name="driver" value="${Driver}" />
- <property name="url" value="${Url}" />
- <property name="username" value="${Username}" />
- <property name="password" value="${Password}" />
- </dataSource>
- </environment>
- </environments>
- <!-- 把 studentMapper 文件引入 -->
- <mappers>
- <mapper resource="com/ydy/mapper/studentMapper.xml"/>
- </mappers>
- </configuration>
8. 新建包 tools, 在里面新建类 myBatisTool, 使用 mybatis 提供的对象读取全局配置文件 mybatis.config.xml 文件
- package tools;
- import java.io.Reader;
- 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 com.sun.corba.se.spi.orbutil.fsm.State;
- public class myBatisTool {
- public static SqlSessionFactory sqlSessionFactory;
- static{
- // 使用 MyBatis 提供的 Resources 类加载 mybatis 的配置文件
- try{
- Reader config=Resources.getResourceAsReader("mybatis.config.xml");
- // 构造 SqlSession 的工厂
- sqlSessionFactory = new SqlSessionFactoryBuilder().build(config);
- }catch (Exception e){
- e.printStackTrace();
- }
- }
- //// 创建能执行映射文件中 sql 的 sqlSession 对象
- public static SqlSession getSession(){
- return sqlSessionFactory.openSession();
- }
- }
9. 新建包 service, 编写测试类 studentService
- package service;
- import org.apache.ibatis.session.SqlSession;
- import com.ydy.entiy.Student;
- import com.ydy.mapper.studentMapper;
- import tools.myBatisTool;
- public class studentService {
- public static void main(String[] args) {
- insertStudent();
- //updateStudent();
- //selectAllStudent();
- //deleteStudent();
- }
- /**
- * 新增学生记录
- */
- private static void insertStudent() {
- // 利用 SqlSession 对象来执行 SQL 语句
- SqlSession session=myBatisTool.getSession();
- studentMapper mapper=session.getMapper(studentMapper.class);
- Student student=new Student(1,"张三",21,"男");
- try{
- mapper.insertStudent(student);
- System.out.println(student.toString());
- session.commit();
- }catch (Exception e){
- e.printStackTrace();
- }finally {
- session.close();
- }
- }
- /**
- * 查询学生记录
- */
- private static void selectAllStudent() {
- // TODO Auto-generated method stub
- }
- /**
- * 更新学生记录
- */
- private static void updateStudent() {
- // TODO Auto-generated method stub
- }
- /**
- * 删除学生记录
- */
- private static void deleteStudent() {
- // TODO Auto-generated method stub
- }
- }
控制台的结果
数据库的结果
上述的是执行新增的结果, 其他的功能也是类似. 这里就不多说了. 记录一下我遇到的问题吧.
(1)在 mybatis-config.xml 文件当中标签的顺序是有要求的, 不能乱写.
(2)在 MySQL.properties 文件当中记得加上编码方式, 不然插入到数据库会乱码.
实践是检验真理的唯一标准, 本人是一个小菜鸟, 欢迎各位大神指出不足之处, 万分感激.
来源: https://www.cnblogs.com/YJzhiqianni/p/10671902.html