当前位置: 首页 > backend >正文

Mybatis

一,Mybatis概述

1.历史:

Mybatis原本是apache的一个项目,原名ibatis,2010转投谷歌,从3.0开始更名为mybatis

Apache软件基金会(Apache Software Foundation,简称 ASF)是专门为运作一个开源软件项目的Apache的团体提供支持的非盈利性组织
    

2.Mybatis是什么:

mybatis是一个优秀的数据持久层框架

mybatis对jdbc进行了封装,避免了手动设置参数,手动封装查询结果,还将jdbc中的接口进行封装,为我们提供常用的类来实现还可以使用xml或注解方式向数据库发送sql
        dao    data access object 数据访问对象  把这一类称为数据访问层类(数据持久层类)
        jdbc是原生写法,最基本的接口,类实现
        

二,Mybatis环境搭建

1.框架:

就是对现有的一些基本的写法的代码进行封装(包装)
        

2.框架的搭建:

        (1)   创建表,创建项目

create database mybatisdb charset utf8create table admin(id int primary key auto_increment,account varchar(20),password varchar(20),gender char(1),reg_time datetime
)

        (2)   导入相关的jar文件(包)

创建lib文件后将MyBatis jar包和mysql数据库驱动包拖入lib文件中

经过这几步操作后,成功的将MyBatis jar包和mysql数据库驱动包导入     

(3)创建mybatis核心配置文件(数据库链接,全局配置)

在项目名下创建recourse目录。选中,右键设置为资源目录

 在resource目录中新建FXML File项目命名为mybatis.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">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver" />
<property name="url" value="自己补全...?serverTimezone=Asia/Shanghai" />
<property name="username" value="root" />
<property name="password" value="自己密码"/>
</dataSource>
</environment>
</environments>
</configuration>

        (4)  创建表对应的模型类,添加对应的属性

先进行创建model包将所需模型类写入该包中

若不做过多的使用可只写setter方法和toString方法

package com.ffyc.mybatisdemo.model;import javax.xml.crypto.Data;
import java.util.Date;
/*
模型类,与数据库中的表是对应的,用来封装damin信息*/public class Admin {private int id;private String account;private String password;private char gender;private Date regtime;public Admin(){System.out.println("Admin的无参构造方法");}public void setId(int id) {this.id = id;}public void setAccount(String account) {this.account = account;}public void setPassword(String password) {this.password = password;}public void setGender(char gender) {this.gender = gender;}public void setRegtime(Date regtime) {this.regtime = regtime;}@Overridepublic String toString() {return "Admin{" +"id=" + id +", account='" + account + '\'' +", password='" + password + '\'' +", gender=" + gender +", regtime=" + regtime +'}';}
}

      (5)创建Admin操作的接口,定义操作方法

在接口中定义所需使用的方法

package com.ffyc.mybatisdemo.dao;import com.ffyc.mybatisdemo.model.Admin;
import org.apache.ibatis.annotations.Param;import java.util.ArrayList;/*
定义功能*/
public interface AdminDao {/*在接口中定义一个通过id查询admin的方法*/Admin findAdminByID(int ID);//    Admin login(@Param("acc") String account, @Param("pwd") String password);Admin login(Admin admin);//查询管理员总人数,返回简单类型数据ArrayList<Admin> findAdmincount();//增int insertAdmin(Admin admin);//删除int deleteAdmin(Admin admin);//改int uppdateadmin(Admin admin);
}

      (6)创建sql映射文件  写各种操作sql

在mappers文件夹中创建sql映射文件AdminMapper.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">
<!--转门写sql语句的文件-->
<mapper namespace="接口的地址"><!--接口完整的地址--><!--接口中的方法名与映射文件中的标签id相同接口中的参数类型与parameterType接口中的方法地返回值类型与resultType可以自动地将查询结果封装到我们指定的集合中需要注意:表中列名,需要与模型类中的属性名一致
--><select id="findAdminById"
parameterType="int" <!--所给值的类型--> resultType="com.ffyc.mybatis.model.Admin"<!--返回值类型-->>
select * from admin where id = #{id}<!--需符合sql语句规范-->
</select>
</mapper>

然后根据自己在接口中定义的方法进行改写以上文呈现的Admindao接口中的方法为例

<?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">
<!--转门写sql语句的文件-->
<mapper namespace="com.ffyc.mybatisdemo.dao.AdminDao">
<!--接口中的方法名与映射文件中的标签id相同接口中的参数类型与parameterType接口中的方法地返回值类型与resultType可以自动地将查询结果封装到我们指定的集合中需要注意:表中列名,需要与模型类中的属性名一致
--><select id="findAdminByID" parameterType="int" resultType="Admin">select id,account,password,gender,regtime from admin where id = #{id}</select><select id="login" parameterType="Admin" resultType="Admin">select id,account,gender,regtime from admin where account=#{account} and password=#{password}</select><insert id="insertAdmin" parameterType="Admin" >insert into admin(account,password,gender,regtime)value(#{account},#{password},#{gender},now())
</insert><update id="uppdateadmin" parameterType="Admin">update admin set account=#{account},password=#{password},gender=#{gender} where id=#{id}</update><delete id="deleteAdmin" parameterType="Admin"><!--这里的parameterType指传入接口中传入的参数类型,resultType指返回值的类型,进行增删改查操作是返回的是int类型行数,不需要在这里写resultType,但在查询操作中,查询的结果是一个数值,仍然需要在这里声明结果返回的类型-->delete from admin where id=#{id}</delete><select id="findAdmincount" resultType="Admin">select * from admin</select></mapper>

      (7)测试读取配置文件  创建链接对话对象,获得接口代理对象,调用方法执行sql,得到结果mtbatis查询时,可以做到自动结果映射

