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 utf8
 
create 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;
    }

    @Override
    public 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>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值