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方法的时候就可以实现对模型类对应数据表数据的删除. 二.自关联 ...
随机推荐
- 创建 numpy.array
# 导包 import numpy as np numpy.array nparr = np.array([i for i in range(10)]) nparr # array([0, 1, 2, ...
- NOIP模拟 1
NOIP模拟1,到现在时间已经比较长了.. 那天是6.14,今天7.18了 //然鹅我看着最前边缺失的模拟1,还是终于忍不住把它补上,为了保持顺序2345重新发布了一遍.. # 用 户 名 ...
- st表复习笔记
st表,一种高效的区间最值查询(RMQ)算法.本质其实是一个动态规划. 其实吧,对于看过线性dp的人来说应该不难理解,只是处理有些麻烦.但是本土狗因为-1的问题居然改了许久... 用两个2^i的区间把 ...
- GC四大算法
引言: 前面的文章提到,Heap包括了PSYoungGen.ParOldGen.Metaspace.JVM 在进行GC时,并非每次都对上面三个内存区域一起回收的,大部分时候回收的都是新生代.由于新生代 ...
- IntelliJ IDEA 中设置左菜单字体, 编辑器字体和控制台的字体
IntelliJ IDEA 中设置左菜单字体大小 File-Settings,然后选择appearance,下图右侧红色边框中的内容即设置菜单的字体和大小 IntelliJ IDEA 中设置当前编 ...
- 学习下ElasticSearch
ElasticSearch基础概念 Elasticsearch的Head插件安装 Elasticsearch在Centos 7上的安装常见的问题 使用场景:比如分库的情况下,你想统计所有数据的报表,就 ...
- 6. SOFAJRaft源码分析— 透过RheaKV看线性一致性读
开篇 其实这篇文章我本来想在讲完选举的时候就开始讲线性一致性读的,但是感觉直接讲没头没尾的看起来比比较困难,所以就有了RheaKV的系列,这是RheaKV,终于可以讲一下SOFAJRaft的线性一致性 ...
- Laravel生命周期与原理
一旦用户(浏览器)发送了一个HTTP请求,我们的apache或者nginx一般都转到index.php,因此,之后的一系列步骤都是从index.php开始的,我们先来看一看这个文件代码. <?p ...
- [LC]141题 Linked List Cycle (环形链表)(链表)
①中文题目 给定一个链表,判断链表中是否有环. 为了表示给定链表中的环,我们使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始). 如果 pos 是 -1,则在该链表中没有环. 示例 ...
- 一个ip, 两个域名, 两个ssl, 访问多个不同的项目
在前面一篇中说过, 入了好几个坑. 后来使用了nginx+tomcat配置的方式. 终于成功了. 因为头一次使用nginx, 不知道具体怎么操作, 于是我在操作的时候, 按照以下几个步骤执行的: 导航 ...