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方法的时候就可以实现对模型类对应数据表数据的删除. 二.自关联 ...
随机推荐
- [考试反思]0916csp-s模拟测试44:可笑
出现了有史以来第一个3首杀AK啊...然而跟我没有丝毫关系 (曾经还是有一次考试差点就有那么一点关系的...) 然而反正我考得很水就是了.不是很垃圾,而是很水. 这套题是真的水... T1不会证复杂度 ...
- [考试反思]0829NOIP模拟测试33:仰望
,160,160,160... 凑和吧,但是莫名开心. 然而这次没有什么想讲的. T1,等比数列求和,XX题,水极,20分钟找规律,找错,快速幂又打错,没检查,10分. T2,想复杂了,想了很久效率很 ...
- P4409 [ZJOI2006]皇帝的烦恼(20190922B)(乱搞)
考场历程十分艰辛啊... 第一题没切掉,还浪费了很长时间,就是一个裸的最小生成树,但是因为可恶的distance为关键字莫名其妙查错了10min.... 本题先乱搞了一下,过了样例 然后看第三题,可写 ...
- NLP-BM25算法理解
前两天老师给我们讲解了BM25算法,其中包括由来解释,以及算法推导,这里我再将其整理,这里我不讲解之前的BIM模型,大家有兴趣可以自行了解.Okapi BM25:一个非二值的模型bm25 是一种用来评 ...
- Java自学基础、进阶、项目实战网站推荐
推荐一个自学的好平台,有Java基础,前端,后端,基础的内容都有讲解,还有框架的讲解和实战项目,特别适合自学 JAVA 自学网站 JAVA 练习题 Spring 教程 Mybatis 教程 Sprin ...
- SqlServer2005 查询 第一讲 计算列
数据库查询[最重要且在数据库中难度最大] 声明一下我这里用的数据库样例是郝斌老师的(scott库) 我尽最大努力把复杂的问题简单化,方便理解,希望我写的东西能够帮助到你们 有些复杂的东西我我用自己的方 ...
- hdu 1325 Is It A Tree? (树、node = edge + 1、入度 <= 1、空树)
Is It A Tree?Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- shuf
shi一个排序器,一般用来试用随机输入产生随机乱序的输出,他可以作用于输入文件或者数值范围,也可以对数组进行操作. -i -nN -e 1.掷骰子shuf -i 1-6 -n1 shuf -i 1-6 ...
- 开始逆向objc基础准备(二)我的平台是simulator-x86_64
建项目运行中断调试,lldb中显示寄存器看到有rax-r15, stm0-stm7, xmm0-xmm15, ymm0-ymm15,即为x64体系支持sse4. 再在lldb中查看寄存器别名得到以下对 ...
- objc反汇编分析,手工逆向libsystem_blocks.dylib
上一篇<block函数块为何物?>介绍了在函数中定义的block函数块的反汇编实现,我在文中再三指出__block变量和block函数块自始还都是stack-based的,还不完全适合在离 ...