mybatis开发dao的方式
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的方式的更多相关文章
- MyBatis开发Dao层的两种方式(原始Dao层开发)
本文将介绍使用框架mybatis开发原始Dao层来对一个对数据库进行增删改查的案例. Mapper动态代理开发Dao层请阅读我的下一篇博客:MyBatis开发Dao层的两种方式(Mapper动态代理方 ...
- MyBatis开发Dao层的两种方式(Mapper动态代理方式)
MyBatis开发原始Dao层请阅读我的上一篇博客:MyBatis开发Dao层的两种方式(原始Dao层开发) 接上一篇博客继续介绍MyBatis开发Dao层的第二种方式:Mapper动态代理方式 Ma ...
- MyBatis学习--mybatis开发dao的方法
简介 使用Mybatis开发Dao,通常有两个方法,即原始Dao开发方法和Mapper接口开发方法. 主要概念介绍: MyBatis中进行Dao开发时候有几个重要的类,它们是SqlSessionFac ...
- 四 mybatis开发dao的方法
mybatis开发dao的方法 1.1 SqlSession使用范围 1.1.1 SqlSessionFactoryBuilder //以流的方式读取总的配置文件 Reader rea ...
- MyBatis开发Dao的原始Dao开发和Mapper动态代理开发
目录 咳咳...初学者看文字(Mapper接口开发四个规范)属实有点费劲,博主我就废了点劲做了如下图,方便理解: 原始Dao开发方式 1. 编写映射文件 3.编写Dao实现类 4.编写Dao测试 Ma ...
- MyBatis开发Dao
MyBatis开发Dao有两种方法: 1.原始Dao开发方法,就是程序需要编写Dao的接口和Dao的实现类. 2.MyBatis的mapper接口(相当于Dao接口)代理开发方法.(更重要) ---- ...
- 使用mybatis开发dao问题总结
代码片段: @Override public User getUserById(Integer id) { SqlSession sqlSession = sqlSessionFactory.open ...
- 使用mybatis开发dao方法
使用mybatis开发dao的时候, 主要涉及到SqlSessionFactoryBuilder.SqlSessionFactory.SqlSession 这三个类 现在将这三个类的使用方法简单的说下 ...
- Mybatis使用Dao代码方式CURD
Mybatis 使用Dao代码方式进行增.删.改.查. 1.Maven的pom.xml <project xmlns="http://maven.apache.org/POM/4.0. ...
随机推荐
- mfix mpi并行死锁问题探究
目前还没找到具体原因,只能先记录一下.(问题原因找到了) 分别用ubuntu14.04和ubuntu16.04测试,用的是笔记本,笔记本为双核四线程,用2线程并行计算:发现ubuntu16.04会在0 ...
- docker image rm ubuntu 失败
[root@hadoop14 ~]# docker image rm ubuntu Failed to remove image (ubuntu:v2): Error response from da ...
- 【算法笔记】B1030 完美数列(三种方法)
1030 完美数列 (25 分) 给定一个正整数数列,和正整数 p,设这个数列中的最大值是 M,最小值是 m,如果 M≤mp,则称这个数列是完美数列. 现在给定参数 p 和一些正整数,请你从中选择尽可 ...
- HDU - 2276 位运算矩阵快速幂
挺有意思的一道题 要会运用一些常见的位运算操作进行优化 题目的本质就是要求下面的式子 \(dp[i][j+1]=(dp[i-1][j]+dp[i][j]) \mod 2\) (第\(i\)个字符在\( ...
- 启用和禁用TCPIP上的Netbios
'设置传输值1是启用,设置2为禁用 On Error Resume Next strComputer = "." Set objWMIService = GetObject(&qu ...
- 有用的 Angular CLI 命令参数
这是一些有用的 Angular 5 CLI 命令参数,注意参数前面的-和--的不同... 1. 指定build的输出为production version,合并优化css and js files. ...
- vim的多窗口功能与环境参数设置
Vim的多窗口功能 多窗口情况下按键功能 :sp [filename] 打开一个新的窗口,如果有加filename,表示在新窗口打开一个新文件,否则表示两个窗口为同一文件内容 :[ctrl]+w+j( ...
- PIE SDK图层属性
1. 功能简介 通过查看图层属性可以对图层的基本信息(一般信息,来源,注释,字段信息等)有所了解 ,下面就基于PIE SDK,介绍查看图层属性功能的实现. 2. 功能实现说明 2.1. 实现思路及原理 ...
- 启动Kafka
启动zookeeper 使用命令查看zookeeper是否启动成功: 启动kafka Brokerr 使用命令查看kafka Broker是否启动更成功 在kafka中创建topic 'test' b ...
- Linux下jenkins改端口、解决内存溢出、版本升级
1.新版本的jenkins修改端口新版本jenkins的配置文件在/etc/sysconfig/jenkinsvi /etc/sysconfig/jenkins找到JENKINS_PORT=" ...