mybatis基于传统dao的开发方式

第一步:开发接口
public interface UserDao {
public User getUserById(int id) throws Exception;
public void insertUser(User user) throws Exception;
}
第二步:设置实现类
public class UserDaoImpl implements UserDao {
private SqlSessionFactory sqlSessionFactory;
public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
}
public UserDaoImpl() {
super();
}
@Override
public User getUserById(int id) throws Exception {
//获取sqlSession,需要使用sqlSessionFactory
SqlSession session = sqlSessionFactory.openSession();
try {
User user = session.selectOne("selectUserById", id);
return user;
} finally{
session.close();
}
}
@Override
public void insertUser(User user) throws Exception {
//获取sqlSession,需要使用sqlSessionFactory
SqlSession session = sqlSessionFactory.openSession();
try {
session.insert("insertUser", user);
session.commit();
} finally{
session.close();
}
}
}
第三步:设置对应的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="mybatis.mapper.UserMapper">
<!-- 根据id获取用户信息 -->
<select id="selectUserById" parameterType="int" resultType="user">
select * from user where id = #{id}
</select> <!-- 向数据库插入一条数据 -->
<insert id="insertUser" parameterType="user">
<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> </mapper>
加载mapper文件
<?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> <!-- 这个environments定义了我们的数据库的连接操作 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- 通过mappers来指定加载我们对应的mapper文件 -->
<mappers>
<mapper resource="UserMapper.xml"/>
</mappers>
</configuration>
第五步:编写测试案例
public class UserDaoTest {

    private SqlSessionFactory getSqlSessionFactory() throws IOException {
String resource = "mybatis-config.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
return sqlSessionFactory;
} @Test
public void testGetUserById() throws Exception {
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
UserDao userDao = new UserDaoImpl(sqlSessionFactory);
User user = userDao.getUserById(1);
System.out.println(user);
} @Test
public void testInsertUser() throws Exception {
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
UserDao userDao = new UserDaoImpl(sqlSessionFactory);
User user = new User();
user.setUsername("安茱莉");
user.setSex("0");
user.setAddress("好莱坞38号");
userDao.insertUser(user);
}
}

存在的问题

  • Dao方法体存在重复代码:通过SqlSessionFactory创建SqlSession,调用SqlSession的数据库操作方法
  • 调用sqlSession的数据库操作方法需要指定statement的id,这里存在硬编码,不得于开发维护。


通过接口代理的方式来开发dao

官方重点推荐这种方式

开发规范:

Mapper接口开发方法只需要编写Mapper接口(相当于Dao接口),由Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同上边Dao接口实现类方法。

Mapper接口开发需要遵循以下规范:

1、 Mapper.xml文件中的namespace与mapper接口的类路径相同。 
2、 Mapper接口方法名和Mapper.xml中定义的每个statement的id相同 
3、 Mapper接口方法的输入参数类型和mapper.xml中定义的每个sql 的parameterType的类型相同 
4、 Mapper接口方法的输出参数类型和mapper.xml中定义的每个sql的resultType的类型相同

