博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
mybatis框架
阅读量:7007 次
发布时间:2019-06-27

本文共 6593 字,大约阅读时间需要 21 分钟。

  hot3.png

操作步骤:

1、将jar包导入到项目

2、创建Config.xml文件用来指定相应的数据库连接信息

3、创建mapper.xml文件

insert into t_user (username,password,nickname,type) value(#{username},#{password},#{nickname},#{type})
update t_user set password=#{password},nickname=#{nickname},type=#{type} where id=#{id}
delete from t_user where id=#{id}

4、创建SqlSessionFactory

//mybatis-config.xml是放置在src根目录下的InputStream is = Resources.getResourceAsStream("mybatis-config.xml");SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(is);

5、根据factory获取session

//根据factory获取sessionSQLSession session = factory.openSession();

6、直接根据session来执行相应的操作

//User.xml这个mapper文件中所定义的
的这个代码session.insert("org.pm.shop.model.User.add", user);session.commit();

mapper文件中的insert,update,delete,select

insert标签表示添加相应的对象信息,parameterType表示添加的对象类型

insert into t_user (username,password,nickname,type) value(#{username},#{password},#{nickname},#{type})

update表示更新操作,delete表示删除操作

update t_user set password=#{password},nickname=#{nickname},type=#{type} where id=#{id}
delete from t_user where id=#{id}

select表示查询操作,可以查询列表或者单个对象

相应的调用方式

@Test	public void testLoad() {		SqlSession session = null;		try {			session = MyBatisUtil.createSession();			//获取一个User对象			//User.class.getName()+".load",就是mapper.xml文件中的id,由于mapper.xml			//文件中定义了相应的namespace,需要使用相应的namespace+id的方式进行调用			User u = session.selectOne(User.class.getName()+".load", 1);			System.out.println(u.getNickname());		} finally {			MyBatisUtil.closeSession(session);		}	}

mapper.xml中两种引用

1、#{xxx}这种方式会自动将这个值替换为PreparedStatement中?来使用,如果是字符串会自动加上引号,

    对于排序而言就无法操作。

2、${xxx}这种方式叫做完全替换,直接将字符串完整的替换到这个位置,完全替换的方式可能会出现sql

    注入的安全隐患。建议在参数中不要使用这种方式。但是如果使用在排序中没有任何影响。

	
Map
params = new HashMap
(); //当需要进行like的%%模糊查询时,%%必须在传递时传入。否则会得到%'xxx'%。 params.put("name", "%"+name+"%"); params.put("pageOffset", pageOffset); params.put("pageSize", pageSize); params.put("order", order); params.put("sort", sort);

动态SQL语句

在mapper.xml文件中,可能会根据一些参数值的不同而动态的产生相应的SQL语句,此时就需要进行动态SQL语句的设定。

通过BaseDao来简化DAO

    当使用mybatis之后很多操作都是类似,所以思考通过通过一个公共的类来简化整个DAO操作。

public class BaseDao
{ public void add(T obj) { SqlSession session = null; try { session = MybatisUtil.createSession(); session.insert(obj.getClass().getName()+".add", obj); session.commit(); } catch (Exception e) { e.printStackTrace(); session.rollback(); }finally { MybatisUtil.closeSession(session); } } public void update(T obj) { SqlSession session = null; try { session = MybatisUtil.createSession(); session.update(obj.getClass().getName()+".update", obj); session.commit(); } catch (Exception e) { e.printStackTrace(); session.rollback(); }finally { MybatisUtil.closeSession(session); } } public void delete(Class
clz,int id) { SqlSession session = null; try { session = MybatisUtil.createSession(); session.delete(clz.getName()+".delete", id); session.commit(); } catch (Exception e) { e.printStackTrace(); session.rollback(); }finally { MybatisUtil.closeSession(session); } } public T load(Class
clz,int id) { return this.loadBySqlId(clz.getName()+".load", id); } public T loadBySqlId(String sqlId,Map
params) { SqlSession session = null; T t = null; try { session = MybatisUtil.createSession(); t = session.selectOne(sqlId, params); } finally { MybatisUtil.closeSession(session); } return t; } public T loadBySqlId(String sqlId,Object obj) { SqlSession session = null; T t = null; try { session = MybatisUtil.createSession(); t = session.selectOne(sqlId, obj); } finally { MybatisUtil.closeSession(session); } return t; } public List
list(Class
clz,Map
params) { return this.list(clz.getName()+".list", params); } public List
list(String sqlId,Map
params) { List
list = null; SqlSession session = null; try { session = MybatisUtil.createSession(); list = session.selectList(sqlId , params); } finally { MybatisUtil.closeSession(session); } return list; } public Pager
find(Class
clz,Map
params) { return this.find(clz.getName()+".find", params); } public Pager
find(String sqlId,Map
params) { int pageOffset = SystemContext.getPageOffset(); int pageSize = SystemContext.getPageSize(); String order = SystemContext.getOrder(); String sort = SystemContext.getSort(); Pager
pages = new Pager
(); SqlSession session = null; try { session = MybatisUtil.createSession(); if(params==null) params = new HashMap
(); params.put("pageOffset", pageOffset); params.put("pageSize", pageSize); params.put("order", order); params.put("sort", sort); List
datas = session.selectList(sqlId, params); pages.setDatas(datas); pages.setPageOffset(pageOffset); pages.setPageSize(pageSize); int totalRecord = session.selectOne(sqlId+"_count", params); pages.setTotalRecord(totalRecord); } finally { MybatisUtil.closeSession(session); } return pages; }

resultMap的使用:使用resultMap可以完成相应的结果集自定义输出。

resultMap还可以完成一些外键对对象的映射。

使用以上映射方式有一个致命的缺点:所谓的N+1问题,使用关联查询来解决N+1问题。

 

转载于:https://my.oschina.net/pmos/blog/746012

你可能感兴趣的文章
.NET Core 2将Visual Basic带到了Linux和macOS平台
查看>>
前端程序员需要掌握的几个专业“词语”
查看>>
PHP最佳实践之数据库
查看>>
【拾遗补缺】java ArrayList的不当使用导致的ConcurrentModificationException问题
查看>>
js 正则表达式
查看>>
使用vue和d3.js实现的dialog,messagebox,confirm,alert弹框
查看>>
Jackson 使用 defaultTyping 实现通用的序列化和反序列化
查看>>
React 更新视图过程
查看>>
第k个排列
查看>>
js数值精度
查看>>
JavaScript 中 apply 、call 的详解
查看>>
设计模式系列·王小二需求历险记(二)
查看>>
百度前端学院学习:动态数据绑定(二)
查看>>
从Python2到Python3:超百万行代码迁移实践
查看>>
关于.NET Core是否应该支持WCF Hosting的争论
查看>>
云原生应用的QA
查看>>
JDK 11版本时间表
查看>>
一线:阿里云不做SaaS,那这件事会交给谁?
查看>>
使用 JavaScript 根据用户照片和姓名生成海报
查看>>
ASP.NET Core:简洁的力量
查看>>