为了说明, 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有关的信息,在使用该框架时,需要我们提供的。 但我们可以有更优美的编程方程, 我们是可以不写这些看似类似的东西的。
制造业要升级, 编程方式也需要升级!