生产环境需要注意的问题2—dao,mapper接口真的需要我们写吗

为了说明, dao,mapper接口到底是否必需的,我们通过例子来说明。

一、Bee入门实例

只需在bee.properties里配置了DB相关的url,用户名,密码,
再用一句语句,就可得到对象。

1.

2.Java代码

SuidRich suidRich=BeeFactoryHelper.getSuidRich();
Orders orders=suidRich.selectById(new Orders(), 100001);
Logger.info(orders.toString());//打印

3. 导入jar或用maven,生成javabean,这些几种ORM都是需要的。

关键是Bee还提供了简单易用的生成Javabean工具;不需要xml配置, Javabean不需要注解

再看下以下的例子对比,就知道以前的程序员是多累,现在的程序员,是多么的幸福!

想多些时间做核心业务,在CRUD中解放出来,Bee是你最好的选择。

 二、Mybatis入门例子

4、于resources文件夹中创建SqlMapConfig.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>
    <!-- 和spring整合后 environments配置将废除 -->
    <environments default="development">
        <environment id="development">
            <!-- 使用jdbc事务管理 -->
            <transactionManager type="JDBC" />
            <!-- 数据库连接池 -->
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver" />
                <property name="url"
                          value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" />
                <property name="username" value="root" />
                <property name="password" value="" />
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <!-- 第一种方式,加载 resource-->
        <mapper resource="User.xml"></mapper>
        <mapper resource="UserMapper.xml"/>

        <!-- 第三种方式,包扫描器要求(推荐使用此方式):
             1、映射文件与接口同一目录下
             2、映射文件名必需与接口文件名称一致
        -->
        <!--<package name="com.cenobitor.mapper"/>-->
    </mappers>
</configuration>

6.配置SQL查询的映射文件(resources目录)

<?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">
<!-- namespace:命名空间,类似于java包,主要用于隔离sql语句的,后续有重要作用
     #{}:占位符,相当于jdbc的?
     ${}:字符串拼接指令,注意如果入参为普通数据类型时,括号里面只能写value
 -->
