Mybatis学习记录(2)
1.mybatis与hibernate不同
Mybatis和hibernate,mybatis不完全是一个ORM框架,因为Mybatis需要程序员自己编写sql语句。mybatis可以通过xml或注解方式灵活配置要运行的sql语句,并将java对象和sql语句映射生成最终执行的sql,最后将sql执行结果再映射生成java对象。
Mybatis可严格控制sql执行性能,灵活度高,但是mybatis无法做到数据库无关性,如果需要实现支持多种数据库的软件则需要自定义多套sql映射文件,工作量大。
Hibernate对象关系映射能力好,数据库无关性好,对于关系模型要求高的软件,采用hibernat开发可以节省很多代码,提高效率,但是灵活性很低。
2.原生Dao开发
(1)新建Dao包

UserDao.java
import com.javaweb.mybatis.model.User;
public interface UserDao {
public User selectUserById(String id);
}
userDaoImpl.java
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory; import com.javaweb.mybatis.dao.UserDao;
import com.javaweb.mybatis.model.User; /**
* Dao
* @author fyk
*
*/
public class UserDaoImpl implements UserDao { //注入
private SqlSessionFactory sqlSessionFactory; public UserDaoImpl(SqlSessionFactory sqlSessionFactory){
this.sqlSessionFactory=sqlSessionFactory; }
/*
*根据id查询用户
*
*/
public User selectUserById(String id){
SqlSession sqlSession=sqlSessionFactory.openSession();
return sqlSession.selectOne("test.findUserById", id);
} public SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
} public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
this.sqlSessionFactory = sqlSessionFactory;
} }
Junit单元测试
public class MybatisDaoTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void before() throws Exception {
//加载核心配置文件
String resource="sqlMapConfig.xml";
InputStream in=Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
}
@Test
public void testDao() throws Exception{
UserDao userDao=new UserDaoImpl(sqlSessionFactory);
User user = userDao.selectUserById("2");
System.out.println(user);
}
}
3.使用Mapper动态代理方式
Mapper接口开发方法只需要编写Mapper接口(相当于Dao接口),有Mybatis框架根据接口定义创建接口的动态代理对象,代理对象的方法体同Dao接口实现类方法。
Mapper.xml映射文件

Mapper.xml配置文件

