二、CRUD操作以及配置解析
二、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操作以及配置解析相关推荐
- MyBatis02:CRUD操作和配置解析
MyBatis02:CRUD操作和配置解析 CRUD select 根据id查询用户 接口方法 public interface UserMapper {//查询所有用户List<User> ...
- 使用mybatis完成简单的crud操作
目录 1.配置核心配置文件和jdbc.properties 2. 装mybatis工具类 3.创建实体类 4.创建mapper接口 5.编写测试类 下面介绍基于注解的方式实现基本的 CRUD 操作 1 ...
- Elasticsearch技术解析与实战(二)文档的CRUD操作
启动Elasticsearch和kibana 访问Elasticsearch:http://localhost:9200/?pretty 访问kibana:http://localhost:5601 ...
- Java-Mybatis(二): Mybatis配置解析、resultMap结果集映射、日志、分页、注解开发、Mybatis执行流程分析
Java-Mybatis-02 学习视频:B站 狂神说Java – https://www.bilibili.com/video/BV1NE411Q7Nx 学习资料:mybatis 参考文档 – ht ...
- jaxp 解析xml 小demo 对xml文件标签实现增删改查crud操作
<?xml version="1.0" encoding="utf-8" standalone="no"?><school ...
- MyBatis学习总结(二)——使用MyBatis对表执行CRUD操作
上一篇博文MyBatis学习总结(一)--MyBatis快速入门中我们讲了如何使用Mybatis查询users表中的数据,算是对MyBatis有一个初步的入门了,今天讲解一下如何使用MyBatis对u ...
- 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 ...
- 用“XML解析开发包Jaxp”对XML文件进行Dom方式的CRUD操作
IT程序员开发必备-各类资源下载清单,史上最全IT资源,个人收藏总结! package edu.jaxp; import java.io.FileNotFoundException; import j ...
- HBase学习之路(二):Java客户端的CRUD操作详讲
内容简介 一.概述 二.操作前的准备 三.put操作 1.单行put方法 2.使用Put列表 四.get操作 1.单行get方法 2.使用Get列表 五.delete操作 1.单行delete方法 2 ...
最新文章
- HTTP响应头不缓存
- javaweb_A service with the given Service Name is already installed on this machine.[【】删除服务】
- mongooseim xmpp 服务器docker 安装试用
- 版本变迁_冰枪?卢登?大天使?——从发条魔灵的装备变迁看版本变动
- 鼠标右击 左击 等总结
- Citrix XenApp应用虚拟化之RTX串号问题解决
- 一个简单的pwn例子---read函数
- 硬件描述语言复习笔记
- 南师大632c语言程序设计,单片机c语言学习心得632.docx
- 【JS 逆向百例】网洛者反爬练习平台第一题:JS 混淆加密,反 Hook 操作
- 慧材技术中核普达测量与测绘系统介绍(一)
- java访问mysql_Java访问数据库
- eclipse中安装flex插件
- 如何用html制作彩虹,用 CSS 制作彩虹
- 大数据分析平台具有哪些价值
- web基础、tomcat搭建
- koa2 mysql项目教程_blogs: Node.js + Koa2 + MySQL + Vue.js 实战开发一套完整个人博客项目网站...
- ubuntu网页邮箱服务器设置,ubuntu配置邮件服务器
- Android端的新浪微博论文,android新浪微博客户端开发毕业论文.doc
- 《大西洋月刊》2014-2020年电子版合集| The Atlantic