在上一文(springmvc之jdbc操纵数据库)中,我们分析了传统java的jdbc操纵数据库的流程以及使用因为该方法导致的一些bug,因此,本文的中心点就是探讨如何解决上一文出现的那些bug,要解决这些bug,Apache旗下的mybatis给出了很好的解决方案,接下来我们来看看mybatis的工作流程以及部分代码。

mybatis的工作流程:

以上就是mybatis的将要工作流程,我们接着看针对以上流程的具体代码,不过在这之前,我们需要配置一个log4j.propertiessql执行日志文件,在控制台输出sql语句,以方便我们查看执行情况:

  log4j.properties文件:

# Global logging configuration
#在开发环境下日志级别要设置成DEBUG,生产环境设置成info或error
log4j.rootLogger=DEBUG, stdout
# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n

现在就是到了以上流程的具体代码了:

一、编辑配置文件

    1、配置sqlMapConfig.xml文件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration><!-- 和spring整合后 environments配置将废除 --><environments default="development"><environment id="development"><!-- 使用jdbc事务管理 --><transactionManager type="JDBC" /><!-- 数据库连接池 --><dataSource type="POOLED"><property name="driver" value="com.mysql.jdbc.Driver" /><property name="url"value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" /><property name="username" value="数据库登录名" /><property name="password" value="数据库登录密码" /></dataSource></environment></environments><!-- 加载映射文件:User.xml等(一般为数据表名.xml) --><mappers><mapper resource="sqlmap/User.xml" /></mappers>
</configuration>

以上是前期的sqlMapConfig.xml简单配置,到后期与spring整合以后,后有变动,在这里我们先用着先。

 2、配置实体类(数据表)对应的xml文件(以User表为例:因此文件名为:User.xml,其中输入/输出参数类型也是在这个文件里面定义)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd"><!-- namespace命名空间,作用就是对sql进行分类化管理,理解sql隔离
注意:使用mapper代理方法开发,namespace有特殊重要的作用
-->
<mapper namespace="test"><!-- 在 映射文件中配置很多sql语句:增删改查等等 --><!-- 需求:通过id查询用户表的记录 --><!-- 通过 select执行数据库查询id:标识 映射文件中的 sql将sql语句封装到mappedStatement对象中,所以将id称为statement的idparameterType:指定输入 参数的类型,这里指定int型 #{}表示一个占位符号#{id}:其中的id表示接收输入 的参数,参数名称就是id,如果输入 参数是简单类型,#{}中的参数名可以任意,可以value或其它名称resultType:指定sql输出结果 的所映射的java对象类型,select指定resultType表示将单条记录映射成的java对象。--><select id="findUserById" parameterType="int" resultType="cn.itcast.mybatis.po.User">SELECT * FROM USER WHERE id=#{value}</select><!-- 根据用户名称模糊查询用户信息,可能返回多条resultType:指定就是单条记录所映射的java对象 类型${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中。使用${}拼接sql,引起 sql注入${value}:接收输入 参数的内容,如果传入类型是简单类型,${}中只能使用value--><select id="findUserByName" parameterType="java.lang.String" resultType="cn.itcast.mybatis.po.User">SELECT * FROM USER WHERE username LIKE '%${value}%'</select><!-- 添加用户 parameterType:指定输入 参数类型是pojo(包括 用户信息)#{}中指定pojo的属性名,接收到pojo对象的属性值,mybatis通过OGNL获取对象的属性值--><insert id="insertUser" parameterType="cn.itcast.mybatis.po.User"><!-- 将插入数据的主键返回,返回到user对象中SELECT LAST_INSERT_ID():得到刚insert进去记录的主键值,只适用与自增主键keyProperty:将查询到主键值设置到parameterType指定的对象的哪个属性order:SELECT LAST_INSERT_ID()执行顺序,相对于insert语句来说它的执行顺序resultType:指定SELECT LAST_INSERT_ID()的结果类型--><selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">SELECT LAST_INSERT_ID()</selectKey>insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address})<!-- 使用mysql的uuid()生成主键执行过程:首先通过uuid()得到主键,将主键设置到user对象的id属性中其次在insert执行时,从user对象中取出id属性值--><!--  <selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">SELECT uuid()</selectKey>insert into user(id,username,birthday,sex,address) value(#{id},#{username},#{birthday},#{sex},#{address}) --></insert><!-- 删除 用户根据id删除用户,需要输入 id值--><delete id="deleteUser" parameterType="java.lang.Integer">delete from user where id=#{id}</delete><!-- 根据id更新用户分析:需要传入用户的id需要传入用户的更新信息parameterType指定user对象,包括 id和更新信息,注意:id必须存在#{id}:从输入 user对象中获取id属性值--><update id="updateUser" parameterType="cn.itcast.mybatis.po.User">update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}</update></mapper>