UserMapper.java
import com.javaweb.mybatis.model.User; //与dao是一个意思
public interface UserMapper {
/**
* 遵循四个原则
* 1.接口方法名 ==User.xml中的id名
* 2.返回值类型与Mapper.xml的返回值类型一致
* 3.方法的入参类型与Mapper.xml中的入参类型一致
* 4.命名空间绑定此接口,即Mapper.xml的namespace是此接口的路径
*/
public class MybatisMapperTest {
@Test
public void testMapper() throws Exception{
//加载核心配置文件
String resource="sqlMapConfig.xml";
InputStream in=Resources.getResourceAsStream(resource);
//创建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//创建SqlSession
SqlSession sqlSession=sqlSessionFactory.openSession();
//SqlSession帮我生成一个实现类
UserMapper userMapper=sqlSession.getMapper(UserMapper.class);
User user=userMapper.findUserById("3");
System.out.println(user);
}
}
public User findUserById(String id);
}
Junit单元测试
Mybatis学习记录(2)的更多相关文章
- MyBatis 学习记录5 MyBatis的二级缓存
主题 之前学习了一下MyBatis的一级缓存,主要涉及到BaseExecutor这个类. 现在准备学习记录下MyBatis二级缓存. 配置二级缓存与初始化发生的事情 首先二级缓存默认是不开启的,需要自 ...
- MyBatis 学习记录3 MapperMethod类
主题 之前学习了一下MapperProxy的生产过程,自定义Mapper类的对象是通过动态代理生产的,调用自定义方法的时候实际上是调用了MapperMethod的execute方法:mapperMet ...
- MyBatis 学习记录7 一个Bug引发的思考
主题 这次学习MyBatis的主题我想记录一个使用起来可能会遇到,但是没有经验的话很不好解决的BUG,在特定情况下很容易发生. 异常 java.lang.IllegalArgumentExceptio ...
- MyBatis 学习记录6 TypeHandler
主题 因为对MyBatis在JDBC数据和Java对象之间数据转化比较感兴趣,所以就记录并学习一下TypeHandler. 使用场景 如上图所示,观察下接口方法就能明白.TypeHandler主要用于 ...
- MyBatis 学习记录4 MyBatis的一级缓存
主题 分享记录一下MyBatis的一级缓存相关的学习. Demo public static void firstLevelCache() { init("mybatis-config.xm ...
- mybatis 学习记录1
起因 以前刚学习java三大框架的时候持久层框架我是自学的是hibernate..感觉蛮好用的,so easy..后来大三实习公司用的是jpa(hibernate外包装一层)...再后来工作1年多用的 ...
- mybatis学习记录六——一对一、一对多和多对多查询
9 订单商品数据模型 9.1 数据模型分析思路 1.每张表记录的数据内容 分模块对每张表记录的内容进行熟悉,相当 于你学习系统 需求(功能)的过程. 2.每张表重要的字段设置 非空 ...
- Mybatis学习记录(六)----Mybatis的高级映射
1.一对多查询 1.1 需求 查询订单及订单明细的信息. 1.2 sql语句 确定主查询表:订单表 确定关联查询表:订单明细表 在一对一查询基础上添加订单明细表关联即可. SELECT orders. ...
- Mybatis学习记录(五)----Mybatis的动态SQL
1. 什么是动态sql mybatis核心 对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 1.1 需求 用户信息综合查询列表和用户信息查询列表总数这两个statemen ...
- MyBatis 学习记录1 一个简单的demo
主题 最近(N个月前)clone了mybatis的源码..感觉相比于spring真的非常小...然后看了看代码觉得写得很精简...感觉我的写代码思路和这个框架比较相似(很难具体描述...就是相对来说比 ...
随机推荐
- U3D shaderlab 相关指令开关
Subshader { [Tags] [CommonState] Passdef [Passdef ...] }Tags分为SubShader Tags和Pass Tags,Tags放在SubShad ...
- docker中容器和镜像的区别
自学docker过程中一直搞不明白 镜像容器的关系,网上查阅看到一篇文章觉得讲的很好,转载记录. 转自 http://blog.csdn.net/chszs/article/details/48252 ...
- IT兄弟连 Java语法教程 Java语言的其他特性
Java语言中除了非常重要的跨平台特性外,还有如下几个关键特性: ● 语法简单易学 Java语言的语法简单明了,容易掌握,而且是纯面向对象(OOP)的语言,Java语言的简单性主要体现在以下几个方面 ...
- 手工sql注入判断是否存在注入点
1.加入单引号 ’提交,结果:如果出现错误提示,则该网站可能就存在注入漏洞.2.数字型判断是否有注入;语句:and 1=1 ;and 1=2 (经典).' and '1'=1(字符型)结果:分别返回不 ...
- 利用system.reflection遍历一个类的变量成员
假设有下面一个类,在程序中已初始化,如何获取里面的变量成员name,age,onduty及其值呢? public class Employee { public string name; public ...
- linux grep (转)
常用用法 [root@www ~]# grep [-acinv] [--color=auto] '搜寻字符串' filename 选项与参数: -a :将 binary 文件以 text 文件的方式搜 ...
- mongodb-win
http://www.cnblogs.com/clsn/p/8214194.html#auto_id_22 Mongodb的作用: 用于对象及JSON数据的存储,它存的都是对象比如字典, 数据库,无论 ...
- CC34:判断直线相交
题目 解法 水题,判断斜率.判断截距,ok..... class CrossLine { public: bool checkCrossLine(double s1, double s2, doubl ...
- 长春理工大学第十四届程序设计竞赛(重现赛)B.Bowling Game
链接:https://ac.nowcoder.com/acm/contest/912/B 题意: 链接:https://ac.nowcoder.com/acm/contest/912/B来源:牛客网 ...
- GYM 101933D(最短路、二分、dp)
要点 非要先来后到暗示多源最短路,求最小的最大值暗示二分 二分内部的check是关键,dp处理一下,\(dp[i]\)表示第\(i\)笔订单最早何时送达,如果在ddl之前到不了则\(return\ 0 ...