MyBatis框架快速入门

入门案例

创建一个关于Mybatis项目

首先创建一个空项目,然后新建一个moudle,选择quickstart,接下来把模块放到空项目之下。即可

实现mybatis查询数据库的功能

实现步骤:

  1. 新建studnet表
  2. 加入maven的mybatis坐标,mysql驱动的坐标
  3. 创建实体类,Student–保存表中的一行数据的
  4. 创建持久层的dao接口,定义操作数据库的方法
  5. 创建一个mybatis使用的配置文件,叫做sql映射文件:写sql语句的。一般一个表一个sql映射文件。这个文件是xml文件
  6. 创建mybatis的主配置文件:一个项目就一个主配置文件。主配置文件提供了数据库的连接信息和sql映射文件的位置信息
  7. 创建使用mybatis类,通过mybatis访问数据库。

创建mysql数据库和表

数据库创建表student

CREATE TABLE `student` (`id` int NOT NULL,`name` varchar(80) DEFAULT NULL,`email` varchar(100) DEFAULT NULL,`age` int DEFAULT NULL,PRIMARY KEY (`id`)
);

在pom.xml中添加相关依赖(加入maven的mybatis坐标,mysql驱动的坐标)

<!--    mybatis的依赖-->
<dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.5.1</version>
</dependency>
<!--mysql驱动-->
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.19</version>
</dependency>

可以在左侧右键pom.xml选择Maven-Reimport,可以在右侧maven项目下的Dependencies下查看依赖项

创建实体类

studnet实体类(domain包下)

package comipingfan.domain;
//推荐和表明一样。
public class Student {private Integer id;private String name;private String email;private Integer age;public Integer getId() {return id;}public void setId(Integer id) {this.id = id;}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 Integer getAge() {return age;}public void setAge(Integer age) {this.age = age;}@Overridepublic String toString() {return "Student{" +"id=" + id +", name='" + name + '\'' +", email='" + email + '\'' +", age='" + age + '\'' +'}';}
}

创建dao层下的接口

dao接口(dao包下)

package comipingfan.dao;
import comipingfan.domain.Student;
import java.util.List;
//接口,操作Student表
public interface StudentDao {//查询Student表的所有的数据public List<Student> selectStudents();//插入方法public int insertStudent(Student stu);
}

创建mybatis使用的配置文件,在接口所在的目录下

