java后端框架——Mybatis框架搭建

目录

一、Mybatis概述

二、Mybatis环境搭建

(1)在数据库中创建一张表和表对应的实体集

(2)在IDEA中创建一个Maven项目

(3)创建MyBatis全局配置文件

(4)创建访问的接口,定义方法

(5)创建sql映射文件(用于sql实现)

(6)测试

三、封装、参数传递

 (1)单个参数传递

(2)多个参数传递

(3)返回多个结果


java后端框架简介

        mybatis(数据层):对jdbc进行封装

        spring(业务层):对整个java后端架构进行管理

        springweb:对web层(servlet)进行封装

        springboot:对spring框架的搭建进行封装

      除此之外还有很多,但是今天我们这里主要介绍mybatis。

一、Mybatis概述

        原是Apache的一个开源项目iBatis, 2010年6月这个项目由Apache Software Foundation 迁移

到了 Google Code,随着开发团队转投Google Code 旗下,iBatis3.x正式更名为MyBatis。

        MyBatis 是一款优秀的持久层框架。

        Mybatis 将基本的 JDBC 常用接口封装,对外提供操作即可。        

        MyBatis 可以使用 XML 或注解来配置和映射,将数据库中的记录映射成Java 的 POJO(Plain

Old Java Objects,普通的 Java 对象),是一种 ORM(ORM)Object Relational Mapping 对象关系映射)

实现. 

二、Mybatis环境搭建

(1)在数据库中创建一张表和表对应的实体集

        这里我以admin表为例

