简单粗暴JavaWeb-第六篇:使用mybatis框架代替纯jdbc访问数据库

本文介绍了如何通过MyBatis简化SQL操作,包括配置MyBatis环境、编写SQL语句及进行单元测试的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前面说到为了方便,一些sql语句采用了硬编码,但是这种方式在工程逐渐变大的情况下很不方便,我就打算尽量用些变量来替换硬编码。写了两个方法来产生insert语句和select语句,如下:

1、纯jdbc下的插入、选择语句

public String genInsertSql(String table, Map<String,String> maps){
    StringBuilder keys = new StringBuilder();
    StringBuilder values = new StringBuilder();
    for (String key:maps.keySet()){
        keys.append(key+",");
        values.append("\'"+maps.get(key)+"\'"+",");
    }
    String keyStr = keys.substring(0,keys.length()-1);
    String valueStr = values.substring(0,values.length()-1);

    StringBuilder sql = new StringBuilder()
            .append("insert into ")
            .append(table)
            .append(" (")
            .append(keyStr)
            .append(") values (")
            .append(valueStr)
            .append(");");
    return sql.toString();
}
public String genSelectSql(String database, Set<String> colSets, Map<String,String> valueMaps){

    StringBuilder colSetsStrBuild = new StringBuilder();
    for (String str:colSets){
        System.out.println(str);
        colSetsStrBuild.append(str)
                .append(",");
    }
    String colSetsStr = colSetsStrBuild.substring(0,colSetsStrBuild.length()-1);

    StringBuilder valueMapsStrBuild = new StringBuilder();
    for (String key:valueMaps.keySet()){
        System.out.println(key);
        valueMapsStrBuild.append(key+"=\'"+valueMaps.get(key)+"\' and ");
    }
    String valueMapsStr = valueMapsStrBuild.substring(0,valueMapsStrBuild.length()-5);

    StringBuilder sql = new StringBuilder()
            .append("select ")
            .append(colSetsStr)
            .append(" from ")
            .append(database)
            .append(" where ")
            .append(valueMapsStr)
            .append(";");
    return sql.toString();
}

看起来就很复杂就很头疼,因而我写完之后就打算上mybatis了,所以,以上代码完全不用看。

2、配置mybatis

2.1 在pom中引入mybatis和mybatis-spring包

如下

<!--myBatis-->
<!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis-spring</artifactId>
  <version>1.3.0</version>
</dependency>
<dependency>
  <groupId>org.mybatis</groupId>
  <artifactId>mybatis</artifactId>
  <version>3.2.3</version>
</dependency>

由于之前我们已经引入了jdbc链接mysql的包,就不用引入了。

2.2 配置mybatis-config.xml文件

上一步配置maven依赖,更新后会惊奇的发现,在resource文件夹下已经帮我们建立了一个mybatis-config.xml文件,是mybatis的配置文件,配置内容如下

<?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.jdbc.Driver" />
                <property name="url" value="jdbc:mysql://localhost:3306/ahellospringmvcdemodb" />
                <property name="username" value="root" />
                <property name="password" value="123" />
            </dataSource>
        </environment>
    </environments>
</configuration>

2.3 设置一个数据库model类

在mybatis中,对应一张数据表的列信息,我们可以建立一个相应的model类进行匹配,比如表tbl_user_info


那么我们建立一个相应的model类,叫做UserInfo


代码如下

package HelloSpringMvc.model;

/**
 * Created by yuhan.shen on 2017/11/3.
 */
public class UserInfo {

    private Integer id;

    private String userName;

    private String password;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}
其实就是一个pojo方法

2.4 我们配置一下mapper方法,并编写sql语句

最能体现mybatis便捷性的地方就是这里!

我们可以在之前自动建立的mybatis文件夹中建立一个mapper文件夹,用来放我们要写的mapper文件


内容如下:

<?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="UserInfoMapper">
    <resultMap id="UserInfoMap" type="HelloSpringMvc.model.UserInfo">
        <result column="id" property="id" jdbcType="BIGINT" />
        <result column="user_name" property="userName" jdbcType="VARCHAR" />
        <result column="id" property="id" jdbcType="VARCHAR" />
    </resultMap>


    <select id="selectUserByID" resultMap="UserInfoMap">
        select * from tbl_user_info where id = '1'
    </select>
</mapper>

重点是一定要将resultMap与type对应起来,最后,我们将此mapper在mybatis-config.xml进行一下声明,在mybatis-config.xml文件中加上以下代码

<mappers>
    <mapper resource="mybatis/mapper/UserInfo.xml"/>
</mappers>

经过以上几个步骤,我们就可以进行一下测试了,写一个测试类,如下

import HelloSpringMvc.model.UserInfo;
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 org.junit.Test;
import java.io.IOException;
import java.io.Reader;

/**
 * Created by yuhan.shen on 2017/11/3.
 */
public class TestUserInfo {

    /**
     * SqlSessionFactory是用来创建SqlSession的工厂,SqlSession会执行映射的语句,进行事物提交、回滚等。
     * @return
     */
    public SqlSessionFactory getSqlSessionFactory() {
        Reader reader = null;
        SqlSessionFactory sqlSessionFactory = null;
        try {
            reader = Resources.getResourceAsReader("mybatis/mybatis-config.xml");
            sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return sqlSessionFactory;
    }

    @Test
    public void selectTest(){
        SqlSession session = getSqlSessionFactory().openSession();
        try {
            UserInfo userInfo = (UserInfo) session .selectOne("UserInfoMapper.selectUserByID");
            System.out.println(userInfo.getPassword());
        } finally {
            session.close();
        }
    }
}

执行Test单元测试,就能得到结果。

其实,我们可以将session相关方法封装起来,使得自己要写的持久层代码(dao)层进一步简化,这种方式比jdbc简单很多,最重要的是不用去拼装sql啊!



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值