二、CRUD操作以及配置解析

1.在原来基础上加上增加、删除和更改

在UserDao的接口中

    /*** 根据id查询用户*/User getUserById(int id);/*** 增加一个用户*/int addUser(User user);/*** 修改一个用户*/int updateUser(User user);/*** 删除一个用户*/int deleteUser(int id);

在UserMapper.xml中

<mapper namespace="com.join.dao.UserDao"><select id="getUserList"  resultType="com.join.entity.User">select * from mybatis.user</select><select id = "getUserById" resultType="com.join.entity.User" parameterType="int" >select * from mybatis.user where id = #{id}</select><insert id="addUser" parameterType="com.join.entity.User">insert into mybatis.user (id,name,pwd) values(#{id},#{name},#{pwd});</insert><update id = "updateUser" parameterType="com.join.entity.User">update mybatis.user set name = #{name} ,pwd = #{pwd} where id = #{id};</update><delete id = "deleteUser" parameterType="int">delete from mybatis.user where id = #{id}</delete></mapper>

进行测试

/*** 增删改需要提交事务,不然无法对数据库进行更改*/@Testpublic void addUser() {//1.获取SqlSession对象SqlSession sqlSession = MybatisUtils.getSession();UserDao mapper = sqlSession.getMapper(UserDao.class);int flag = mapper.addUser(new User(4,"4","123"));System.out.println(flag);//提交事务 ***sqlSession.commit();sqlSession.close();}/*** 更新一个用户*/@Testpublic void updateUser() {//1.获取SqlSession对象SqlSession sqlSession = MybatisUtils.getSession();UserDao mapper = sqlSession.getMapper(UserDao.class);int flag = mapper.updateUser(new User(1,"1","123456"));System.out.println(flag);//提交事务 ***sqlSession.commit();sqlSession.close();}/*** 更新一个用户*/@Testpublic void deleteUser() {//1.获取SqlSession对象SqlSession sqlSession = MybatisUtils.getSession();UserDao mapper = sqlSession.getMapper(UserDao.class);int flag = mapper.deleteUser(4);System.out.println(flag);//提交事务 ***sqlSession.commit();sqlSession.close();}

2.Map跟模糊查询扩展

(1).假设,我们的实体类,或者数据库中的表,字段或者参数过多,我们应当考虑使用Map

UserDao

User getUserById2(Map<String,Object> map);int addUser2(Map<String,Object> map);

在UserMapper.xml中

<!--    通过map传递,获取用户--><select id = "getUserById2" resultType="com.join.entity.User" parameterType="map" >select * from mybatis.user where id = #{id} and name = #{name}</select><!--    使用map插入,对象中的属性,可以直接取出来,传递map的key--><insert id="addUser2" parameterType="map">insert into mybatis.user (id,name,pwd) values(#{userId},#{username},#{password});</insert>

进行测试

    /*** 查询一个user使用map*/@Testpublic void selectUserById2() {//1.获取SqlSession对象SqlSession sqlSession = MybatisUtils.getSession();UserDao mapper = sqlSession.getMapper(UserDao.class);Map<String ,Object> map = new HashMap<String,Object>();map.put("id",2);map.put("name","2");User user = mapper.getUserById2(map);System.out.println(user);//提交事务 ***sqlSession.commit();sqlSession.close();}/*** 增加一个user使用map*/@Testpublic void addUser2() {//1.获取SqlSession对象SqlSession sqlSession = MybatisUtils.getSession();UserDao mapper = sqlSession.getMapper(UserDao.class);Map<String ,Object> map = new HashMap<String,Object>();map.put("userId",4);map.put("username","4");map.put("password","123456");int flag = mapper.addUser2(map);System.out.println(flag);//提交事务 ***sqlSession.commit();sqlSession.close();}

(2)模糊查询

UserDao

List<User> getUserLike(String value);

在UserMapper.xml中

<!--    模糊查询1--><select id="getUserLike"  resultType="com.join.entity.User">select * from mybatis.user  where  pwd like #{value}</select>

进行测试

/*** 模糊查询user1,并且不会出现sql注入*/@Testpublic void getUserLike() {//1.获取SqlSession对象SqlSession sqlSession = MybatisUtils.getSession();//方法一://List<User> users = session.getUserList("com.join.dao.UserMapper.getUserList");//方法二,执行,以后直接用Mapper代替Dao:UserDao mapper = sqlSession.getMapper(UserDao.class);List<User> users = mapper.getUserLike("%123%");for (User user: users){System.out.println(user);}sqlSession.close();}

2. 配置解析

(1)核心配置文件

configuration(配置)   //
properties(属性)     //
settings(设置)    //
typeAliases(类型别名)
typeHandlers(类型处理器)
objectFactory(对象工厂)
plugins(插件)
environments(环境配置)environment(环境变量)transactionManager(事务管理器)
dataSource(数据源)
databaseIdProvider(数据库厂商标识)
mappers(映射器)
<!-- 注意元素节点的顺序!顺序不对会报错 -->

(2)环境配置(environments)

MyBatis可以配置成适应多种环境
      不过要记住:尽管可以配置多个环境,但每个SqlSessionFactory实例只能选择一种环境。学会使用配置多套运行环境!
      Mybatis默认的事务管理器就是JDBC,连接池: POOLED

(3)属性(propertise)

我们可以通过properties属性来实现引用配置文件

<!--第二种在xml中配置,对应下面的environment中也要改成name--><properties resource="db.properties" ><property name="name" value="root"/><property name="pwd" value="root"/></properties><!--   第一种方式(优先使用) 引入外部配置文件,跟配置文件对应--><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="${pwd}"/></dataSource></environment></environments>

4. 别名 (typeAliases)

类型别名是为Java类型设置一个短的名字。它只和XML配置有关,存在的意义仅在于用来减少类完全限定名的冗余。

        <!-- 别名实体类少的使用第一种,可以自定义实体类多的时候使用第二种,不能自己定义,如果实体类有注解,可以直接用注解的名字--><typeAliases><!--  给实体类起一个别名--><typeAlias type="com.join.entity.User"  alias="User"></typeAlias><package name="entity"/></typeAliases><typeAliases><!-- 扫描实体类的包,它的默认别名就为这个类的类名,首字母小写!(也可以大写) --><package name="entity"/></typeAliases>

5. 设置(setting)

  • 懒加载

  • 日志实现

  • 缓存开启关闭

一个配置完整的 settings 元素的示例如下:

<settings><setting name="cacheEnabled" value="true"/><setting name="lazyLoadingEnabled" value="true"/><setting name="multipleResultSetsEnabled" value="true"/><setting name="useColumnLabel" value="true"/><setting name="useGeneratedKeys" value="false"/><setting name="autoMappingBehavior" value="PARTIAL"/><setting name="autoMappingUnknownColumnBehavior" value="WARNING"/><setting name="defaultExecutorType" value="SIMPLE"/><setting name="defaultStatementTimeout" value="25"/><setting name="defaultFetchSize" value="100"/><setting name="safeRowBoundsEnabled" value="false"/><setting name="mapUnderscoreToCamelCase" value="false"/>    //大小写,就是fast_test<setting name="localCacheScope" value="SESSION"/><setting name="jdbcTypeForNull" value="OTHER"/><setting name="lazyLoadTriggerMethods" value="equals,clone,hashCode,toString"/>
</settings>

6.映射器(mappers)

   <!-- 映射文件,必须要用每一个Mapper.xml都需要在mybatis的核心配置文件中注册--><mappers><!--  mapper.xml可以放在任何地方 (推荐)     --><mapper resource="com/join/dao/UserMapper.xml"/><!--   使用class文件绑定注册 ,接口跟他的mapper配置文件必须同名并且在同一个包下--><mapper class = "com.join.dao.UserMapper"></mapper><!-- 使用扫描包进行注入,跟class的注意点相同--><package name="com.join.dao"/></mappers>

3. 生命周期和作用域

作用域理解

  • SqlSessionFactoryBuilder                                                                                                                                                               的作用在于创建 SqlSessionFactory,创建成功后,SqlSessionFactoryBuilder 就失去了作用,所以它只能存在于创建 SqlSessionFactory 的方法中,而不要让其长期存在。因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。

  • SqlSessionFactory 可以被认为是一个数据库连接池,它的作用是创建 SqlSession 接口对象。                                               因为 MyBatis 的本质就是 Java 对数据库的操作,所以 SqlSessionFactory 的生命周期存在于整个 MyBatis 的应用之中,所以一旦创建了 SqlSessionFactory,就要长期保存它,直至不再使用 MyBatis 应用,所以可以认为 SqlSessionFactory 的生命周期就等同于 MyBatis 的应用周期。

  • 由于 SqlSessionFactory 是一个对数据库的连接池,所以它占据着数据库的连接资源。如果创建多个 SqlSessionFactory,那么就存在多个数据库连接池,这样不利于对数据库资源的控制,也会导致数据库连接资源被消耗光,出现系统宕机等情况,所以尽量避免发生这样的情况。

  • 因此在一般的应用中我们往往希望 SqlSessionFactory 作为一个单例,让它在应用中被共享。所以说 SqlSessionFactory 的最佳作用域是应用作用域。(全局)

  • 如果说 SqlSessionFactory 相当于数据库连接池,那么 SqlSession 就相当于一个数据库连接(Connection 对象),你可以在一个事务里面执行多条 SQL,然后通过它的 commit、rollback 等方法,提交或者回滚事务。所以它应该存活在一个业务请求中,处理完整个请求后,应该关闭这条连接,让它归还给 SqlSessionFactory,否则数据库资源就很快被耗费精光,系统就会瘫痪,所以用 try...catch...finally... 语句来保证其正确关闭。

  • 所以 SqlSession 的最佳的作用域是请求或方法作用域。(局部变量),即结束该方法就关闭

二、CRUD操作以及配置解析相关推荐

  1. MyBatis02:CRUD操作和配置解析

    MyBatis02:CRUD操作和配置解析 CRUD select 根据id查询用户 接口方法 public interface UserMapper {//查询所有用户List<User> ...

  2. 使用mybatis完成简单的crud操作

    目录 1.配置核心配置文件和jdbc.properties 2. 装mybatis工具类 3.创建实体类 4.创建mapper接口 5.编写测试类 下面介绍基于注解的方式实现基本的 CRUD 操作 1 ...

  3. Elasticsearch技术解析与实战(二)文档的CRUD操作

    启动Elasticsearch和kibana 访问Elasticsearch:http://localhost:9200/?pretty 访问kibana:http://localhost:5601 ...

  4. Java-Mybatis(二): Mybatis配置解析、resultMap结果集映射、日志、分页、注解开发、Mybatis执行流程分析

    Java-Mybatis-02 学习视频:B站 狂神说Java – https://www.bilibili.com/video/BV1NE411Q7Nx 学习资料:mybatis 参考文档 – ht ...

  5. jaxp 解析xml 小demo 对xml文件标签实现增删改查crud操作

    <?xml version="1.0" encoding="utf-8" standalone="no"?><school ...

  6. MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作

    上一篇博文MyBatis学习总结(一)--MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个初步的入门了,今天讲解一下如何使用MyBatis对u ...

  7. Apache入门 篇(二)之apache 2.2.x常用配置解析

    一.httpd 2.2.x目录结构 Cnetos 6.10 YUM安装httpd 2.2.x # yum install -y httpd 程序环境主配置文件:/etc/httpd/conf/http ...

  8. 用“XML解析开发包Jaxp”对XML文件进行Dom方式的CRUD操作

    IT程序员开发必备-各类资源下载清单,史上最全IT资源,个人收藏总结! package edu.jaxp; import java.io.FileNotFoundException; import j ...

  9. HBase学习之路(二):Java客户端的CRUD操作详讲

    内容简介 一.概述 二.操作前的准备 三.put操作 1.单行put方法 2.使用Put列表 四.get操作 1.单行get方法 2.使用Get列表 五.delete操作 1.单行delete方法 2 ...

最新文章

  1. HTTP响应头不缓存
  2. javaweb_A service with the given Service Name is already installed on this machine.[【】删除服务】
  3. mongooseim xmpp 服务器docker 安装试用
  4. 版本变迁_冰枪?卢登?大天使?——从发条魔灵的装备变迁看版本变动
  5. 鼠标右击 左击 等总结
  6. Citrix XenApp应用虚拟化之RTX串号问题解决
  7. 一个简单的pwn例子---read函数
  8. 硬件描述语言复习笔记
  9. 南师大632c语言程序设计,单片机c语言学习心得632.docx
  10. 【JS 逆向百例】网洛者反爬练习平台第一题:JS 混淆加密,反 Hook 操作
  11. 慧材技术中核普达测量与测绘系统介绍(一)
  12. java访问mysql_Java访问数据库
  13. eclipse中安装flex插件
  14. 如何用html制作彩虹,用 CSS 制作彩虹
  15. 大数据分析平台具有哪些价值
  16. web基础、tomcat搭建
  17. koa2 mysql项目教程_blogs: Node.js + Koa2 + MySQL + Vue.js 实战开发一套完整个人博客项目网站...
  18. ubuntu网页邮箱服务器设置,ubuntu配置邮件服务器
  19. Android端的新浪微博论文,android新浪微博客户端开发毕业论文.doc
  20. 《大西洋月刊》2014-2020年电子版合集| The Atlantic

热门文章

  1. 天玑9200实测成绩:CPU单核成绩突破1400分,堪称安卓芯皇
  2. 离婚后发现对方婚内出轨,还能否要赔偿
  3. 怎么把html5做成动态壁纸,在电脑上怎样把小视频做成动态壁纸
  4. 原版XP合集,非BT下载
  5. html验证座机号码_js验证输入是否为手机号码或电话号码示例
  6. C语言——文件操作及常见问题
  7. 为即将的工作做准备~
  8. 雷军成功踏上移动互联网游轮
  9. 一、回首向来萧瑟处,也无风雨也无晴
  10. 12Cr1MoVR是什么材质12Cr1MoVR钢板简介12Cr1MoVR化学成分钢板应用