首先明白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. X-Admin&ABP框架开发-数据字典

    在业务型的系统开发中,我们需要维护各种个样的类型,比如客户类型.客户行业.商品类型等等,这些类型往往信息量不多,并且相似度极高,如果采用一类型一表去设计,将会造成极大的工作量,通过将这部分类型的信息进 ...

  2. DFS和BFS的比较

    DFS(Depth First Search,深度优先搜索)和BFS(Breadth First Search,广度优先搜索)是两种典型的搜索算法.下面通过一个实例来比较一下深度优先搜索和广度优先搜索 ...

  3. Python中文件的读写操作

    文件操作基本流程: 1. 介绍 计算机系统是由计算机硬件,操作系统,和应用程序三部分组成. 内存 存放不持久 硬盘 可以使数据持久化 文件操作  数据持久化的一种 全栈开发  框架类 2. 文件的操作 ...

  4. Java设计模式学习笔记(四) 抽象工厂模式

    前言 本篇是设计模式学习笔记的其中一篇文章,如对其他模式有兴趣,可从该地址查找设计模式学习笔记汇总地址 1. 抽象工厂模式概述 工厂方法模式通过引入工厂等级结构,解决了简单工厂模式中工厂类职责太重的问 ...

  5. 关于下载安装Photoshop CS6遇到的一些问题

    关于安装Photoshop CS6顺带安装AdobeBridge CS6和Aobe Extension Manager CS6的问题 Bridge是PS的一款插件,它能兼容大多数AODBE公司的软件, ...

  6. 洛谷P2384 最短路 题解

    题目简叙: 请你求出从1到n的最短路径,其中最短路径☞这条路经过的边的权值的乘积. 题目分析: 很显然,这也是一道经典的单元最短路问题,首先我们可以考虑使用Floyd,显然,这是一个比较无脑简单的最短 ...

  7. Python登录豆瓣并爬取影评

    上一篇我们讲过Cookie相关的知识,了解到Cookie是为了交互式web而诞生的,它主要用于以下三个方面: 会话状态管理(如用户登录状态.购物车.游戏分数或其它需要记录的信息) 个性化设置(如用户自 ...

  8. Error:Some file crunching failed, see logs for details

    Information:Gradle tasks [:myapp2:assembleDebug] Error:Some file crunching failed, see logs for deta ...

  9. [小米OJ] 10. 爬楼梯

    dp 另: 小米oj上的测试样例是错的 ; ) function solution(line) { if (line == 0) return 0; if (line == 1) return 1; ...

  10. 哥们,B/S了解吗?——啥玩意,我是敲代码的

    了解B/S和C/S 前言:......“学好长时间编程了,JavaSE学完了,前端也简单学了”.....“那你学这么多,讲讲B/S吧”......“B/S?这是个啥玩意?没听过”......“靠,牛逼 ...