首先明白Mybatis是干什么的,之前使用jdbc操作数据库时候要写很多语句,获取光标,连接,获取具体对象进行相应操作,代码过于繁琐,所以现在有了Mybatis,它将这个操作整合在了一起,你不需要关心具体的和数据库的之间交互,你现在只需要关心你的业务逻辑,书写好你的sql语句,并进行相应的配置就可以了,这样大大提高了开发效率,简化了不必要的代码。ps:说实话我觉得jdbc操作真的繁琐,要注意的太多了,这种方式操作数据库方便多了,毕竟我们重要的是业务逻辑代码。

这篇博客记录了基本的配置,statement方式,动态代理方式的增删改查

Mybatis基本配置

1.首先我们先从官网将压缩包下载下来,然后将目录下的  .jar文件引入项目文件之中,在Intellij之下,引入jar文件,具体怎么引入问度娘,注意这里暂时只需要引入一个.jar 文件,lib目录下的jar文件相当于是扩展功能,你需要的时候再引入。然后用同样的方式将jdbc引入一下,因为Mybatis是依赖于jdbc的,是jdbc的一种封装可以理解为。

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>
<environments default="development"> <!--默认的配置环境,发行版本,debug版本-->
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED"> <!--创建连接池,效率高,一次打开,多次使用-->
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/mybatis?useUnicode=true&amp;characterEncoding=utf-8&amp;serverTimezone=GMT"/>
<property name="username" value="xxx"/>
<property name="password" value="xxxx"/>
</dataSource>
</environment>
</environments>
<mappers>
<!-- 加载映射文件,有多个,直接写相对于src文件的路径-->
<mapper resource="entity/PersonMapping.xml"/>
</mappers>
</configuration>

看它这个xml文件,还是比较容易理解的,注意两点,

1.我这里使用的是mysql 8.0.2版本,配置和mysql低版本不太一样,url后面的参数是以  &amp; 来分隔的。虽然也不知道为撒这样,反正人家这么规定的。

2.最下面<mappers>加载映射文件的时候,一个<mapper resource-"xxx"/>加载一个,resource属性就是具体的映射文件相对于src文件的路径。

接下来我们创建Person类,和数据库的一张表形成映射:如下

package entity;
public class Person {
   private int id;
private String name;
private String loves;
public Person(){ }
  
public Person(String name, String loves) {
this.name = name;
this.loves = loves;
}
  public int getId(){return id;}
  public void setId(int id){this.id=id;}
public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getLoves() {
return loves;
} public void setLoves(String loves) {
this.loves = loves;
}
public String toString(){
return "姓名:"+this.name+"\n爱好:"+this.loves;
}
}

表person如下:

 create table person(
`id` int() not null auto_increment primary key,
`name` varchar() not null,
loves varchar() not null
)engine=innodb;

然后看映射文件 PersonMapping.xml的配置,这个映射文件和Person类时对应的,配置的是关于表person和类Person的相关操作

