MyBatis的配置与使用(增,删,改,查)
---恢复内容开始---
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&useSSL=false&serverTimezone=UTC&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的配置与使用(增,删,改,查)的更多相关文章
- 好用的SQL TVP~~独家赠送[增-删-改-查]的例子
以前总是追求新东西,发现基础才是最重要的,今年主要的目标是精通SQL查询和SQL性能优化. 本系列主要是针对T-SQL的总结. [T-SQL基础]01.单表查询-几道sql查询题 [T-SQL基础] ...
- iOS FMDB的使用(增,删,改,查,sqlite存取图片)
iOS FMDB的使用(增,删,改,查,sqlite存取图片) 在上一篇博客我对sqlite的基本使用进行了详细介绍... 但是在实际开发中原生使用的频率是很少的... 这篇博客我将会较全面的介绍FM ...
- iOS sqlite3 的基本使用(增 删 改 查)
iOS sqlite3 的基本使用(增 删 改 查) 这篇博客不会讲述太多sql语言,目的重在实现sqlite3的一些基本操作. 例:增 删 改 查 如果想了解更多的sql语言可以利用强大的互联网. ...
- django ajax增 删 改 查
具于django ajax实现增 删 改 查功能 代码示例: 代码: urls.py from django.conf.urls import url from django.contrib impo ...
- ADO.NET 增 删 改 查
ADO.NET:(数据访问技术)就是将C#和MSSQL连接起来的一个纽带 可以通过ADO.NET将内存中的临时数据写入到数据库中 也可以将数据库中的数据提取到内存中供程序调用 ADO.NET所有数据访 ...
- MVC EF 增 删 改 查
using System;using System.Collections.Generic;using System.Linq;using System.Web;//using System.Data ...
- python基础中的四大天王-增-删-改-查
列表-list-[] 输入内存储存容器 发生改变通常直接变化,让我们看看下面列子 增---默认在最后添加 #append()--括号中可以是数字,可以是字符串,可以是元祖,可以是集合,可以是字典 #l ...
- django单表操作 增 删 改 查
一.实现:增.删.改.查 1.获取所有数据显示在页面上 model.Classes.object.all(),拿到数据后,渲染给前端;前端通过for循环的方式,取出数据. 目的:通过classes(班 ...
- Django(十)模型:django模型类对数据库的:增/删/改/查、自关联、管理器、元选项(指定表名)
一.插入.更新和删除 调用一个模型类对象的save方法的时候就可以实现对模型类对应数据表的插入和更新. 调用一个模型类对象的delete方法的时候就可以实现对模型类对应数据表数据的删除. 二.自关联 ...
随机推荐
- Kubernetes5-集群上搭建基于redis和docker的留言薄
一.简介 1.环境依旧是kubernetes之前文章的架构 2.需要docker的镜像 1)php-forntend web 前端镜像 docker.io-kubeguide-guestbook-ph ...
- Kubernetes(k8s)集群安装
一:简介 二:基础环境安装 1.系统环境 os Role ip Memory Centos 7 master01 192.168.25.30 4G Centos 7 node01 192.168.25 ...
- Servlet相关学习
Servlet入门解析 概念 运行在服务器端的小程序 servlet就是一个接口,定义了Java类被浏览器访问到(tomcat识别)的规则 实现servlet接口.复写方法 快速入门 创建web项目 ...
- 最近的项目系列1——core整合SPA
1.前言 当前,前后端分离大行其道,我本人之前不少项目也是纯前后端分离,但总有些场景,春前后端分离整起来比较痛苦,比如我手头这个公众号项目吧,它涉及到第三方鉴权,第三方凭证,以及微信凭证这些,都不适合 ...
- MyBatis动态语句if与choose的区别
if(通过“title”和“author”两个参数进行可选搜索): <select id="findActiveBlogLike" resultType="Blog ...
- 暑假CV-QKD的相关论文单词集(第一弹)
CV-QKD 连续变量-量子秘钥分发 Quadrature 正交 Photon 光子 Coherent 连续的,连贯的 Reconciliation 调解 Cryptograph ...
- 详解JavaScript错误捕获和上报流程
怎么捕获错误并且处理,是一门语言必备的知识.在JavaScript中也是如此. 那怎么捕获错误呢?初看好像很简单,try-catch就可以了嘛!但是有的时候我们发现情况却繁多复杂. Q1: 同步可以t ...
- nyoj 76-超级台阶 (递推)
76-超级台阶 内存限制:64MB 时间限制:1000ms 特判: No 通过数:8 提交数:12 难度:3 题目描述: 有一楼梯共m级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第m级,共 ...
- 【SSM Spring 线程池 OJ】 使用Spring线程池ThreadPoolTaskExecutor
最近做的Online Judge项目,在本地判题的实现过程中,遇到了一些问题,包括多线程,http通信等等.现在完整记录如下: OJ有一个业务是: 用户在前端敲好代码,按下提交按钮发送一个判题请求给后 ...
- 力扣(LeetCode)找不同 个人题解
给定两个字符串 s 和 t,它们只包含小写字母. 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母. 请找出在 t 中被添加的字母. 示例: 输入: s = "abcd&quo ...