---恢复内容开始---

Mybatis入门介绍

一、MyBatis介绍

  什么是MyBtis?

    MyBatis 是一个简化和实现了 Java 数据持久化层(persistence layer)的开源框架,它抽象了大量的 JDBC 冗余代 码,并提供了一个简单易用的 API 和数据库交互。

    MyBatis 的前身是 iBATIS,iBATIS 于 2002 年由 Clinton Begin 创建。MyBatis 3 是 iBATIS 的全新设计,支持 注解和 Mapper。

    MyBatis 流行的主要原因在于它的简单性和易使用性。在 Java 应用程序中,数据持久化层涉及到的工作有:将从数据库查询到的数据生成所需要的 Java 对象;将 Java 对象中的数据通过 SQL 持久化到数据库中。

    MyBatis 通过抽象底层的 JDBC 代码,自动化 SQL 结果集产生 Java 对象、Java 对象的数据持久化数据库中的过程 使得对 SQL 的使用变得容易。 如

  为什么选择MyBtis?

  • 最重要的就是消除了很多JDBC是冗余。
  • 学习成本很低
  • 他能很好的与传统数据库协同工作。
  • 支持SQL语句。
  • 他提供了与spring框架的集成。
  • 它引入的性能较好。        

  

二、JDAC

  Java 通过 Java 数据库连接(Java DataBase Connectivity,JDBC)API 来操作关系型数据库,但是 JDBC 是一个 非常底层的 API,我们需要书写大量的代码来完成对数据库的操作。

   我先从最传统是JDBC代码写起再来对比引入MyBatis后两者的比较就会显而易见了。

   第一步:创建数据库

   

   第二步:Student实体类

 package com.nf;

 import java.sql.Date;

 public class Student {

     private Integer stuid;
private String name;
private String email;
private Date dob; public Integer getStuid() {
return stuid;
} public void setStuid(Integer stuid) {
this.stuid = stuid;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getEmail() {
return email;
} public void setEmail(String email) {
this.email = email;
} public Date getDob() {
return dob;
} public void setDob(Date dob) {
this.dob = dob;
} @Override
public String toString() {
return "Student{" +
"stuid=" + stuid +
", name='" + name + '\'' +
", email='" + email + '\'' +
", dob=" + dob +
'}';
}
}

  第三步:创建StudentMapper接口

package com.nf;

import java.sql.SQLException;

public interface StudentDao {
//方法
public Student findStudentByid(int stuid) ;
}

  第四步:创建StudentMapperImpl实现类

package com.nf;

import java.sql.*;

public class StudentDaoImpl implements StudentDao {

    @Override
public Student findStudentByid(int stuid) throws SQLException {
Student student = null;
Connection connection; //获取连接
String jdbcurl = "jdbc:mysql://localhost:3306/student2?characterEncoding=utf8&useSSL=false&serverTimezone=UTC&rewriteBatchedStatements=true";
connection = DriverManager.getConnection(jdbcurl,"root","123456"); try {
//加载驱动
Class.forName("com.mysql.cj.jdbc.Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
//获取PreparedStatement
PreparedStatement pst = connection.prepareStatement("select * from students where stuid=?");
pst.setInt(1,stuid);
//查询获取结果
ResultSet rs = pst.executeQuery();
// 处理结果集
if(rs.next()){
student = new Student();
student.setStuid(rs.getInt("stuid"));
student.setName(rs.getString("name"));
student.setEmail(rs.getString("email"));
student.setDob(rs.getDate("dob"));
}
rs.close();
pst.close();
connection.close();
return student;
}

  获取数据:

 JDBC缺点分析:

上述的每个方法中有大量的重复代码:创建一个连接,创建一个 Statement 对象,设置输入参数,关闭资源(如 connection,statement,resultSet)。

三、MyBatis

  我们现在使用MyBatis现实上面的代码:

  3.1 添加依赖(pom.xml)

    <dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>

  3.2 全局配置文件(config.xml )

 <?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>
<!-- 环境,可以配置多个,default:指定采用哪个环境 -->
<environments default="mycom">
<!-- id:唯一标识 -->
<environment id="mycom">
<!-- 事务管理器,JDBC类型的事务管理器 -->
<transactionManager type="JDBC"/>
<!-- 数据源,池类型的数据源 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/student2?characterEncoding=utf8&amp;useSSL=false&amp;serverTimezone=UTC&amp;rewriteBatchedStatements=true"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="StudentMapper.xml"></mapper>
</mappers>
</configuration>

 3.3配置文件 StudentMapper.xml ( StudentMapper.xml  )

  第一步: 在 SQL Mapper 映射配置文件中配置 SQL 语句,假定为 StudentMapper.xml

  查询操作:

//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:命名空间,随便写,一般保证命名空间唯一 -->
<mapper namespace="com.nf.StudentDao" >
<!--
column为java实体类的属性名   property为数据库属性名
-->
<resultMap id="myStudent" type="com.nf.Student">
<id column="stuid" property="stuid"></id>
<result column="name" property="name"></result>
<result column="email" property="email"></result>
<result column="dob" property="dob"></result>
</resultMap>
<!-- statement,内容:sql语句。id:要与接口方法名相同,在同一个命名空间下保持唯一 resultType:parameter:需要返回的类型;sql语句查询结果集的封装类型,tb_user即为数据库中的表 -->
//查询
      
<select id="findStudentByid" parameterType="int" resultMap="myStudent">
SELECT STUID AS stuId, NAME, EMAIL, DOB
FROM students WHERE stuid=#{Id}
</select>
</mapper>

3.4 测试类

 public class Test2 {
public static void main(String[] args) throws SQLException {
SqlSessionFactory factory = null;
try {
//指定全局配置的文件xml再读取配置文件
//(这里可以比喻成一个建筑图 工程师要建房子首先要先看图纸,我们现在把config.xml看做是一张图纸)
InputStream inputStream= Resources.getResourceAsStream("config.xml");
// 构建sqlSessionFactory(创建一个工厂)
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
factory = builder.build(inputStream);
System.out.println("1.配置的config.xml"+inputStream);
System.out.println("2.创建出一个工厂"+factory);
} catch (IOException e) {
e.printStackTrace();
}
// 获取sqlSession(打开工厂)
SqlSession sqlSession = factory.openSession();
System.out.println("3.session"+sqlSession);
//StudentMapper层(将东西放进工厂生产)
StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
System.out.println("4.获得实现类的实例:"+studentDao);
Student student = studentDao.findStudentByid(1);
System.out.println(student); sqlSession.close();
}
}

  删除操作:

  第一步:接口写入一个方法(findStudenrdelete()):

package com.nf;

import java.sql.SQLException;
import java.util.List; public interface StudentDao {
// 查询
public Student findStudentByid(int stuid) throws SQLException;
// 删除
public boolean findStudentdelete(int stuid);

  第二步: 配置文件 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="com.nf.StudentDao" > <resultMap id="myStudent" type="com.nf.Student">
<id column="stuid" property="stuid"></id>
<result column="name" property="name"></result>
<result column="email" property="email"></result>
<result column="dob" property="dob"></result>
</resultMap>   //查询
<select id="findStudentByid" parameterType="int" resultMap="myStudent">
SELECT STUID AS stuId, NAME, EMAIL, DOB
FROM students WHERE stuid=#{Id}
</select>   //删除 id:与接口的方法名要一致 Student的实体类
<delete id="findStudentdelete" parameterType="com.nf.Student">
  DELETE FROM students WHERE stuid=#{Id}
</delete>
<mapper>

   第三步:测试类(Testdelete.java)

 package com.nf;

 import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.IOException;
import java.io.InputStream; //删除
public class Test4 {
public static void main(String[] args) {
SqlSessionFactory factory = null;
try {
InputStream inputStream = Resources.getResourceAsStream("config.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
factory = builder.build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
SqlSession sqlSession = factory.openSession();
StudentDao studentDao = sqlSession.getMapper(StudentDao.class); boolean ok = studentDao.findStudentdelete(1);//点接口方法名
if(ok){
System.out.println("删除成功");
}else{
System.out.println("删除失败");
}
sqlSession.commit();
}
}

  添加操作:

  第一步:接口写入一个方法(findStudenrdelete()):

package com.nf;

import java.sql.SQLException;
import java.util.List; public interface StudentDao {
// 查询
public Student findStudentByid(int stuid) throws SQLException;
// 删除
public boolean findStudentdelete(int stuid);
// 添加
public boolean findStudentInsert(Student student); }

   第二步:第二步: 配置文件 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="com.nf.StudentDao" > <resultMap id="myStudent" type="com.nf.Student">
<id column="stuid" property="stuid"></id>
<result column="name" property="name"></result>
<result column="email" property="email"></result>
<result column="dob" property="dob"></result>
</resultMap> <select id="findStudentByid" parameterType="int" resultMap="myStudent">
SELECT STUID AS stuId, NAME, EMAIL, DOB
FROM students WHERE stuid=#{Id}
</select> <delete id="findStudentdelete" parameterType="com.nf.Student">
delete from students where stuid=#{Id}
</delete>
//添加
<insert id="findStudentInsert parameterType="com.nf.Student" ">
INSERT INTO students(name,email,dob) value(#{name},#{email},#{dob})
</insert>
<mapper>

   第三步:测试类(TestInsert.java)

 package com.nf;

 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.IOException;
import java.io.InputStream;
import java.sql.Date;
import java.sql.SQLException;
import java.text.ParseException;
import java.text.SimpleDateFormat; //添加
public class Test3 {
public static void main(String[] args) throws SQLException {
SqlSessionFactory factory = null;
try {
InputStream inputStream = Resources.getResourceAsStream("config.xml");
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
factory = builder.build(inputStream);
System.out.println("配置xml"+inputStream);
System.out.println("创建出一个工厂"+factory);
} catch (IOException e) {
e.printStackTrace();
}
SqlSession sqlSession = factory.openSession();
StudentDao studentDao = sqlSession.getMapper(StudentDao.class);
Student student = new Student();
//student.setStuid(4);
student.setName("小华");
student.setEmail("1084522@qq.com");
// 日期转类型
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd");
java.util.Date date = null;
try {
date= simpleDateFormat.parse("2055-6-2");
} catch (ParseException e) {
e.printStackTrace();
}
//new java.sql.Date(date.getTime());
student.setDob( new java.sql.Date(date.getTime()));
//不严谨
//student.setDob(Date.valueOf("2055-6-2"));
boolean ok =studentDao.findStudentInsert(student);
if(ok){
System.out.println("添加成功");
}else{
System.out.println("添加失败");
}
studentDao.findStudentInsert(student); sqlSession.commit();
System.out.println(student.getStuid());
sqlSession.close();
}
}

MyBatis的配置与使用(增,删,改,查)的更多相关文章

  1. 好用的SQL TVP~~独家赠送[增-删-改-查]的例子

    以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化.  本系列主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础] ...

  2. iOS FMDB的使用(增,删,改,查,sqlite存取图片)

    iOS FMDB的使用(增,删,改,查,sqlite存取图片) 在上一篇博客我对sqlite的基本使用进行了详细介绍... 但是在实际开发中原生使用的频率是很少的... 这篇博客我将会较全面的介绍FM ...

  3. iOS sqlite3 的基本使用(增 删 改 查)

    iOS sqlite3 的基本使用(增 删 改 查) 这篇博客不会讲述太多sql语言,目的重在实现sqlite3的一些基本操作. 例:增 删 改 查 如果想了解更多的sql语言可以利用强大的互联网. ...

  4. django ajax增 删 改 查

    具于django ajax实现增 删 改 查功能 代码示例: 代码: urls.py from django.conf.urls import url from django.contrib impo ...

  5. ADO.NET 增 删 改 查

    ADO.NET:(数据访问技术)就是将C#和MSSQL连接起来的一个纽带 可以通过ADO.NET将内存中的临时数据写入到数据库中 也可以将数据库中的数据提取到内存中供程序调用 ADO.NET所有数据访 ...

  6. MVC EF 增 删 改 查

    using System;using System.Collections.Generic;using System.Linq;using System.Web;//using System.Data ...

  7. python基础中的四大天王-增-删-改-查

    列表-list-[] 输入内存储存容器 发生改变通常直接变化,让我们看看下面列子 增---默认在最后添加 #append()--括号中可以是数字,可以是字符串,可以是元祖,可以是集合,可以是字典 #l ...

  8. django单表操作 增 删 改 查

    一.实现:增.删.改.查 1.获取所有数据显示在页面上 model.Classes.object.all(),拿到数据后,渲染给前端;前端通过for循环的方式,取出数据. 目的:通过classes(班 ...

  9. Django(十)模型:django模型类对数据库的:增/删/改/查、自关联、管理器、元选项(指定表名)

    一.插入.更新和删除 调用一个模型类对象的save方法的时候就可以实现对模型类对应数据表的插入和更新. 调用一个模型类对象的delete方法的时候就可以实现对模型类对应数据表数据的删除. 二.自关联 ...

随机推荐

  1. [考试反思]0922csp-s模拟测试50:谜朦

    这辈子第5个rank1,是在长期状态低迷再度偶遇傻逼出题人然后总算在下午而不是晚上考了一场试 然后莫名其妙选对了头铁的题把其它暴力打满之后发现sdfz没有参加之后竞争减弱的综合结果. 说是在的其实这套 ...

  2. 【建站03】WordPress网站如何去除RSS功能

    哈喽,大家好,我是帝哥,最近有小伙伴问我,如何去掉WordPress上的RSS功能,这个功能呢,说实话,我们很少会用到. 但是如果有点强迫症的话看着会很不舒服,所以,今天和大家分享一下如何去掉Word ...

  3. 『题解』Codeforces1142A The Beatles

    更好的阅读体验 Portal Portal1: Codeforces Portal2: Luogu Description Recently a Golden Circle of Beetlovers ...

  4. 从代码的视角深入浅出理解DevOps

    对于DevOps的理解大家众说纷纭,就连维基百科(Wikipedia)都没有给出一个统一的定义.一般的解释都是从字面上来理解,就是把开发(Development)和运维(Operations)整合到一 ...

  5. 装上linux后的准备工作

    A.修改对应网卡的IP地址的配置文件  1 2 3 4 5 6 7 8 # vi /etc/sysconfig/network-scripts/ifcfg-eth0   IPV6INIT=no #关闭 ...

  6. java架构之路(MQ专题)kafka集群配置和简单使用

    前面我们说了RabbitMQ和RocketMQ的安装和简单的使用,这次我们说一下Kafka的安装配置,后面我会用几个真实案例来说一下MQ的真实使用场景.天冷了,不愿意伸手,最近没怎么写博客了,还请见谅 ...

  7. 解决vue低版本安卓手机兼容性问题

    低版本的安卓手机可能会白屏,是由新特性不支持引起的 解决代码es6新特性兼容问题 1,npm 安装 npm install babel-polyfill npm install es6-promise ...

  8. 给大家整理了几个开源免费的 Spring Boot + Vue 学习资料

    最近抽空在整理前面的文章案例啥的,顺便把手上的几个 Spring Boot + Vue 的学习资料推荐给各位小伙伴.这些案例有知识点的讲解,也有项目实战,正在做这一块的小伙伴们可以收藏下. 案例学习 ...

  9. 领扣(LeetCode)两句话中的不常见单词 个人题解

    给定两个句子 A 和 B . (句子是一串由空格分隔的单词.每个单词仅由小写字母组成.) 如果一个单词在其中一个句子中只出现一次,在另一个句子中却没有出现,那么这个单词就是不常见的. 返回所有不常用单 ...

  10. HashSet源码学习,基于HashMap实现

    HashSet源码学习 一).Set集合的主要使用类 1). HashSet 基于对HashMap的封装 2). LinkedHashSet 基于对LinkedHashSet的封装 3). TreeS ...