<mapper namespace="user">
    <!-- id:sql id标识sql语句的唯一标识
             parameterType:入参的数据类型
             resultType:返回结果的数据类型
    -->
    <select id="getUserById" parameterType="int" resultType="com.cenobitor.pojo.User">
        SELECT
          `id`,
          `username`,
          `birthday`,
          `sex`,
          `address`
        FROM `user`
        WHERE id = #{id}
    </select>

    <!-- resultType:如果返回结果是集合时,只需要设置为元素的数据类型就可 -->
    <select id="getUserByName" parameterType="String" resultType="com.cenobitor.pojo.User">
        SELECT
          `id`,
          `username`,
          `birthday`,
          `sex`,
          `address`
        FROM `user`
        WHERE username LIKE '%${value}%'
    </select>

    <insert id="insertUser" parameterType="com.cenobitor.pojo.User">
        INSERT INTO USER (`username`,`birthday`,`sex`,`address`)
        VALUES (#{username},#{birthday},#{sex},#{address})
    </insert>

    <!--返回MySql自增主键-->
    <!-- useGeneratedKeys:标识插入使用自增id
         keyProperty:与useGeneratedKeys配套使用,用于绑定主键接收的pojo属性
     -->
    <insert id="insertUserKey" parameterType="com.cenobitor.pojo.User"
            useGeneratedKeys="true" keyProperty="id">

        <!-- selectKey:用于配置主键返回
                      keyProperty:要绑定的pojo属性
                      resultType:属性数据类型
                      order:指定什么时候执行,AFTER之后
                 -->
        <!-- <selectKey keyProperty="id" resultType="int" order="AFTER">
             SELECT LAST_INSERT_ID()
        </selectKey> -->

        INSERT INTO USER (`username`,`birthday`,`sex`,`address`)
        VALUES (#{username},#{birthday},#{sex},#{address})
    </insert>

    <!--返回MySql的uuid返回主键-->
    <insert id="insertUserUUID" parameterType="com.cenobitor.pojo.User">

        <!-- selectKey:用于配置主键返回
                      keyProperty:要绑定的pojo属性
                      resultType:属性数据类型
                      order:指定什么时候执行,AFTER之后
                 -->
        <selectKey keyProperty="uuid" resultType="String" order="BEFORE">
             SELECT UUID()
        </selectKey>

        INSERT INTO USER (`username`,`birthday`,`sex`,`address`,`uuid`)
        VALUES (#{username},#{birthday},#{sex},#{address},#{uuid})
    </insert>

    <update id="updateUser" parameterType="com.cenobitor.pojo.User">
        UPDATE USER SET username = #{username} WHERE id = #{id}
    </update>

    <delete id="deleteUser" parameterType="com.cenobitor.pojo.User">
        DELETE FROM `user` WHERE `id` = #{id}
    </delete>

</mapper>

7.加载映射文件,在SqlMapConfig.xml配置mappers节点

8.使用例子

package com.cenobitor;

import com.cenobitor.Utils.SqlSessionFactoryUtils;
import com.cenobitor.pojo.User;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
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;
import java.util.Date;
import java.util.List;

/**
 * Unit test for simple App.
 */
public class AppTest extends TestCase {
    //根据id查找用户
    public void testGetUserById() throws IOException {

        //创建SqlSessionFactoryBuilder对象
        SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder();
        //查找配置文件,创建输入流
        InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
        //加载配置文件,创建SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = sfb.build(inputStream);
        //创建SqlSession
        SqlSession sqlSession = sqlSessionFactory.openSession();
        //执行查询,参数一:要查询的statementId,参数二:sql语句入参
        User user = sqlSession.selectOne("user.getUserById", 1);
        //输入查询结果
        System.out.println(user);

        //释放资源
        sqlSession.close();
    }

    //根据用户名查找用户列表
    public void testGetUserByName(){
        SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtils.getSqlSessionFactory();
        SqlSession sqlSession = sqlSessionFactory.openSession();
        List<User> list = sqlSession.selectList("user.getUserByName", "张");
        for (User user : list) {
            System.out.println(user);
        }

        sqlSession.close();
    }


...

}

9、抽取SqlSessionFactoryUtils工具类,共享SqlSessionFactory的对象

public class SqlSessionFactoryUtils {
    private SqlSessionFactoryUtils(){}

    private static class SqlSessionFactoryInstance{

        public static SqlSessionFactory sqlSessionFactory;

        static {
            try {
                sqlSessionFactory =  new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("SqlMapConfig.xml"));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

    public static SqlSessionFactory getSqlSessionFactory(){
        return SqlSessionFactoryInstance.sqlSessionFactory;
    }

}

参考:https://www.cnblogs.com/gdwkong/p/8734020.html

Mybatis需要

User.xml   

UserMapper.xml

UserMapper接口

三、下面,我们来作一个对比。

以操作一个User表为例.


Bee需要的文件

orm\compare\bee\service\BeeUserService.java

Mybatis需要的文件(对一个表的操作,就会比Bee多三个dao相关文件)
orm\compare\mybatis\service\MybatisUserService.java

orm\compare\mybatis\dao\UserDao.java
orm\compare\mybatis\dao\UserMapper.java 
orm\compare\mybatis\dao\impl\UserDaoImpl.java

公共都需要的有,Javabean和Service接口:
User.java
UserService.java

用Bee无需用户再写Dao代码,一个表少三个Dao,Mapper文件,100个表就少300个Dao文件.

通过例子, 可以看到 dao,mapper接口不是必需的,  只是某些框架为了收集与ORM有关的信息,在使用该框架时,需要我们提供的。    但我们可以有更优美的编程方程,    我们是可以不写这些看似类似的东西的。

制造业要升级,  编程方式也需要升级!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值