(2)在IDEA中创建一个Maven项目

        在pom.xml文件中导入MyBatis jar包,MySQL数据库驱动包(注:在<project>标签中新建<dependence>标签并在此标签中导入一下代码

<!--mybatis-->
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>3.4.2</version>
</dependency>
<!--mysql-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.16</version>
</dependency>

        最终结果如图所示

 

(3)创建MyBatis全局配置文件

        将与数据库链接的信息抽取到该配置文件,使用时直接读取,避免大量重复代码。

在项目main文件夹中有一个resources文件夹,我们在他下面创建一个.xml文件,这里我命名为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>
    <!--mybatis核心全局配置文件-->
    <settings><!--mybatis日志,用于控制台打印日志信息-->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
    <!--配置数据库连接相关信息-->
    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <!--type="POOLED" 使用数据库连接池,默认创建10个链接对象,减少创建销毁操作--><!--链接数据库,每次访问数据库,创建一个connection,用完关闭-->
            <!--但访问量大,每次都要创建连接对象,用完关闭,比较耗时-->
            <!--但数据库连接池:在池集合中提前创建连接对象,用时拿,用完还,不用创建销毁,省时-->
            <dataSource type="POOLED">
                <!--数据库连接配置-->
<!--driver的value里面根据自己的MySQL版本进行填写,我用的是MySQL8,其他版本导入路径请自行搜索填写。-->
                <property name="driver" value="com.mysql.cj.jdbc.Driver" />
<!--url中的127.0.0.1:3306请填写自己链接数据库时显示的链接地址,/ssmdb是本人创建admin表所属的数据库名称,请根据自己创表所在数据库及时变更,剩下部分照抄即可。-->
                <property name="url" value="jdbc:mysql://127.0.0.1:3306/ssmdb?serverTimezone=Asia/Shanghai" />
<!--请根据自己连接数据库的账户密码填写-->
                <property name="username" value="root" />
                <property name="password" value="root"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

(4)创建访问的接口,定义方法

        如图,在java文件夹中根据自己习惯创建下级文件夹,最后创建一个接口,这里我以AdminDao为例。在接口中定义方法(如下代码)

public interface AdminDao{
    Admin findAdminById(int id);
}

        创建模型类,这里示例是admin类,getter、setter类中的属性,重写toString方法

 

(5)创建sql映射文件(用于sql实现)

        在如图红框文件夹下创建mapper文件夹并创建一个Mapper.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">
<mapper namespace="接口的地址">
 <!--根据与数据库交互的具体需要填写相应标签和sql语句-->
</mapper>

        这里namespace =“接口的地址”就是上面创建AdminDao接口的类的路径,我的是com.mybatispro.dao.AdminDao,接下来我们对admin表中对应id的成员信息进行查询操作。

<?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="接口的地址">
     <!--id="接口中对应方法名" parameterType="方法传入的数据类型" resultType="项目中该类的路径"-->
    <select id="findAdminById" parameterType="int" resultType="com.mybatispro.model.Admin">
        select * from admin where id = #{id} <!--填写sql语句,#{id}表示通过发放传入sql的id信息-->
    </select> 
</mapper>

注:<select id=" ">中id名称必须和上面定义的接口中对应的方法名一致 

        #{} 是占位符,采用预编译方式向sql中传值,放置sql注入,一般传值我们选择此种方式

        这里还需要注册映射文件。打开我们创建的mybatis.xml文件,创建以下标签进行操作

<!--注册映射文件-->
    <mappers>
        <mapper resource="com.mybatispro.mapper/AdminMapper.xml"></mapper>
    </mappers>

         resource的值是项目中映射文件的路径,以后每创建一个模块的映射文件都要来这里进行注册,效果如下: 

(6)测试

        这里我创建了一个Test1的类用来测试

API 接口说明:
SqlSessionFactory 接口
使用 SqlSessionFactory 来创建 SqlSession,一旦创建 SqlSessionFactory 就
会在整个应用过程中始终存在。由于创建开销较大,所以没有理由去销毁再创建
它,一个应用运行中也不建议多次创建 SqlSessionFactory。
SqlSession 接口
Sqlsession 意味着创建与数据库链接会话,该接口中封装了对数据库操作的方
法,与数据库会话完成后关闭会话。
package com.mybatispro.test;

import com.mybatispro.dao.AdminDao;
import com.mybatispro.model.Admin;
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 Test1 {
    public static void main(String[] args) throws IOException {
        //1.mybatis读取配置文件
        Reader reader = Resources.getResourceAsReader("mybatis.xml");
        //2.创建 SqlSessionFactory,用来创建SqlSession对象(连接数据库的会话对象,类似connection)
        SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
        //3.创建SqlSession对象
        SqlSession sqlSession = sessionFactory.openSession();
        //4.创建接口代理对象(因为接口是无法创建对象的,这里只是创建的代理对象仍保持AdminDao类型而已),我的示例接口和类为 AdminDao和Admin 大家请以自己为准
        AdminDao adminDao = sqlSession.getMapper(AdminDao.class);
        //5.调用方法
        Admin admin =  adminDao.findAdminById(1);//让代理对象帮我们调用映射文件中与此接口名称相同的方法
        System.out.println(admin);
        //6.关闭会话对象
        sqlSession.close();//关闭与数据库的链接对象
    }
}

        具体代码如上,请一定认准导入接口的位置,是在Apache的ibatis包下!!!

        如下是查询结果,找到了数据库表中id为1的admin信息

        补充1:

这里推荐大家下载一个插件,可以在我们输错地址或方法名等错误时及时报错

在顶部工具栏的File项中找到setting设置,下载下图中的插件。

 

        补充2:

映射文件 <select>标签中的resultType属性的值我们是以该类在项目中的路径命名,但每次写一长串路径不仅麻烦还不美观,因此我们可以通过给类配置别名来简化操作,通过给定一次该类所在文件夹的路径,以使以后每次调用该文件夹中的类只需写出类名即可。

        在mybatis.xml文件的<configuration>标签中写入以下代码

    <!--为类配置别名-->
    <typeAliases>
        <package name="类所在包名"/>
    </typeAliases>

        自此,我们再进行有关Admin类相关的操作时,就可简化书写 

 

        补充3:

请根据下图所示,严格遵守映射文件中各属性内容与相应接口方法对应规范!

 

三、封装、参数传递

        因为mybatis读取配置文件和创建 SqlSessionFactory,用来创建SqlSession对象实际上只用执行一次即可,因此我们可以重写一个类,将这两个步骤写到一个静态代码块中,每次加载时执行一次即可。

package com.mybatispro.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 sqlSessionFactory = null;
    static {
//1.mybatis读取配置文件
        Reader reader = null;
        try {
            reader = Resources.getResourceAsReader("mybatis.xml");
        } catch (IOException e) {
            e.printStackTrace();
        }
        //2.创建 SqlSessionFactory,用来创建SqlSession对象(连接数据库的会话对象,类似connection)
        //SqlSessionFactory只需创建一个,不需要销毁
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
    }
    //获得SqlSession对象
    public static SqlSession getSqlSession(){
        return sqlSessionFactory.openSession();
    }
}

         这样我们每次测试时就可以省去测试代码中的1、2行。

 (1)单个参数传递