这个文件的作用就是针对某一个表把sql语句写进配置文件里面,方便后期因为需求变动而给系统维护造成一些不必要的麻烦。

二、创建SqlSession会话工厂以及后续的步骤都以及包括在这个文件里面了(利用一些写好的方法/函数调用上一步的配置文件里面的一些语句):

package store.cloudspace.sessionFactory;import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Test;
import store.cloudspace.pojo.User;/*** @ClassName: operatingUser* @Description:TODO(操作数据表中的数据)* @author: MyLover* @date: 2018年11月22日 下午8:33:58* @Copyright: 2018 www.cloudspace.store Inc. All rights reserved.*/
public class findUser {@Testpublic void findUserById() throws IOException {// 定义mybatis配置文件String resource = "SqlMapConfig.xml";InputStream inputStream = Resources.getResourceAsStream(resource);// 创建会话工厂,传入mybatis的配置文件信息SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 通过工厂得到sqlsessionSqlSession sqlSession = sqlSessionFactory.openSession();// 通过SQLSession操作数据库// 第一个参数:映射文件中的statement的id,书写格式:namespace.id// 第二个参数:指定和映射文件中说匹配的parameterType类型对象// sqlSession.selectOne结果是与映射文件中说匹配的resultType类型对象User user = sqlSession.selectOne("test.findUserByid", 3);System.out.println(user);// 释放资源sqlSession.close();}@Testpublic void findUserByName() throws IOException {// 定义mybatis配置文件String resource = "config/SqlMapConfig.xml";InputStream inputStream = Resources.getResourceAsStream(resource);// 创建会话工厂,传入mybatis的配置文件信息SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 通过工厂得到sqlsessionSqlSession sqlSession = sqlSessionFactory.openSession();List<User> user = sqlSession.selectList("test.findUserByName", "上官");System.out.println(user);// 释放资源sqlSession.close();}public void innsertUser() throws IOException {// 定义mybatis配置文件String resource = "config/SqlMapConfig.xml";InputStream inputStream = Resources.getResourceAsStream(resource);// 创建会话工厂,传入mybatis的配置文件信息SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 通过工厂得到sqlsessionSqlSession sqlSession = sqlSessionFactory.openSession();User user = new User();user.setUsername("张晓军");user.setSex("男");user.setBirthday(new Date());user.setAddress("大学东路");sqlSession.insert("insertUser", user);sqlSession.commit();//提交事务// 释放资源sqlSession.close();}// 根据id删除用户信息@Testpublic void deleteUser() throws IOException {// mybatis配置文件String resource = "SqlMapConfig.xml";// 得到配置文件流InputStream inputStream = Resources.getResourceAsStream(resource);// 创建会话工厂,传入mybatis的配置文件信息SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 通过工厂得到SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 传入id删除 用户sqlSession.delete("test.deleteUser", 39);// 提交事务sqlSession.commit();// 关闭会话sqlSession.close();}// 更新用户信息@Testpublic void updateUser() throws IOException {// mybatis配置文件String resource = "SqlMapConfig.xml";// 得到配置文件流InputStream inputStream = Resources.getResourceAsStream(resource);// 创建会话工厂,传入mybatis的配置文件信息SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);// 通过工厂得到SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();// 更新用户信息User user = new User();//必须设置iduser.setId(41);user.setUsername("王大军");user.setBirthday(new Date());user.setSex("2");user.setAddress("大学西路");sqlSession.update("test.updateUser", user);// 提交事务sqlSession.commit();// 关闭会话sqlSession.close();}

以上就是mybatis操纵数据库的简单流程以及具体代码了。

mybatis之mybatis操纵数据库相关推荐

  1. Mybatis实现简单的数据库增删改查操作

    简介: MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Ma ...

  2. 不敢相信,相同 SQL 下 Mybatis 查询结果和数据库竟然不一样!

    点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | jianshu.com/p/7c569ca68 ...