StudentDao.xml(dao包下,sql映射文件)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="comipingfan.dao.StudentDao"><select id="selectStudents" resultType="comipingfan.domain.Student">select  id,name,email,age from student order by id</select><insert id="insertStudnet">insert into student values(#{id},#{name},#{email},#{age})</insert>
</mapper>

对sql文件的解析:

sql映射文件:写sql语句的,mybatis会执行这些sql1.指定约束文件:<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">mybatis-3-mapper.dtd是约束文件的名称,扩展名是dtd的。2.约束文件的作用:限制,检查在当前文件中出现的标签,属性必须符合要求3.mapper 是当前问价你的根标签,必须的。namespace:叫做命名空间,可以是自定义的字符串要求你使用dao接口的全限定名称4.在当前文件中,可以使用特定的标签,表示数据库的特定操作。<select>:表示执行查询<update>:表示更新数据库的操作

创建mybatis的主配置文件

在resource下创建mybatis.xml(mybatis的主配置文件)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><settings><!--设置mybatis输出日志--><setting name="logImpl" value="STDOUT_LOGGING"/></settings><!--环境配置: 数据库的连接信息default:必须和某个environment的id值一样。告诉mybatis使用哪个数据库的连接信息。也就是访问哪个数据库--><environments default="mydev"><environment id="mydev"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/springdb?useSSL=false&amp;serverTimezone=UTC"/><property name="username" value="root"/><property name="password" value="3306"/></dataSource></environment></environments><!-- sql mapper(sql映射文件)的位置--><mappers><mapper resource="comipingfan/dao/StudentDao.xml"/></mappers>
</configuration>

至此,关于mybatis的配置完成。学过maven的就可以知道点击maven下的compile就能够对该项目进行编译。都在target目录下。此时你可能会发现在你的dao包下只有接口文件(StudnetDao.class)并没有(xxx.xml文件)这是因为默认情况下不会处理xml文件,需要用过插件进行编译。

<build><resources><resource><directory>src/main/java</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>false</filtering></resource></resources>
</build>

会扫描到properties、xml文件。

测试

public static void main(String[] args) throws IOException {//访问mybatis读取Student数据//1.定义mybatis主配置文件的名称,从类路径的根开始(target/clasess)String config="mybatis.xml";//2.读取这个config表示的文件InputStream in= Resources.getResourceAsStream(config);//3.创建了SqlSessionFactoryBuilder对象SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();//4.创建SqlSessionFactory对象SqlSessionFactory factory=builder.build(in);//5.获取SqlSession对象,从SqlSessionFactory中获取SqlSessionSqlSession sqlSession=factory.openSession();//6.指定执行的sql语句的标识。sql映射文件中的namespace+"."+标签的id值String sqlId="comipingfan.dao.StudentDao"+"."+"selectStudents";//7.执行sql语句List<Student>studentList=sqlSession.selectList(sqlId);//8.输出结果studentList.forEach(student -> System.out.println(student));//9.关闭SqlSession对象sqlSession.close();}

总结:关于连接数据库,初学者可能遇到各种各样的问题,比如找不到mybatis.xml文件(这是因为mybatis.xml并没有被编译到target/classes下。需要在pom中加入插件)还需要检查自己的依赖到底是mysql8还是mysql5。另外mybatis-3.5.2需要mysql5.1x以上的版本

优化mybatis的连接操作

创建MyBatisUtiles工具类

public class MyBatisUtiles {private static SqlSessionFactory factory=null;static {String config="mybatis.xml";try {InputStream in= Resources.getResourceAsStream(config);factory=new SqlSessionFactoryBuilder().build(in);} catch (IOException e) {e.printStackTrace();}}//获取SqlSession方法public static SqlSession getSqlSession(){SqlSession sqlSession=null;if(factory!=null){sqlSession=factory.openSession();//非自动提交事务}return sqlSession;}
}

测试

 SqlSession sqlSession= MyBatisUtiles.getSqlSession();//指定执行的sql语句的标识。sql映射文件中的namespace+"."+标签的id值String sqlId="comipingfan.dao.StudentDao"+"."+"selectStudents";//执行sql语句List<Student>studentList=sqlSession.selectList(sqlId);//输出结果studentList.forEach(student -> System.out.println(student));//关闭SqlSession对象sqlSession.close();

自定义mybatis配置模板

在Editor下的File and Code Templates,点击+好。即可创建模板。

例如创建maper模板

name=mybatis-mapper

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace=""><select id="" resultType=""></select>
</mapper>

同理,mybatis主配置文件。

name=mybatis-config

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configurationPUBLIC "-//mybatis.org//DTD Config 3.0//EN""http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><settings><!--设置mybatis输出日志--><setting name="logImpl" value="STDOUT_LOGGING"/></settings><!--环境配置: 数据库的连接信息default:必须和某个environment的id值一样。告诉mybatis使用哪个数据库的连接信息。也就是访问哪个数据库--><environments default="mydev8"><environment id="mydev8"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.cj.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3306/springdb?useSSL=false&amp;serverTimezone=UTC"/><property name="username" value="root"/><property name="password" value="3306"/></dataSource></environment><environment id="mydev5"><transactionManager type="JDBC"/><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver"/><property name="url" value="jdbc:mysql://localhost:3308/springdb"/><property name="username" value="root"/><property name="password" value="3308"/></dataSource></environment></environments><!-- sql mapper(sql映射文件)的位置--><mappers><mapper resource="comipingfan/dao/StudentDao.xml"/></mappers>
</configuration>

实现Dao接口的方式访问数据库

分析StudentDao接口

我们通过mybatis连接数据库并进行增删拆改,可以发现和接口中的方法并没有直接的关系。正常操作应该是调用dao接口中的方法来完成操作的。其实在开发中都是service层来进行访问数据库的,而service层去实现dao层的接口的。因此接下来通过实现接口的形式访问数据库。

dao层

StudentDao.java

package comipingfan.dao;
import comipingfan.domain.Student;
import java.util.List;
//接口,操作Student表
public interface StudentDao {//查询Student表的所有的数据public List<Student> selectStudents();//插入方法public int insertStudent(Student stu);
}

StudentDao.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="comipingfan.dao.StudentDao"><select id="selectStudents" resultType="comipingfan.domain.Student">select  id,name,email,age from student order by id</select><insert id="insertStudnet">insert into student values(#{id},#{name},#{email},#{age})</insert>
</mapper>

dao层下的impl包

StudnetDaoImpl.java

public class StudnetDaoImpl implements StudentDao {@Overridepublic List<Student> selectStudents() {SqlSession sqlSession= MyBatisutiles.getSqlSession();String sqlId="com.pingfan.dao.StudentDao"+"."+"selectStudents";List<Student> list = sqlSession.selectList(sqlId);sqlSession.close();return list;}@Overridepublic int insertStudent(Student stu) {SqlSession sqlSession= MyBatisutiles.getSqlSession();String sqlId="com.pingfan.dao.StudentDao"+"."+"insertStudnet";int res=sqlSession.insert(sqlId,stu);sqlSession.commit();sqlSession.close();return res;}
}

测试:

@Test
public void testSelectStudents(){StudentDao dao=new StudnetDaoImpl();List<Student> students = dao.selectStudents();for(Student stu:students){System.out.println(stu);}
}

利用动态代理实现Dao接口

上述的实现类StudnetDaoImpl主要作用就是拿到sqlSession对象和sqlId(主要是id和全限定名称的拼接)。然后去执行相应的方法。而动态代理刚好可以帮我们拿到全限定名称和id。

分析:

使用mybatis的动态代理机制,使用SqlSession.getMapper(dao接口.class)取这个dao接口的对象
getMapper能获取dao接口对于的实现类对象
然后就能执行相应的方法

dao层(只需要StudnetDao接口和Studnet.xml)

public interface StudentDao {List<Student> selectStudents();int insertStudent(Student stu);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.item.dao.StudentDao"><select id="selectStudents" resultType="com.item.domain.Student">select * from student order by id</select><insert id="insertStudent" >insert into student values(#{id},#{name},#{email},#{age})</insert>
</mapper>

测试:(当然获取SqlSession的工具类和mybatis的主配置文件上面已给出)

SqlSession sqlSession= MyBatisutiles.getSqlSession();
StudentDao dao=sqlSession.getMapper(StudentDao.class);
//调用dao的方法,执行数据库的操作
List<Student>students=dao.selectStudents();
for (Student stu:students){System.out.println(stu);
}
SqlSession sqlSession=MyBatisutiles.getSqlSession();
StudentDao dao=sqlSession.getMapper(StudentDao.class);
Student stu=new Student();
stu.setId(1006);
stu.setName("xxx");
stu.setEmail("xxx@qq.com");
stu.setAge(20);
int res = dao.insertStudent(stu);
sqlSession.commit();
System.out.println("res="+res);

深入理解参数

parameterType

接口中方法参数的类型, 类型的完全限定名或别名。这个属性是可选的,因为 MyBatis 可以推断出具体传入语句的参数,默认值为未设置(unset)。接口中方法的参数从 java 代码传入到 mapper 文件的 sql 语句。

例如:

<delete id="deleteStudent" parameterType="int">delete from student where id=#{studentId}
</delete>

等同于

<delete id="deleteStudent" parameterType="java.lang.Integer">delete from student where id=#{studentId}
</delete>

当然不写也是可以的。会自动推断。

MyBatis 传递参数

一个简单参数

Dao 接口中方法的参数只有一个简单类型(java 基本类型和 String),占位符 #{ 任意字符 },和方 法的参数名无关

接口方法: Student selectById(int id);

mapper 文件:

<select id="selectById" resultType="com.bjpowernode.domain.Student">select id,name,email,age from student where id=#{studentId}
</select>

#{studentId} , studentId 是自定义的变量名称,和方法参数名无关。

测试:

Student student = studentDao.selectById(1005);System.out.println("查询 id 是 1005 的学生:"+student);

多个参数-使用@Param

当 Dao 接口方法多个参数,需要通过名称使用参数。在方法形参前面加入@Param(“自定义参数名”), mapper 文件使用#{自定义参数名}。

例如定义

 List selectStudent( @Param(“personName”) String name ) { … }

mapper 文件

 select * from student where name = #{ personName}

接口方法:

 List selectMultiParam(@Param("personName") String name, @Param("personAge") int age);

mapper 文件:

<select id="selectMultiParam" resultType="com.bjpowernode.domain.Student">select id,name,email,age from student where name=#{personName} or age=#{personAge}
</select>

测试

List<Student> stuList = studentDao.selectMultiParam("李力",20);stuList.forEach( stu -> System.out.println(stu));

多个参数-使用对象

使用 java 对象传递参数, java 的属性值就是 sql 需要的参数值。 每一个属性就是一个参数。

语法格式: #{ property,javaType=java 中数据类型名,jdbcType=数据类型名称 } javaType, jdbcType 的类型 MyBatis 可以检测出来,一般不需要设置。常用格式 #{ property }

综上:使用常用格式即可。

创建保存参数值的对象 QueryParam

package com.bjpowernode.vo;
public class QueryParam {private String queryName;private int queryAge;//set ,get 方法
}

接口方法:

List<Student> selectMultiObject(QueryParam queryParam);

mapper 文件:

<select id="selectMultiObject" resultType="com.bjpowernode.domain.Student">select id,name,email,age from student where name=#{queryName} or age
=#{queryAge}
</select>
或
<select id="selectMultiObject" resultType="com.bjpowernode.domain.Student">select id,name,email,age from studentwhere name=#{queryName,javaType=string,jdbcType=VARCHAR}or age =#{queryAge,javaType=int,jdbcType=INTEGER}
</select>

测试:

QueryParam qp = new QueryParam();qp.setQueryName("李力");qp.setQueryAge(20);List<Student> stuList = studentDao.selectMultiObject(qp);stuList.forEach( stu -> System.out.println(stu));

问题汇总

resource下的mybatis.xml文件找不到

当你用IDEA右侧maven执行clear和compile命令时,如果不加

<resource><directory>src/main/resources</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>false</filtering>
</resource>

则会找不到mybatis.xml文件。但是如果你一开始就没有target目录,而是通过main函数执行或者run-test,则mybatix.xml会被放到target目录下。所以建议还是放下(一个是编译src/main下一个是resource下)。

<build><resources><resource><directory>src/main/java</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>false</filtering></resource><resource><directory>src/main/resources</directory><includes><include>**/*.properties</include><include>**/*.xml</include></includes><filtering>false</filtering></resource></resources></build>

MyBatis框架快速入门相关推荐

  1. java day53【 Mybatis框架概述 、 Mybatis 框架快速入门、自定义 Mybatis 框架 】

    第1章 框架概述 1.1 什么是框架 1.1.1 什么是框架 框架(Framework)是整个或部分系统的可重用设计,表现为一组抽象构件及构件实例间交互的方法;另一种 定义认为,框架是可被应用开发者定 ...

  2. springboot 整合mybatis_SpringBoot整合MyBatis框架快速入门

    MyBatis概述: mybatis是一个优秀的基于java的持久层框架,它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动.创建连接.创建statemenet等繁 ...

  3. MyBatis之快速入门

    MyBatis之快速入门 2017/9/30 首先我要明确告诉大家的是MyBatis是一个java持久层框架,以前我们都是用jdbc来将我们的java程序与数据库相连接,而MyBatis是对jdbc的 ...

  4. MyBatis 01 快速入门

    MyBatis 01 快速入门 文章目录 MyBatis 01 快速入门 一.学习目标 二.为什么需要框架技术 三.框架技术介绍 四.主流框架介绍 五.持久化与ORM 六.MyBatis简介 七.搭建 ...

  5. 视频教程-Spring框架快速入门到精通-Java

    Spring框架快速入门到精通 十年项目开发经验,主要从事java相关的开发,熟悉各种mvc开发框架. 王振伟 ¥18.00 立即订阅 扫码下载「CSDN程序员学院APP」,1000+技术好课免费看 ...

  6. Quartz 框架快速入门(二)

    尽可能的用声明式处理软件配置,其次才考虑编程式的方式.在上一篇<Quartz 框架快速入门(一)>中,如果我们要在 Job 启动之后改变它的执行时间和频度,必须去修改源代码重新编译.这种方 ...

  7. Quartz 框架快速入门(四)

    Spring的scheduling.quartz包中对Quartz框架进行了封装,使得开发时不用写任何QuartSpring的代码就可以实现定时任务.Spring通过JobDetailBean,Met ...

  8. Quartz 框架快速入门(三)

    在前面两篇文章中简单介绍了在java应用程序中如何使用Quartz框架,这一篇中我们将看到如何在web环境下通过配置文件来完成Quartz的后台作业调度,而不必手工去创建Trigger和Schedul ...

  9. java元婴期(22)----java进阶(mybatis(1)---mybatis框架概述入门程序)

    1.对原生态jdbc程序中问题总结(为啥要用mybatis) 1.数据库连接,使用时就创建,不使用立即释放,对数据库进行频繁连接开启和关闭,造成数据库资源浪费,影响 数据库性能. 设想:使用数据库连接 ...

最新文章

  1. 机器学习博士自曝:实验室「阉割」我的创造力,劝你别读!
  2. 【转帖】Windows下PostgreSQL安装图解
  3. pdb连接数_Oracle 19c 之多租户 PDB 连接与访问(三)
  4. 模型解析之独立顶点的筛选
  5. 深入理解Async/Await
  6. c语言中的所有代码大全,C语言库函数代码大全
  7. 中国风喜庆传统新年元旦海报PSD分层模板
  8. cp abe java_CP-ABE环境配置
  9. Firemonkey的旁门左道[六]
  10. mysql tode_FAQ: MyDB Studio for MySQL
  11. hdu 3506 Monkey Party 区间dp + 四边形不等式优化
  12. python实现调用百度图像识别api得到图片识别与检测类别和详细信息以及相关准确度
  13. 世界观和方法论----写给学弟学妹的
  14. Codeforces 417D Cunning Gena(状压DP)
  15. 开源备份工具duplicity支持阿里云OSS后端存储
  16. N多的红烧茄子做法!
  17. latex 表格紧跟指定的文字后面
  18. 常见的12个深度学习面试问题(提高篇)
  19. MySQL——客户端工具简介
  20. java join的用法

热门文章

  1. 吉时利万用表DMM7510,值得拥有的触摸屏数采万用表
  2. 消除if…else的锦囊妙计
  3. 2019 CSP-J 真题 题目、答案以及解析
  4. UNE BASE SIMPLE MAIS PARFAITE POUR SENTENCE EMBEDDINGS(一个简单但很难超越的Sentence Embedding基线方法)
  5. 微型计算机硬盘接口有哪些,什么是硬盘(硬盘接口有哪些)
  6. 从arduino板开始做到阿里云app控制--WeMos D1或ESP8266连接阿里云文章合集及源代码
  7. SVG 从入门到后悔,怎么不早点学起来(图解版)
  8. 在 ubuntu20.04下搭建 lamp 环境并制作静态网页
  9. 二、零基础入门微信小程序项目开发之页面跳转实现
  10. 中科院oracle,《Oracle 10G 系统教程 中科院培训老师讲授》