直接传参,接口中写出相应方法。

public class Test2 {
    public static void main(String[] args) {
        SqlSession sqlSession = MyBatisUtil.getSqlSession();
        AdminDao adminDao = sqlSession.getMapper(AdminDao.class);
        Admin admin = adminDao.findAdminAccount("admin");
        System.out.println(admin);
        sqlSession.close();
    }
}
//Admin findAdminAccount(String account);接口中的方法

(2)多个参数传递

 使用@Param(“id”)绑定参数再传递

public static void main(String[] args) {
        SqlSession sqlSession = MyBatisUtil.getSqlSession();
        AdminDao adminDao = sqlSession.getMapper(AdminDao.class);//生成接口代理对象
        adminDao.login("admin","111");
        sqlSession.close();
    }
//Admin login(@Param("acc")String account,@Param("pwd")String password);接口中方法

mapper.xml中代码 

<select id="login" resultType="Admin">
        select * from admin where account = #{acc} and password = #{pwd}
</select><!--这里#{acc}便取得是@Param绑定的数据-->

创建类传参

public static void main(String[] args) {
        SqlSession sqlSession = MyBatisUtil.getSqlSession();
        AdminDao adminDao = sqlSession.getMapper(AdminDao.class);//生成接口代理对象
        Admin admin1 = new Admin();
        admin1.setAccount("admin");
        admin1.setPassword("111");
        adminDao.login1(admin1);
        sqlSession.close();//关闭连接对象,如果使用数据库连接池功能,本质上是还给连接池
    }
//Admin login1(Admin admin);接口中方法

 mapper.xml中代码 

    <select id="login1" parameterType="Admin" resultType="Admin">
                select * from admin where account = #{account} and password = #{password}
    </select><!--这里#{account}便取得是admin类中的数据-->

(3)返回多个结果

这里我们就需要List来进行存储了

public static void main(String[] args) {
        SqlSession sqlSession = MyBatisUtil.getSqlSession();
        AdminDao adminDao = sqlSession.getMapper(AdminDao.class);
        List<Admin> admins = adminDao.findAdmin();
        sqlSession.close();
    }
//List<Admin> findAdmins(@Param("orderColumn") String orderColumn);接口中的方法

 mapper.xml中代码 

    <select id="findAdmins" resultType="Admin" parameterType="string">
        select ${orderColumn} from admin order by ${orderColumn} desc
    </select>

这里我们注意到sql中属性名不再用#{},而是${}

#{} ${} 区别:
        #{} 占位符,是经过预编译的,编译好 SQL 语句再取值,#方式能够防止 sql 注入
        #{}:delete from admin where id=#{id}
                结果: delete from admin where id = ?
        ${}会将将值以字符串形式拼接到 sql 语句, ${ }方式无法防止 Sql 注入
        ${}: delete from admin where id=’${id}’
                结果: delete from admin where id=’1’
一般是#{ } 向 sql 传值使用, 而使用${ }向 sql 传列名
例如在 order by $ {column} 语句后面可以动态替换列名, select后的列名也可以改变 

        以上就是对mybatis框架的搭建和初步认识,接下来我将会分享更多有关mybatis框架的内容,敬请期待吧!

猜你喜欢

转载自blog.csdn.net/2301_78341216/article/details/141533465