  3. spring boot 入门_SpringBoot入门建站全系列(三十)Mybatis多数据源进行数据库操作

    SpringBoot入门建站全系列(三十)Mybatis多数据源进行数据库操作 一.概述 多数据源,就是有多个数据库的配置. 多数据源配置并不麻烦,使用起来和单数据源基本相同,但是,重要的是事务的控制 ...

  4. 如何创建一个Mybatis程序,实现对数据库的简单查询?

    构建数据库: CREATE DATABASE `mybatis`;USE `mybatis`;DROP TABLE IF EXISTS `user`;CREATE TABLE `user` ( `id ...

  5. mybatis oracle生成注释,MyBatis Generator生成Oracle数据库对应实体类时无法获取注释问题...

    最近在利用mybatis generator生成Oracle数据库对应的实体类时发现一个问题,特此记录下. 因为项目使用到了swagger2,所以想在生成实体类时通过表注释和字段注释生成对应的@Api ...

  6. mybatis插入数据到数据库成功,数据库却没有数据

    mybatis插入数据到数据库成功,数据库却没有数据 错误描述: 解决办法: 错误描述: 编写测试类,显示数据插入成功: 但是去查看数据库中相应表中数据情况,缺发现没有数据! 解决办法: 查看核心配置 ...

  7. 使用mybatis插入数据到数据库中,显示插入成功,且没有报错,但是数据库中并没有新插入的数据的原因

    使用mybatis插入数据到数据库中,显示插入成功,且没有报错,但是数据库中并没有数据的原因 没有提交事务,有时没有配置自动提交事务的设置,所以需要手动提交事务,即 sqlSession.commit ...

  8. 【Mybatis】Mybatis学习由浅入深(二)

    前言   上篇介绍到了Mybatis的优缺点,这篇接下来介绍一下流程情况和配置信息. MyBatis简介 Mybatis工作流程 加载配置信息初始化 通过配置文件或注解将配置信息加载成Statemen ...

  9. (Mybatis)Mybatis简介和初步使用

    1. Mybatis简介 1.1什么是Mybatis MyBatis 是一款优秀的持久层框架 它支持定制化 SQL.存储过程以及高级映射. MyBatis 避免了几乎所有的 JDBC 代码和手动设置参 ...

  10. MyBatis(三)MyBatis缓存和工作原理

    MyBatis缓存 MyBatis提供了一级缓存和二级缓存,并且预留了集成第三方缓存的接口. 从上面MyBatis的包结构可以很容易看出跟缓存相关的类都在cache的package里,其底层是一个Ca ...

最新文章

  1. 使用Notepad++比较文件的差异
  2. week06 codelab02
  3. 数组不能将数值传给int_java数组查找常见情况
  4. 前天看了sigmastar新品发布,双核,1.2GHZ,真香!更多你想要了解的SSD201/202技术问题,看过来!启明云端MM帮你整理了!拿走不谢
  5. [数据库] MySQL基础知识之日期判断及添加排序序号
  6. 诈骗者如何伪造电子邮件地址,以及如何分辨
  7. 记录一次可能的order by注入
  8. Java-网络编程总结(转载)
  9. iOS xcode Bundle identifier is missing. NotificationServiceTest doesn't have *****
  10. 右键tomcat 选择 add and remove,出现的对话框里面没有我们的项目解决方法
  11. 手机微信群控系统和云控详细说明
  12. 出方向链路负载均衡技术(原理部分)
  13. MongoDB中shell基本使用
  14. window.print打印指定区域
  15. Gattaca-千钧一发
  16. 1到10所有数的立方
  17. 如何区分IO密集型、CPU密集型任务?
  18. html 文本转语音,百度文字转语音免费接口使用实例
  19. java爬虫教程 百度云_java视频教程java爬虫实战项目httpclient hbase springmvc solr
  20. musicothers

热门文章

  1. 读《别做正常的傻瓜》
  2. 《python语言程序设计》笔记
  3. oracle erp系统好用么,oracleerp系统优缺点
  4. 单向流动的拓扑结构_六种基本网络拓扑结构
  5. MySQL最全整理!java技术总监面试常见问题及答案
  6. html放大镜原理,简单的js放大镜功能的实现
  7. 短视频剪辑APP开发快速开发
  8. 5W2H在IC设计中的应用
  9. python制作qq机器人_使用python打造一个自己的QQ机器人 【基础篇】
  10. Stata:终极匹配ultimatch