第一步:定义接口
public interface UserMapper {
// 根据id查找用户
public User findUserById(int id) throws Exception; // 插入用户信息
public void insertUser(User user) throws Exception;
}
第二步:定义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="mybatis.mapper.UserMapper">
<!-- 根据id获取用户信息 -->
<select id="findUserById" parameterType="int" resultType="user">
select * from user where id = #{id}
</select> <!-- 向数据库插入一条数据 -->
<insert id="insertUser" parameterType="user">
insert into user(username,birthday,sex,address)
values(#{username},#{birthday},#{sex},#{address})
</insert>
</mapper>
第三步:加载mapper文件
<?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> <!-- 别名的配置 -->
<typeAliases>
<!-- 不区分大小写的 -->
<!-- <typeAlias type="domain.User" alias="user"/> -->
<!-- 扫描这个包下面的所有类,起别名,也是不区分大小写的 ,名字是类名不带包,推荐这种方式-->
<package name="domain"/>
</typeAliases> <!-- 加载外部配置文件 -->
<properties resource="db.properties">
</properties> <!-- 这个environments定义了我们的数据库的连接操作 -->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments> <!-- 通过mappers来指定加载我们对应的mapper文件 -->
<!-- 此种方法要求mapper接口名称和mapper映射文件名称相同,且放在同一个目录中。 -->
<mappers>
<mapper resource="mapper.xml"/>
<!-- <mapper class="mybatis.mapper.UserMapper"/> -->
<!-- 加载包下所有mapper接口,要求接口名称和mapper映射文件名称相同,且放在同一个目录中。 -->
<package name="mybatis.mapper"/>
</mappers>
</configuration>
第四步:开发测试代码
public class UserMapperTest {

    /**
* 通过接口代理开发dao层的测试
* 调用getUserById方法,传递id参数
* 输出user对象到控制台
*/
@Test
public void findUserByIdTest() throws Exception{
SqlSessionFactory sqlSessionFactory = getSqlSessionFactory();
SqlSession sqlSession = sqlSessionFactory.openSession(true);
//mybatis会产生一个代理对象
UserMapper mapper = sqlSession.getMapper(UserMapper.class); User user = mapper.getUserById(2);
System.out.println(user);
sqlSession.close();
} ... /**
* 抽取方法,保证项目中SQLSessionFactory的单例
*/
private SqlSessionFactory getSqlSessionFactory() throws IOException {
InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
return sqlSessionFactory;
}
}

补充:mybatis默认支持的别名:

别名 映射的类型
_byte byte
_long long
_short short
_int int
_integer int
_double double
_float float
_boolean boolean
string String
byte Byte
long Long
short Short
int Integer
integer Integer
double Double
float Float
boolean Boolean
date Date
decimal BigDecimal
bigdecimal BigDecimal
map Map

mybatis开发dao的方式的更多相关文章

  1. MyBatis开发Dao层的两种方式(原始Dao层开发)

    本文将介绍使用框架mybatis开发原始Dao层来对一个对数据库进行增删改查的案例. Mapper动态代理开发Dao层请阅读我的下一篇博客:MyBatis开发Dao层的两种方式(Mapper动态代理方 ...

  2. MyBatis开发Dao层的两种方式(Mapper动态代理方式)

    MyBatis开发原始Dao层请阅读我的上一篇博客:MyBatis开发Dao层的两种方式(原始Dao层开发) 接上一篇博客继续介绍MyBatis开发Dao层的第二种方式:Mapper动态代理方式 Ma ...

  3. MyBatis学习--mybatis开发dao的方法

    简介 使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法. 主要概念介绍: MyBatis中进行Dao开发时候有几个重要的类,它们是SqlSessionFac ...

  4. 四 mybatis开发dao的方法

    mybatis开发dao的方法 1.1     SqlSession使用范围 1.1.1     SqlSessionFactoryBuilder //以流的方式读取总的配置文件 Reader rea ...

  5. MyBatis开发Dao的原始Dao开发和Mapper动态代理开发

    目录 咳咳...初学者看文字(Mapper接口开发四个规范)属实有点费劲,博主我就废了点劲做了如下图,方便理解: 原始Dao开发方式 1. 编写映射文件 3.编写Dao实现类 4.编写Dao测试 Ma ...

  6. MyBatis开发Dao

    MyBatis开发Dao有两种方法: 1.原始Dao开发方法,就是程序需要编写Dao的接口和Dao的实现类. 2.MyBatis的mapper接口(相当于Dao接口)代理开发方法.(更重要) ---- ...

  7. 使用mybatis开发dao问题总结

    代码片段: @Override public User getUserById(Integer id) { SqlSession sqlSession = sqlSessionFactory.open ...

  8. 使用mybatis开发dao方法

    使用mybatis开发dao的时候, 主要涉及到SqlSessionFactoryBuilder.SqlSessionFactory.SqlSession 这三个类 现在将这三个类的使用方法简单的说下 ...

  9. Mybatis使用Dao代码方式CURD

    Mybatis 使用Dao代码方式进行增.删.改.查. 1.Maven的pom.xml <project xmlns="http://maven.apache.org/POM/4.0. ...

随机推荐

  1. mysql 表的分区

    如何判断当前MySQL是否支持分区 命令:show variables like '%partition%' 运行结果: mysql> show variables like '%partiti ...

  2. sharepoint_study_5

    描述:手动进行SharePoint网页调试图解 解决: 第一步:打开页面的后台代码,设置断点 第二步:添加到进程 第三步:选择SharePoint进程,我这里都选了,如果你知道要调试的页面是哪一个进程 ...

  3. Covering(矩阵快速幂)

    Bob's school has a big playground, boys and girls always play games here after school.  To protect b ...

  4. CF F - Tree with Maximum Cost (树形DP)给出你一颗带点权的树,dist(i, j)的值为节点i到j的距离乘上节点j的权值,让你任意找一个节点v,使得dist(v, i) (1 < i < n)的和最大。输出最大的值。

    题目意思: 给出你一颗带点权的树,dist(i, j)的值为节点i到j的距离乘上节点j的权值,让你任意找一个节点v,使得dist(v, i) (1 < i < n)的和最大.输出最大的值. ...

  5. PIE SDK图片元素的绘制

    1. 功能简介 在数据的处理中会用到图片元素的绘制,利用IPictureElement图片元素接口进行绘制,目前PIE SDK支持IPictureElement元素接口的绘制,下面对图片元素的绘制进行 ...

  6. 通过Qt从URL下载文件

    示例1: 通过Qt自带的例子学习,位置:[安装盘符]:\Qt\Qt5.1.1\5.1.1\Src\qtbase\examples\network\download   示例2: 通过Qt的文档,位置: ...

  7. pandas中,dataframe 进行数据合并-pd.concat()

    ``# 通过数据框列向(左右)合并 a = pd.DataFrame(X_train) b = pd.DataFrame(y_train) # 合并数据框(合并前需要将数据设置成DataFrame格式 ...

  8. ORACLE--12C--多租户体系架构概念

    一,概念 1,何为多租户? 官网链接: 飞机直达>> 多租户这个概念并不是12C的新特性,而是体系架构,多租户架构使得oracle 数据库成为了一个多租户的容器数据库,也就是contain ...

  9. Ace向你推荐一些实用的干货库~开发安卓的好帮手

    1 毁灭地球的军火库arsenal- 你想要的枪这里都有卖 哈哈哈哈 , http://android-arsenal.com/ 2 黑科技---在线反编译----嘿嘿嘿  在线反编译 方便简单 客官 ...

  10. Linux 上安装 weblogic12C (静默安装) (一)

    最近负责在linux上安装weblogic,客户说要安装最新的版本,版本号为 12.1.X(12.1.2,12.1.3).开始以为和旧版安装一样,使用控制台的方式,下载bin文件,然后一步步在cons ...