写一个test测试类

package com.ffyc.mybatisdemo.test;import com.ffyc.mybatisdemo.dao.AdminDao;
import com.ffyc.mybatisdemo.model.Admin;
import com.ffyc.mybatisdemo.util.MybatisUtil;
import org.apache.ibatis.session.SqlSession;import java.io.IOException;
import java.util.ArrayList;public class test {public static void main(String[] args) throws IOException {
//        test.insert();
//        test.update();
//        test.delete();test.find();}public static void find() throws IOException {//模拟组装要保存的管理员数据SqlSession sqlSession = MybatisUtil.getSqlSession();AdminDao adminDao = sqlSession.getMapper(AdminDao.class);ArrayList<Admin> admins= adminDao.findAdmincount();System.out.println(admins);sqlSession.commit();//提交事务//增删改操作执行完后,需要向数据库提交事务才行,提交后数据库才会真正保存数据到数据库sqlSession.close();}public static void insert() throws IOException {//模拟组装要保存的管理员数据Admin admin = new Admin();admin.setAccount("222");admin.setPassword("222");admin.setGender('女');SqlSession sqlSession = MybatisUtil.getSqlSession();AdminDao adminDao = sqlSession.getMapper(AdminDao.class);int row = adminDao.insertAdmin(admin);System.out.println(row);sqlSession.commit();//提交事务//增删改操作执行完后,需要向数据库提交事务才行,提交后数据库才会真正保存数据到数据库sqlSession.close();}public static void update() throws IOException {//模拟组装要保存的管理员数据Admin admin = new Admin();admin.setAccount("2223");admin.setPassword("2223");admin.setGender('男');admin.setId(4);SqlSession sqlSession = MybatisUtil.getSqlSession();AdminDao adminDao = sqlSession.getMapper(AdminDao.class);int row = adminDao.uppdateadmin(admin);System.out.println(row);sqlSession.commit();//提交事务//增删改操作执行完后,需要向数据库提交事务才行,提交后数据库才会真正保存数据到数据库sqlSession.close();}public static void delete() throws IOException {//模拟组装要保存的管理员数据Admin admin = new Admin();admin.setId(5);SqlSession sqlSession = MybatisUtil.getSqlSession();AdminDao adminDao = sqlSession.getMapper(AdminDao.class);int row = adminDao.deleteAdmin(admin);System.out.println(row);sqlSession.commit();//提交事务//增删改操作执行完后,需要向数据库提交事务才行,提交后数据库才会真正保存数据到数据库sqlSession.close();}}

(8)封装MybatisUtil类

由于每次写一个操作方法时都需要与数据库进行交互操作

所以可以写一个MybatisUtil类先创建一个工具包(util包)再将MybatisUtil类写在该包中

package com.ffyc.mybatisdemo.util;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.Reader;public class MybatisUtil {/*静态代码块在类第一次加载时,自动换行,只执行一次*/static SqlSessionFactory sessionFactory;static {//读取配置文件Reader reader = null;try {reader = Resources.getResourceAsReader("mybatis.xml");} catch (IOException e) {throw new RuntimeException(e);}//用来创建SqlSessionFactory,用来创建sqlsession,SqlSession类似于记得把车中的Connection//SqlSessionFactory在项目中只需要创建一个对象即可,里面读取到配置文件中的信息sessionFactory = new SqlSessionFactoryBuilder().build(reader);}public static SqlSession getSqlSession() throws IOException {//        创建SqlSession,域数据库会话对象,每与数据库交互一次,我们就创建一个SQL Session对象,就是一个链接通道,用完关闭SqlSession sqlSession = sessionFactory.openSession();return sqlSession;}}

API接口说明

        SqlSessionFactory接口

        使用SqlSessionFactory 来创建SqlSession,一旦创建SqlSessionFactory 就会在整个应用过程中始终存在。由于创建开销较大,所以没有理由去销毁再创建它。

SqlSession接口

Sqlsession意味着创建与数据库链接会话,该接口中封装了对数据库操作的方法,与数据库会话完成后关闭会话。

3,Mybatis.xml中配置常用的标签(该功能需写在Mybatis.xml中)

(1)配置全局设置

Mybatis内置的日志工厂提供日志功能,具体的日志实现有以下几种方式:

SLF4J|LOG4J|JDK_LOGGINGCOMMONS_LOGGING|STDOUT_LOGGING

配置日志:

    <!--配置全局设置-->
<settings><!--配置在控制台的打印日志的功能--><setting name="logImpl" value="STDOUT_LOGGING"/><!--可以把标准数据库列名和Java标准属性名自定映射--><setting name="mapUnderscoreToCamelCase" value="true"/></settings>

如果java中使用标准驼峰命名,数据库中使用下划线连接命名,可以开始全局设置实现自动转换:

与输出日志信息一样属于全局变量

<!--当java中使用标准驼峰命名,数据库中使用下划线连接命名在全局设置中设置-->                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     
<settings>
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>

(2)为模型类取别名

在配别名后就不需要在parameterType与resultType中写出完整的类地址

        在项目中只存在一个模型类

<!--type="模型类完整的地址" alias="别名"-->
<typeAliases><typeAlias type="com.ffyc.mybatispro.dao.AdminDao" alias="admin"/>
</typeAliases>

        在项目

<typeAliases><package name="com.ffyc.mybatispro.model"/><!-- 配置模型的类的包地址-->
</typeAliases>

中存在多个模型类(一般使用此方式)

(3)注册sql映射文件,一个功能定义一个mapper

<mappers><mapper resource="mappers/AdminMapper.xml"/>
</mappers>

这里指resource="sql映射文件地址"

4,参数传递

(1)单个参数直接传递

在Admindao中进行传递

Admin selectAdmin(int id);

在AdminMapper.xml中使用传过来的参数(以下相同) 

<select id="findAdminById" parameterType="int" resultType="Admin">select id,account,password,gender,reg_time from admin where id = #{id}
</select>

(2)多个参数使用@Param(“”)绑定

Admin selectAdmin(@Param("account")String account,@Param("password")String
password);
<select id="selectAdmin" resultType="Admin">
select id, account, password from admin
where account= #{account} and password=#{password}
</select>

(3)如果传入一个复杂的对象,就需要使用parameterType参数进行类型定义,例如:

Admin selectAdmin(Admin admin);
<select id="selectAdmin" parameterType="Admin" resultType="Admin">
select id, account, password from admin
where account= #{account} and password=#{password}
</select>

5,增删改操作

(1)增

<insert id="唯一标识" parameterType="参数类型">
insert into admin(account,password)values(#{account},#{password})
</insert>

(2)删

<delete id="唯一标识" parameterType="参数类型">
delete from admin where id= #{id}
</delete>

(3)改

<update id="唯一标识" parameterType="参数类型">
update admin set account= #{account},password= #{password} where id= #{id}
</update>

6,查询操作

(1)简单查询

返回简单基本类型
<select id="findAdminInfoCount" resultType="int">
select count(*) from admin
</select>

查询多条数据,返回集合:

 <select id="findAdminArray" resultType="admin"><!--这里resultType返回的类型一定是admin类型而不是集合-->select * from admin</select>

(2)对象映射

如果表中的类名与类中的属性名完全相同,mybatis会自动将查询结果封装到java对象中.

如果java中使用标准驼峰命名,数据库中使用下划线连接命名,可以开始全局设置实现自动转换

<setting name="mapUnderscoreToCamelCase" value="true"/>
<select id="findAdminInfoById" parameterType="int"resultType="Admin">
select * from admin where id=#{id}
</select>

http://www.xdnf.cn/news/386.html

相关文章:

  • 数据结构0基础学习堆
  • AcWing 11:背包问题求方案数 ← 0-1背包
  • 与终端同居日记:Linux指令の进阶撩拨手册
  • docker底层原理
  • 如何给云开发生成的智能体增加权限判断
  • AtCoder ABC402 A~D 题解
  • 数据驱动未来:大数据在智能网联汽车中的深度应用
  • Visio导出清晰图片步骤
  • npm 常用操作和配置
  • uv:重新定义Python开发效率的下一代工具链
  • 高可靠 ZIP 压缩方案兼容 Office、PDF、TXT 和图片的二阶段回退机制
  • 【今日三题】打怪(模拟) / 字符串分类(字符串哈希) / 城市群数量(dfs)
  • Cril 截取字段-生成hostname
  • Git命令归纳
  • 少儿编程路线规划
  • Docker Overlay 网络的核心工作(以跨节点容器通信为例)
  • 公务员行测之速算分数记忆检验-无答案版本
  • 《从理论到实践:CRC校验的魔法之旅》
  • Benewake(北醒) TF-NOVA 在通过TTL-USB转接板更改配置教程
  • VUE快速入门-4:简单入门案例
  • eplan许可证无法识别硬件信息
  • if/switch语句初始化功能
  • MySQL内置函数:字符串函数,数值函数,日期函数,流程控制函数
  • 【unity实战】Unity动画层级(Animation Layer)的Sync同步和Timing定时参数使用介绍,同步动画层制作角色的受伤状态
  • 数据结构基本概念
  • 如何导出pip下载的paho-mqtt包
  • 1.了解开发行业
  • 解析:深度优先搜索、广度优先搜索和回溯搜索
  • OPC Client第3讲(wxwidgets):wxFormBuilder;基础框架;事件处理
  • JavaScript 所有操作数组的方法