使用mybatis开发Dao的原始方法,实现根据用户id查询一个用户信息 、根据用户名称模糊查询用户信息列表 、添加用户信息等功能
1.需求
将下边的功能实现Dao:
根据用户id查询一个用户信息
根据用户名称模糊查询用户信息列表
添加用户信息
2. 原始Dao开发方法需要程序员编写Dao接口和Dao实现类
3.User.xml映射文件的内容为:
<?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:命名空间,做Sql隔离 -->
<!-- 在mapper标签中要写很多sql语句。在开发项目的过程中有很多人都会写Sql
语句,在最后整合的时候可能会重复。现在我们使用命名空间开进行隔离,比如zhangsan
写的select * from user,我们可以写为:zhangsan:select * from user来进行标识。 -->
<mapper namespace="test">
<!-- id:sql语句的唯一标识 test:findUserById就可以唯一标识sql语句
paremeterType:指定传入的参数类型
resultSetType:返回值结果类型
#{}占位符:起到占位的左永刚,如果传入的基本类型{String,long,double,int boolean等},那么
#{}中的变量名称可以随意写。
-->
<select id="findUserById" parameterType="java.lang.Integer" resultType="com.huida.po.User">
<!-- select语句返回的是user对象,所以resultType中写User类的全路径 -->
select * from user where id=#{id}
</select> <!-- 模糊查询
返回结果可能为集合;如果返回结果为集合,调用selectList(),并且返回类型配置集合中的泛型。集合中存放的就是User,所以返回类型就是User类型
${}拼接符:字符串原样拼接。如果传入的基本类型{String,long,double,int boolean等},那么
${}中的变量名必须是value.
-->
<select id="findUserByUsername" parameterType="java.lang.String" resultType="com.huida.po.User">
<!-- 模糊查询的占位符需要进行拼接 -->
select * from user where username like "%${value}%"
</select> <!-- 添加
添加操作返回值可有可无
#{}:如果传入的是po类型,那么#{}中的变量名称必须是po中对应的属性
-->
<!-- <select id="insertUser" parameterType="com.huida.po.User">
insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address})
</select> -->
<!-- 自增主键返回 -->
<insert id="insertUser" parameterType="com.huida.po.User">
<!-- selectKey将主键返回,需要再返回 -->
<!-- keyProperty:将返回的主键放入传入参数的id中保存。也就是最后的结果通过id保存起来
order:当前函数相对于insert语句的执行顺序,在insert前执行的是before,在insert之后执行的是after
resultType:id的类型
-->
<selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
select LAST_INSERT_ID()
</selectKey>
insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address});
</insert>
</mapper>
4.Dao接口
package com.huida.dao;
import java.util.List;
import com.huida.po.User;
public interface UserDao {
public User findUserById(Integer id);
public List<User> findUserByUserName(String name);
}
5.Dao接口实现方法
package com.huida.dao; import java.util.List; import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory; import com.huida.po.User; public class UserDaoImpl implements UserDao { //拿到工厂,才能得到Session,才能对sql语句进行处理
private SqlSessionFactory factory;
//通过构造方法将工厂传入,也就是注入
public UserDaoImpl(SqlSessionFactory factory) {
super();
this.factory = factory;
}
@Override
public User findUserById(Integer id) {
//创建session
//sqlSession是线程不安全的,它的最佳使用是在方法体内
SqlSession openSession=factory.openSession();
User user=openSession.selectOne("test.findUserById", id);
return user;
}
//模糊查询
@Override
public List<User> findUserByUserName(String name) {
//每个方法创建一个sqlSession
SqlSession openSession=factory.openSession();
List<User> list=openSession.selectList("test.findUserByUsername",name);
return list;
} }
6.Dao测试
创建一个JUnit的测试类,对UserDao进行测试。
这里我们使用了一个小技巧,因为没执行一个方法都需要创建工厂,所以我们可以将创建工厂的方法拿出来,放在所有测试方法之前,并在前面加一个@Before的注解,这样就会在测试方法前执行这个方法。不能将建了SqlSession的方法提到前面,因为SqlSession的作用范围应该是在方法内。
package com.huida.test; import java.io.InputStream;
import java.util.List; import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test; import com.huida.dao.UserDao;
import com.huida.dao.UserDaoImpl;
import com.huida.po.User; public class UserDaoTest { private SqlSessionFactory factory=null;
//before的作用:在测试方法前执行这个方法
@Before
public void init() throws Exception{
// 通过流将核心配置文件读取进来
InputStream inputStream = Resources.getResourceAsStream("config/SqlMapConfig.xml");
// 通过核心配置文件输入流来创建工厂
factory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testFindById(){
UserDao userDao=new UserDaoImpl(factory);
User user=userDao.findUserById(1);
System.out.println(user);
} @Test
public void testFindByUserName(){
UserDao userDao=new UserDaoImpl(factory);
List<User> list=userDao.findUserByUserName("li");
System.out.println(list);
}
}
使用mybatis开发Dao的原始方法,实现根据用户id查询一个用户信息 、根据用户名称模糊查询用户信息列表 、添加用户信息等功能的更多相关文章
- MyBatis开发Dao的原始Dao开发和Mapper动态代理开发
目录 咳咳...初学者看文字(Mapper接口开发四个规范)属实有点费劲,博主我就废了点劲做了如下图,方便理解: 原始Dao开发方式 1. 编写映射文件 3.编写Dao实现类 4.编写Dao测试 Ma ...
- 【mybatis基础】mybatis开发dao两种方法
mybatis是一个支持普通SQL查询,存储过程和高级映射的优秀的持久层的框架,是apache下的顶级项目.mybatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装.mybat ...
- 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层开发)
本文将介绍使用框架mybatis开发原始Dao层来对一个对数据库进行增删改查的案例. Mapper动态代理开发Dao层请阅读我的下一篇博客:MyBatis开发Dao层的两种方式(Mapper动态代理方 ...
- 使用mybatis开发dao方法
使用mybatis开发dao的时候, 主要涉及到SqlSessionFactoryBuilder.SqlSessionFactory.SqlSession 这三个类 现在将这三个类的使用方法简单的说下 ...
- MyBatis开发Dao
MyBatis开发Dao有两种方法: 1.原始Dao开发方法,就是程序需要编写Dao的接口和Dao的实现类. 2.MyBatis的mapper接口(相当于Dao接口)代理开发方法.(更重要) ---- ...
- MyBatis开发Dao层的两种方式(Mapper动态代理方式)
MyBatis开发原始Dao层请阅读我的上一篇博客:MyBatis开发Dao层的两种方式(原始Dao层开发) 接上一篇博客继续介绍MyBatis开发Dao层的第二种方式:Mapper动态代理方式 Ma ...
- 使用mybatis开发dao问题总结
代码片段: @Override public User getUserById(Integer id) { SqlSession sqlSession = sqlSessionFactory.open ...
随机推荐
- BZOJ4977: [[Lydsy1708月赛]跳伞求生(不错的贪心)
4977: [[Lydsy1708月赛]跳伞求生 Time Limit: 5 Sec Memory Limit: 256 MBSubmit: 446 Solved: 142[Submit][Sta ...
- Laravel学习之旅(一)
路由 1.简介:简单的说就是将用户的请求转发给相应的程序进行处理: 2.作用:就是建立url和程序之间的映射. 3.请求类型:get.post.put.patch.delete 相比于thinkphp ...
- web应用中Filter过滤器之开发应用
1 过滤器的简单开发应用部署 首先讲解过滤器的开发部署运行基本流程,在这里先通过一个简单的示例: 1)编写过滤器类 编写一个简单的过滤器类:SimpleFilter,实现Filter接口,完整的代码为 ...
- PTHREAD的WINDOWS开发包
PTHREAD的WINDOWS开发包 网站地址是http://sourceware.org/pthreads-win32/
- 【转】MFC String处理
原文网址:http://www.cnblogs.com/lisuyun/p/3399232.html C/C++获取文件后缀名并且比较 以下这段是VC中过去文件后缀名的方法 1.CString Get ...
- 【转】shell 编程:冒号 后面跟 等号,加号,减号,问号的意义
原文网址:http://blog.csdn.net/trochiluses/article/details/9048539 缺省值(:-) 如果变量后面跟着冒号和减号,则变量后面跟着是这个变量的缺 ...
- settimeout()在IE8下参数无效问题解决方法
遇到这个问题,setTimeout(Scroll(),3000); 这种写法在IE8 下 不能够执行,提示参数无效, setTimeout(function(){Scroll()},3000);这种方 ...
- cassandra多数据中心的配置
cassandra默认建keyspace的时候,是需要制定拓扑策略的,小数据就直接用单数据中心的simpleStrategy了,网上资料都没具体提如何配置多数据中心,这里简单贴一下 cassandra ...
- python环境搭建,开发环境
一.从链接http://www.python.org/downloads/ 下载安装包,注意32位和64位安装包区别. https://www.python.org/downloads/windows ...
- Oracle 11.2.0.3.0 RAC GI_DB升级到11.2.0.4.0
转载: http://blog.csdn.net/frank0521/article/details/18226199 前言 还是大家常说的那句:生产环境千万记得备份哈~~~ 以下的环境,是我的测试 ...