<?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="entity.PersonMapping">       <!--该mapping文件的唯一映射-->
<select id="selectPersonById" resultType="entity.Person" parameterType="string">
select * from person where `name` = #{name}
</select>
<insert id="insertOnePerson" parameterType="entity.Person">
insert into person values(#{name},#{loves})
</insert>
<delete id="deleteOnePerson" parameterType="int" >
delete from person where id=#{id}
</delete>
</mapper>

可以看到首先namespace是该文件一个唯一标识,就是该文件的路径(相对于src),接下来有各种标签,<select>  <delete>  <insert> ..这其实就对应了数据库的增删改查,具体对哪一张表,什么操作,看你书写的sql语句,因为我们看到标签体的内容就是sql语句,举个例子:

    <insert id="insertOnePerson" parameterType="entity.Person" resultType="">
insert into person values(#{name},#{loves})
</insert>

这个标签是向数据库插入数据,id代表的是该sql语句的唯一标识,parameterType  指的是传入的参数类型,这里是entity.Person,Person使我们构造的一个类,resultType是返回值的类型,

标签体是我们书写的sql语句,这里是动态传值的方式,输出格式是:#{变量名},对于变量名我们注意:如果传入的是一个string,int等类型的数据,那这个变量名可以是任何字符,但是如果传入的是一个对象的话,那么变量名就必须和该对象的属性一一对应起来,比如  name  就指 person对象的name属性,loves指person的loves属性。另外注意Mybatis传参只能传一个值,但是有时候要传多个参数,可以使用数组的方式传值。

同样的,增删改查操作都是在相应的标签下书写sql语句来完成的。

statement的增删改查

到这里我们的基本配置demo就算是完成了,接下来写一个具体的操作例子,首先分为三步:

1.加载配置信息,2.获取SqlSession对象进行操作  3.执行指定的sql语句

    public static void main(String[] args) throws IOException {
//加载配置信息
Reader reader = Resources.getResourceAsReader("config.xml");
//connection
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
SqlSession sqlSession = sessionFactory.openSession();
//执行指定的sql语句
String statement = "entity.PersonMapping.selectPersonById"; //查询数据
List<Person> persons = new ArrayList<Person>(sqlSession.selectList(statement,"温鸿飞"));
for (Person person:persons) {
System.out.println(person.toString());
}
statement = "entity.PersonMapping.deleteOnePerson"; //删除数据
sqlSession.delete(statement,);
System.out.println("------");
statement = "entity.PersonMapping.selectPersonById"; //查询数据
persons = new ArrayList<Person>(sqlSession.selectList(statement,"温鸿飞"));
for (Person person:persons) {
System.out.println(person.toString());
}
sqlSession.commit();
sqlSession.close();
}

配置信息加载是通过Reader reader = Resources.getResourceAsReader("config.xml"); 完成,config就是我们刚才创建的配置文件,告诉编译器都有哪些mapper,

获取SqlSession对象,这个不说了,官网就是这么写的,规定

然后到了具体的操作了,看到我们先书写了一个 statement,这个statement对应了刚才的PersonMapping.xml文件当中的一个标签,格式是:namespace.id,比如

entity.PersonMapping.deleteOnePerson指的就是deleteOnePerson的标签,之后用SqlSession来操作,调用增删改查里面的一个方式,传入statement和相应的参数就可以了,比如删除
SqlSession.delete(statement,param); 之后有返回值的接受一下, 没有就算了。sqlSession.commit()提交一下事务,当然这里还有回滚等暂时不说了
上面的代码执行结果如下,可以看到正确的查询到了数据并删除了id为1 的数据
"C:\Program Files\Java\jdk-11.0.1\bin\java.exe" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.1.3\lib\idea_rt.jar=63824:C:\Program Files\JetBrains\IntelliJ IDEA 2019.1.3\bin" -Dfile.encoding=UTF- -classpath C:\learn\java\mybatis\out\production\mybatis;C:\迅雷下载\mybatis-3.5.\mybatis-3.5.\mybatis-3.5..jar;C:\迅雷下载\mysql-connector-java-8.0..jar entity.test
姓名:温鸿飞
爱好:哈啊哈哈
姓名:温鸿飞
爱好:
姓名:温鸿飞
爱好:
------
姓名:温鸿飞
爱好:
姓名:温鸿飞
爱好:

到这里我们的第一个statement小demo就算成功完成了,但使用statement的话,每次都要书写statement,很繁琐,所以我们有了动态的进行增删改查的方式,其实就是将statemtn语句进行约定,名字什么都是有固定规则的,简化代码,省略掉statement,简单来讲,让约定优于配置,根据约定定位sql语句

具体的话,看下面:

定义一个接口,通过这个接口来替代statement,该接口有如下规则;

1.接口名和映射.xml文件的文件名相同

2.接口之中的抽象方法的方法名,返回值,参数和映射.xml之中配置的均相同,

3.注意一下如果要返回一个数组的话,使用  List<className> 作为返回类型

定义好了之后通过SqlSession.getMapper(接口名字.class);来获取到操作数据库的对象,之后调用该接口的方法就可以了,具体代码如下:

PersonMapping接口

package mappers;
import entity.Person; import java.util.List; //操作person类的接口
public interface PersonMapping { //接口名也一样
public abstract Person selectPersonById(int id); //方法名,返回值,参数均和配置一样
void deletePersonById(int id);
void insertOnePerson(Person person);
public abstract List<Person> selectPersonByName(String name);
}

main函数之中:

public class test {
public static void main(String[] args) throws IOException {
//加载配置信息
。。。获取到SqlSession对象,和前面一样//获取到mapper对象
PersonMapping personMapping = sqlSession.getMapper(PersonMapping.class);
//调用接口方法操作数据库
Person person = personMapping.selectPersonById();
System.out.println(person);
List<Person> persons = personMapping.selectPersonByName("温鸿飞");
for (Person temp:persons) {
System.out.println(temp);
}
sqlSession.commit();
sqlSession.close();
}
}

感觉这和symfony里面的Respository一样呀,不过你这个还要自己配置,Symfonyh都自己配置好了,你直接实例化对象就行了,symfony很强呀

(一)Mybatis基本配置,Statement方式,动态代理增删改查的更多相关文章

  1. Java对象转JSON时如何动态的增删改查属性

    1. 前言 日常开发中少不了JSON处理,少不了需要在JSON中添加额外字段或者删除特定字段的需求.今天我们就使用Jackson类库来实现这个功能. 2. JSON字符串增加额外字段 假如我们有这样结 ...

  2. Mybatis框架基于映射文件和配置文件的方式,实现增删改查,可以打印日志信息

    首先在lib下导入: 与打印日志信息有关的架包 log4j-1.2.16.jar mybatis架包:mybatis-3.1.1.jar 连接数据库的架包:mysql-connector-java-5 ...

  3. 2018.10.14 MyBatis配置实现对用户的增删改查

    记得导入对应的Jar包 ant-1.9.6.jar ant-launcher-1.9.6.jar asm-5.2.jar cglib-3.2.5.jar commons-logging-1.2.jar ...

  4. Mybatis(一)实现单表的增删改查

    1.1 什么是Mybatis MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并 ...

  5. SSM框架搭建(Spring+SpringMVC+MyBatis)与easyui集成并实现增删改查实现

    一.用myEclipse初始化Web项目 新建一个web project: 二.创建包 controller        //控制类 service //服务接口 service.impl //服务 ...

  6. 3.mybatis实战教程(mybatis in action)之三:实现数据的增删改查

    转自:https://blog.csdn.net/tangruyi1992/article/details/52583910 前面已经讲到用接口的方式编程.这种方式,要注意的一个地方就是.在User. ...

  7. Java Maven:spring boot + Mybatis连接MySQL,通用mapper的增删改查,映射实现多表查询

    1. MySQL自带库test添加表user.role 角色表role 用户表user 2. 添加依赖,配置属性 相关依赖:百度即可,此处略 application.properties spring ...

  8. mybatis实战教程(mybatis in action)之三:实现数据的增删改查

    前面已经讲到用接口的方式编程.如果不一致就会出错,这一章主要在上一讲基于接口编程的基础上完成如下事情:1. 用 mybatis 查询数据,包括列表2. 用 mybatis 增加数据3. 用 mybat ...

  9. JDBC 1 利用Statement对数据库进行增删改查

    准备工作 1新建po类:User private int id; private String name; private String pwd; set,get方法省略 2  新建UserDao类, ...

随机推荐

  1. python函数之 range()

      Python range() 函数用法 python range() 函数可创建一个整数列表,一般用在 for 循环中. 函数语法 range(start, stop[, step]) 参数说明: ...

  2. C# 画箭头

    绘制箭头   1,直接用平台库 Pen arrowPen = new Pen(Color.Blue);            arrowPen.Width = 4;            arrowP ...

  3. java基础类型源码解析之HashMap

    终于来到比较复杂的HashMap,由于内部的变量,内部类,方法都比较多,没法像ArrayList那样直接平铺开来说,因此准备从几个具体的角度来切入. 桶结构 HashMap的每个存储位置,又叫做一个桶 ...

  4. .NET Core学习笔记(1)——在Linux下运行Console APP

    都说.NET Core可以跨平台,说实话Linux咱也不太懂,咱也不敢问.怎样把一个简单的Console App在Linux下跑起来,真是费了我一番功夫.特做此篇以供指北. .NET Core的大饼我 ...

  5. python爬虫登陆问题

    根据腾讯课堂网页登陆问题进行解说(需要安装谷歌浏览器): 1.导入库 import requests from selenium import webdriver 2.根据腾讯课堂链接,进入页面,获取 ...

  6. LinkedHashMap如何保证顺序性

    一. 前言 先看一个例子,我们想在页面展示一周内的消费变化情况,用echarts面积图进行展示.如下: 我们在后台将数据构造完成 HashMap<String, Integer> map ...

  7. Bzoj 3874: [Ahoi2014&Jsoi2014]宅男计划 三分+贪心

    3874: [Ahoi2014&Jsoi2014]宅男计划 Time Limit: 1 Sec  Memory Limit: 256 MBSubmit: 861  Solved: 336[Su ...

  8. 设计模式——通用泛型单例(普通型和继承自MonoBehaviour)

    单例模式是设计模式中最为常见的,不多解释了.但应该尽量避免使用,一般全局管理类才使用单例. 普通泛型单例: public abstract class Singleton<T> where ...

  9. 缓存实践Cache Aside Pattern

    Cache Aside Pattern旁路缓存,是对缓存应用的一个总结,包括读数据方案和写数据方案. 读数据方案 先读cache,如果命中则返回 如果miss则读db 将db的数据存入缓存 写数据方案 ...

  10. Java中的Lambda表达式简介及应用

    在接触Lambda表达式.了解其作用之前,首先来看一下,不用Lambda的时候我们是怎么来做事情的. 我们的需求是,创建一个动物(Animal)的列表,里面有动物的物种名,以及这种动物是否会跳,是否会 ...