mybatis之mybatis操纵数据库
在上一文(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操纵数据库相关推荐
- Mybatis实现简单的数据库增删改查操作
简介: MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis 可以对配置和原生Ma ...
- 不敢相信,相同 SQL 下 Mybatis 查询结果和数据库竟然不一样!
点击上方蓝色"程序猿DD",选择"设为星标" 回复"资源"获取独家整理的学习资料! 来源 | jianshu.com/p/7c569ca68 ...
- spring boot 入门_SpringBoot入门建站全系列(三十)Mybatis多数据源进行数据库操作
SpringBoot入门建站全系列(三十)Mybatis多数据源进行数据库操作 一.概述 多数据源,就是有多个数据库的配置. 多数据源配置并不麻烦,使用起来和单数据源基本相同,但是,重要的是事务的控制 ...
- 如何创建一个Mybatis程序,实现对数据库的简单查询?
构建数据库: CREATE DATABASE `mybatis`;USE `mybatis`;DROP TABLE IF EXISTS `user`;CREATE TABLE `user` ( `id ...
- mybatis oracle生成注释,MyBatis Generator生成Oracle数据库对应实体类时无法获取注释问题...
最近在利用mybatis generator生成Oracle数据库对应的实体类时发现一个问题,特此记录下. 因为项目使用到了swagger2,所以想在生成实体类时通过表注释和字段注释生成对应的@Api ...
- mybatis插入数据到数据库成功,数据库却没有数据
mybatis插入数据到数据库成功,数据库却没有数据 错误描述: 解决办法: 错误描述: 编写测试类,显示数据插入成功: 但是去查看数据库中相应表中数据情况,缺发现没有数据! 解决办法: 查看核心配置 ...
- 使用mybatis插入数据到数据库中,显示插入成功,且没有报错,但是数据库中并没有新插入的数据的原因
使用mybatis插入数据到数据库中,显示插入成功,且没有报错,但是数据库中并没有数据的原因 没有提交事务,有时没有配置自动提交事务的设置,所以需要手动提交事务,即 sqlSession.commit ...
- 【Mybatis】Mybatis学习由浅入深(二)
前言 上篇介绍到了Mybatis的优缺点,这篇接下来介绍一下流程情况和配置信息. MyBatis简介 Mybatis工作流程 加载配置信息初始化 通过配置文件或注解将配置信息加载成Statemen ...
- (Mybatis)Mybatis简介和初步使用
1. Mybatis简介 1.1什么是Mybatis MyBatis 是一款优秀的持久层框架 它支持定制化 SQL.存储过程以及高级映射. MyBatis 避免了几乎所有的 JDBC 代码和手动设置参 ...
- MyBatis(三)MyBatis缓存和工作原理
MyBatis缓存 MyBatis提供了一级缓存和二级缓存,并且预留了集成第三方缓存的接口. 从上面MyBatis的包结构可以很容易看出跟缓存相关的类都在cache的package里,其底层是一个Ca ...
最新文章
- 使用Notepad++比较文件的差异
- week06 codelab02
- 数组不能将数值传给int_java数组查找常见情况
- 前天看了sigmastar新品发布,双核,1.2GHZ,真香!更多你想要了解的SSD201/202技术问题,看过来!启明云端MM帮你整理了!拿走不谢
- [数据库] MySQL基础知识之日期判断及添加排序序号
- 诈骗者如何伪造电子邮件地址,以及如何分辨
- 记录一次可能的order by注入
- Java-网络编程总结(转载)
- iOS xcode Bundle identifier is missing. NotificationServiceTest doesn't have *****
- 右键tomcat 选择 add and remove,出现的对话框里面没有我们的项目解决方法
- 手机微信群控系统和云控详细说明
- 出方向链路负载均衡技术(原理部分)
- MongoDB中shell基本使用
- window.print打印指定区域
- Gattaca-千钧一发
- 1到10所有数的立方
- 如何区分IO密集型、CPU密集型任务?
- html 文本转语音,百度文字转语音免费接口使用实例
- java爬虫教程 百度云_java视频教程java爬虫实战项目httpclient hbase springmvc solr
- musicothers