操作步骤:
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
注入的安全隐患。建议在参数中不要使用这种方式。但是如果使用在排序中没有任何影响。Mapparams = 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问题。