MyBatis连接数据库实现增删改查

一、MyBatis简介

MyBatis是一种基于SQL语法的开源项目,它能够将SQL语句封装在配置文件中,便于统一的管理和维护,能够降低代码的耦合度,且方便的代码调试。下面直接进入MyBatis的环境搭建。

二、MyBatis环境搭建

打开idea后,首先要配置jar文件,我们所需要的jar文件有如下几个,将其添加到Modules中的Dependencies中。添加完后不要忘记将Problems的提示Fix掉。
在这里插入图片描述
添加完jar文件,再把Tomcat配置一下。
在这里插入图片描述
配置完成后下面进入文件的配置。

三、配置Mybatis文件

首先建两个文件夹,一个是resources,将其类型设置成Resources,里面放一些配置文件;另一个是test文件夹,将其类型设置成Tests,里面放一些测试类。如图所示,在Modules中设置。

在这里插入图片描述
在resources文件夹中需要建三个文件,一个是db.propertites,里面是连接数据库的地址和用户名密码,和jdbc的数据库配置文件一样(这里可以不进行配置,可以在mybatis文件夹中配置也是可以的);一个是log4j.properties文件,用于保存日志;还有一个是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>
    <properties resource="db.properties">
    </properties>
    <settings>
        <setting name="logImpl" value="LOG4J"/>
    </settings>
    <typeAliases>
        <typeAlias type="cn.kgc.entity.Provider" alias="provider"/>
        <typeAlias type="cn.kgc.entity.User" alias="user"/>
    </typeAliases>
    <environments default="dev">
    <environment id="dev">
        <transactionManager type="JDBC"></transactionManager>
        <dataSource type="POOLED">
            <property name="driver" value="${driver}"/>
            <property name="url" value="${url}"/>
            <property name="username" value="${user}"/>
            <property name="password" value="${pwd}"/>
        </dataSource>
    </environment>
</environments>
<mappers>
    <mapper resource="cn/kgc/dao/ProviderMapper.xml"/>
    <mapper resource="cn/kgc/dao/UserMapper.xml"/>
</mappers>
</configuration>

xml头基本上都是一致的;
properties里放置的是数据库配置文件;
settings中设置的是log4j日志;
typeAliases中是取别名,便于后面导入类名的时候提供方便;
environment中前四行都是一致的,下面的数据库配置中name的参数是固定的,value的值与db.properties保持一致;
mappers中是引入的DAO层-SQL层的映射文件,这个文件要在会放在dao层进行配置,下面会提到映射文件的配置。
这样MyBatis配置文件就设置ok了。

四、实现DAO层与SQL层连接

在src文件夹中新建UserMapper接口和UserMapper.xml文件放在dao文件中;UserMapper接口中放要实现的功能方法,这里直接上较为复杂的多个参数的方法;
我们先从UserMapper.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">

这个文件头和mybatis.xml不同之处是将mybatis.xml中的config及configuration替换成mapper;

<!--namespace指定关联的接口-->
<mapper namespace="cn.kgc.dao.UserMapper">
    <select id="getUserCNT" resultType="int">
    <!--id对应接口的方法名-->
    select count(1) from tb_user_info;
</select>
</mapper>

下面重点提两个比较复杂的;
一个是带有两个相同数据类型的参数的方法;
下面这个是.xml文件中的语句:

<select id="queryUserByNameAndPwd" resultType="user" parameterType="java.lang.String">
    select * from tb_user_info where uname=#{name} and password=#{pwd};
</select>

这里的id是UserMapper中的方法名,resultType是之前使用typeAliases取的别名就等于是 cn.kgc.dao.UserMapper,paramterType是参数的类型;
下面是UserMapper中的方法名:

User queryUserByNameAndPwd(@Param("name") String name,@Param("pwd") String pwd);

由于方法的参数是两个String类型,所以参数必须要用@Param注解来声明参数,然后sql语句的引用要用#{}的形式;
还有一个是不同数据类型参数的方法;
下面这个是.xml文件中的语句:

<select id="queryTest" resultType="user" parameterMap="idAndName">
select * from tb_user_info where uname=#{name} and uid=#{id};
</select>
<parameterMap id="idAndName" type="Object">
    <parameter property="id" javaType="int"/>
    <parameter property="name" javaType="string"/>
</parameterMap>

下面是UserMapper中的方法名:

User queryTest(@Param("name") String name,@Param("id") int id);

不同参数类型,.xml文件中要用parameterMap来取一个数据类型的别名,然后在对此进行分别设置,type类型选择Object;

五、测试类Test

在进行使用Junit进行测试之前,为了防止代码的耦合,为mybatis中读取配置文件创建SqlSession对象的方便调用,这里直接采用提取方法的方式;先建一个util包,里面建一个工具类MapperConfig类;

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.InputStream;
public class MapperConfig {
    private static SqlSessionFactory factory;
    static {
        SqlSessionFactoryBuilder builder=new SqlSessionFactoryBuilder();
        try {
            InputStream is= Resources.getResourceAsStream("mybatis-cfg.xml");
            factory=builder.build(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static SqlSession getSession(){
        //非事务情况下,开启自动提交
        return  factory.openSession(true);
    }
    public static void closeSession(SqlSession session){
        if(session!=null){
            session.close();
        }
    }
}

为了防止多个线程同时对系统同时操作,这里采用单例模式,使用静态代码块来创建工厂;
每一个类的导入要正确
主要有两个方法:一个是获取SqlSession的session对象,还有一个就是关闭session;
接下来就可以直接使用Junit进行测试:

import cn.kgc.entity.User;
import cn.kgc.util.MapperConfig;
import org.apache.ibatis.session.SqlSession;
import org.apache.log4j.Logger;
import org.junit.Test;
import java.io.IOException;
public class UserMapperTest {
    Logger logger=Logger.getLogger(UserMapperTest.class);
@Test
public void queryUserByNameAndPwd() {
    SqlSession session=MapperConfig.getSession();
    User user=session.getMapper(UserMapper.class).queryUserByNameAndPwd("admin","admin");
    logger.info(user);
    MapperConfig.closeSession(session);
}
}

这里面使用Logger来打印信息,同时保存日志;

六、结束语

这里只走了一遍流程,只实现了一个简单的查询功能,下面的增删改应该都难不倒小伙伴们吧;后面搭配上Tomcat与web进行连接和使用jdbc连接基本一致,这里就不多做介绍,相信你们jdbc已经练习的滚瓜烂熟了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章