需求:

实现以下功能:
1. 根据用户id查询一个用户信息
2. 根据用户名称模糊查询用户信息列表
3. 添加用户
4. 更新用户
5. 删除用户

第一步:创建java工程

使用eclipse创建java工程,jdk使用1.7.0_72。

第二步:加入jar包

加入mybatis核心包、依赖包、数据驱动包。

第三步:log4j.properties

mybatis默认使用log4j作为输出日志信息。
在classpath下创建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

第四步:SqlMapConfig.xml

在classpath下创建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="root" /><property name="password" value="123" /></dataSource></environment></environments>
</configuration>  

SqlMapConfig.xml是mybatis核心配置文件,上边文件的配置内容为数据源、事务管理。

第五步:pojo类

Pojo类作为mybatis进行sql映射使用,po类通常与数据库表对应(数据库的字段名和属性名对应),User.java如下:

Public class User {private int id;private String address;// 地址private String username;// 用户姓名private String sex;// 性别private Date birthday;// 生日
get/set……

第六步:程序编写

查询:(需求1,2的实现)

1.写映射文件:
在classpath下的sqlmap目录下创建sql映射文件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语句,后面会讲另一层非常重要的作用。 -->
<mapper namespace="test">
<!-- 根据Id获取用户信息 ,返回一条数据-->
<!-- 通过<select>进行数据库查询
id:标识映射文件中的sql
将sql语句封装到mappedStatement对象中,所以将id称为statement的id
parameterType:指定输入参数的类型
#{}:表示一个占位符
#{id}:其中的id表示接收输入的参数,参数的名称就是id,如果输入参数为简单类型,#{}中的参数名可以任意,可以value也可以其它名称。
resultType:指定sql输出结果的所映射的java对象类型。select指定resultType表示将单条记录映射成的java对象。-->
<select id="findUserById" parameterType="int" resultType="com.huihui.pojo.User">select * from user where id=#{id}
</select>
<!-- 自定义条件查询用户列表,可能返回多条 -->
<!--
${}:表示拼接sql串,将接收到的参数的内容不加任何修饰拼接到sql中。
使用${}拼接sql,可能引起sql注入
${value}:接收输入参数的内容,如果传入的类型是简单类型,${}中只能使用value-->
<select id="findUserByUsername" parameterType="java.lang.String" resultType="com.huihui.pojo.User">select * from user where username like '%${value}%'
</select>
</mapper>

2.加载映射文件
mybatis框架需要加载映射文件,将User.xml添加在SqlMapConfig.xml,如下:

<mappers><mapper resource="sqlmap/User.xml"/>
</mappers>  

3.测试程序

package com.huihui.first;
import java.io.IOException;
import java.io.InputStream;
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 com.huihui.pojo.User;
public class MyBatisFirst {@Test//根据id查询用户信息,得到一条记录结果public void findUserByIdTest() throws IOException{String resource = "SqlMapConfig.xml";//mybatis配置文件InputStream inputStream = Resources.getResourceAsStream(resource);//得到配置文件流//1.创建会话工厂,传入mybatis的配置文件信息SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);//2.通过工厂得到SqlSessionSqlSession sqlSession = sqlSessionFactory.openSession();//3.通过SqlSession操作数据库//第一个参数:映射文件中的statement的id,等于=namespace+"."+statement的id//第二个参数:指定和映射文件所匹配的parameterType类型的参数//sqlSession.selectOne的结果是与映射文件中resultType类型的对象所匹配的User user = sqlSession.selectOne("test.findUserById", 1);System.out.println(user);//4.释放资源sqlSession.close();}@Test//根据用户名模糊查询用户信息public void findUserByUsername(){SqlSession ss = null;try {String resource = "SqlMapConfig.xml";InputStream is = Resources.getResourceAsStream(resource);SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);ss = ssf.openSession();List<User> list = ss.selectList("test.findUserByUsername", "小明");System.out.println(list.size());} catch (Exception e) {e.printStackTrace();} finally{if(ss!=null){ss.close();}}}
}

细节重点说明:
1.#{}和${}
#{}表示一个占位符号,通过#{}可以实现preparedStatement向占位符中设置值,自动进行java类型和jdbc类型转换,#{}可以有效防止sql注入。 #{}可以接收简单类型值或pojo属性值。 如果parameterType传输单个简单类型值,#{}括号中可以是value或其它名称。如果#{}接收的类型是pojo类型时,是使用OGNL读取对象中的属性值,通过属性.属性.属性….的方式获取对象属性值。
${}表示拼接sql串,通过${}可以将parameterType 传入的内容拼接在sql中且不进行jdbc类型转换, ${}可以接收简单类型值或pojo属性值,如果parameterType传输单个简单类型值,${}括号中只能是value。如果${}接收的类型是pojo类型时,是使用OGNL读取对象中的属性值,通过属性.属性.属性….的方式获取对象属性值。
2.parameterType和resultType
parameterType:指定输入参数类型,mybatis通过ognl从输入对象中获取参数值拼接在sql中。
resultType:指定输出结果类型,mybatis将sql查询结果的一行记录数据映射为resultType指定类型的对象。

3.selectOne和selectList
selectOne查询一条记录,如果使用selectOne查询多条记录则抛出异常:

org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 3at org.apache.ibatis.session.defaults.DefaultSqlSession.selectOne(DefaultSqlSession.java:70)   

selectList可以查询一条或多条记录。

添加(需求3的实现)

1.映射文件:

<!-- 添加用户 -->
<!--
parameterType:指定输入参数类型为pojo
#{}中指定pojo的属性名,接收到pojo对象的属性值-->
<insert id="insertUser" parameterType="com.huihui.pojo.User" >insert into user(username,birthday,sex,address) value (#{username},#{birthday},#{sex},#{address})
</insert>  

2.测试代码:

  @Test//添加用户信息public void insertUser(){SqlSession ss = null;try {String resource = "SqlMapConfig.xml";InputStream is = Resources.getResourceAsStream(resource);SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);ss = ssf.openSession();User user = new User();user.setUsername("小灰灰");user.setBirthday(new Date());user.setSex("1");user.setAddress("山东东营");ss.insert("test.insertUser", user);//提交事务ss.commit();} catch (Exception e) {e.printStackTrace();} finally{if(ss!=null){ss.close();}}}  

进一步说明:
mysql自增主键返回:

<!-- 添加用户 -->
<!--
parameterType:指定输入参数类型为pojo
#{}中指定pojo的属性名,接收到pojo对象的属性值-->
<insert id="insertUser" parameterType="com.huihui.pojo.User" >insert into user(username,birthday,sex,address) value (#{username},#{birthday},#{sex},#{address})<!-- selectKey将主键返回,需要再返回 --><selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">select LAST_INSERT_ID()</selectKey>
</insert>  

上边代码说明:

  • LAST_INSERT_ID():得到刚刚insert进去记录的主键值,只适用于自增主键
  • keyProperty:将查询到的主键值设置到parameterType指定的对象的那个属性,这里就是将查询到的主键值设置到了User对象的id属性中
  • order:表示的是select LAST_INSERT_ID()语句相对于insert into user(username,birthday,sex,address) value (#{username},#{birthday},#{sex},#{address})语句的执行顺序

mysql使用uuid实现主键和返回主键:

<insert id="insertUser" parameterType="com.huihui.pojo.User" >
<selectKey resultType="java.lang.String" order="BEFORE" keyProperty="id">select uuid()
</selectKey>insert into user(id,username,birthday,sex,address) values (#{id},#{username},#{birthday},#{sex},#{address})
</insert>  

上面代码的说明:
执行过程:首先通过uuid()得到主键,将主键设置到user对象的id属性中,然后在insert执行时,从user对象中取出id属性值。因此order=”before”

oracle序列生成主键和返回主键:
首先自定义一个序列且用于生成主键,然后:

<insert id="insertUser" parameterType="com.huihui.pojo.User" >
<selectKey resultType="java.lang.String" order="BEFORE" keyProperty="id">select 自定义序列的名字.Nextval from dual;
</selectKey>insert into user(id,username,birthday,sex,address) values (#{id},#{username},#{birthday},#{sex},#{address})
</insert>  

上面代码的说明:
执行过程与上面的mysql使用uuid()的执行过程相同,因此也是order=”before”

删除(需求5的实现):

1.映射文件:

<!-- 删除用户 -->
<!-- 根据id删除用户,需要输入id值 -->
<delete id="deleteUser" parameterType="java.lang.Integer">delete from user where id = #{id}
</delete>  

2.测试代码:

    public void deleteUser(){SqlSession ss = null;try {String resource = "SqlMapConfig.xml";InputStream is = Resources.getResourceAsStream(resource);SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);ss = ssf.openSession();ss.delete("test.deleteUser", 27);//删除id为27的用户ss.commit();} catch (Exception e) {e.printStackTrace();} finally {if(ss!=null){ss.close();}}}  

更新(需求4的实现):

1.映射文件:

<!-- 更新用户 -->
<!-- 根据id更新用户,需要传入用户的id和用户的更新信息(也就是传入User对象,但是user对象中的id必须存在) -->
<update id="updateUser" parameterType="com.huihui.pojo.User">update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id}
</update>  

2.测试代码:

public void updateUser(){SqlSession ss = null;try {String resource = "SqlMapConfig.xml";InputStream is = Resources.getResourceAsStream(resource);SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(is);ss = ssf.openSession();//要更新用户的信息对象User user = new User();user.setId(30);user.setUsername("小芳芳");user.setSex("2");user.setBirthday(new Date());user.setAddress("山东临沂");ss.update("test.updateUser", user);ss.commit();} catch (Exception e) {e.printStackTrace();} finally {if(ss!=null){ss.close();}}}  

入门demo---Mybatis学习笔记(三)相关推荐

  1. MyBatis学习笔记(三) 关联关系

    首先给大家推荐几个网页: http://blog.csdn.net/isea533/article/category/2092001 没事看看 - MyBatis工具:www.mybatis.tk h ...

  2. Mybatis学习笔记(二)【框架基础搭建】

    Mybatis框架基础搭建 一.数据库搭建 二.创建一个maven工程 三.在pom.xml中导入依赖 四.创建一个mybatis的核心配置文件 配置连接数据库的字段值文件(如果使用方式一就不需要配置 ...

  3. motan学习笔记 三 motan Demo 分析

    motan学习笔记 一 微博轻量级RPC框架Motan motan学习笔记 二 motan架构分析 motan学习笔记 三 motan Demo 分析 motan学习笔记 四 motan Demo 之 ...

  4. mybatis学习笔记(3)-入门程序一

    2019独角兽企业重金招聘Python工程师标准>>> mybatis学习笔记(3)-入门程序一 标签: mybatis [TOC] 工程结构 在IDEA中新建了一个普通的java项 ...

  5. java学习笔记(三):前端miniUI控件库入门

    java学习笔记(三):前端miniUI控件库入门 最近在一家公司实习学习,一上来就需要学习了解相关的前端内容--miniUI.而这个内容自己本身并没有了解学习过,上手也是遇到了不少的问题,于是想把自 ...

  6. MyBatis多参数传递之混合方式——MyBatis学习笔记之十五

    在本系列文章的<MyBatis多参数传递之Map方式示例>一文中,网友mashiguang提问如下的方法如何传递参数:public List findStudents(Map condit ...

  7. 【应用篇】MyBatis学习笔记

    MyBatis学习笔记 一 环境配置 1 什么是MyBatis? ​ MyBatis 是支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架.MyBatis 消除了几乎所有的 JDBC 代码和参 ...

  8. MongoDB 入门教程实战学习笔记-31-mongo 聚合查询管道 Aggregation Pipieline

    aggregation 聚合操作处理数据记录并返回计算结果. 聚合操作将多个文档中的值组合在一起, 并且可以对分组数据执行各种操作以返回单个结果. mongodb 提供了三种执行聚合的方法: 聚合管道 ...

  9. openCV4.0 C++ 快速入门30讲学习笔记(自用 代码+注释)详细版

    课程来源:哔哩哔哩 环境:OpenCV4.5.1 + VS2019 目录 002.图像色彩空间转换 003.图像对象的创建与赋值 004.图像像素的读写操作 005.图像像素的算术操作(加减乘除4种不 ...

  10. 深度学习入门之PyTorch学习笔记:卷积神经网络

    深度学习入门之PyTorch学习笔记 绪论 1 深度学习介绍 2 深度学习框架 3 多层全连接网络 4 卷积神经网络 4.1 主要任务及起源 4.2 卷积神经网络的原理和结构 4.2.1 卷积层 1. ...

最新文章

  1. win10怎么设置开机启动项目_苹果mac开机启动项怎么设置
  2. Java各类型变量之间的转换
  3. 表格合并行_Word制作验收单表格,很简单,快来学习吧
  4. nodeJS中读写文件方法的区别
  5. 「CH2101」可达性统计 解题报告
  6. SketchUp Pro 2019 for Mac(草图大师)
  7. efi文件错误服务器崩溃,[转自百度]关于系统安装时候弹出提示winload.efi文件损坏...
  8. Keras 中文文档地址
  9. 洞察·分析·管理 | 解读良品铺子的客户体验管理三部曲
  10. 无线局域网怎么设置,更加安全?
  11. 5.1 定积分的概念与性质
  12. 我是如何设计一个包办所有对企政策的城市平台
  13. [python] 分治法查找数组元素的最大值和最小值
  14. maya2020卸载不干净_MAYA 卸载不干净,怎么完全彻底删除清理干净MAYA各种残留注册表和文件?...
  15. etcher制作linux启动盘,使用Etcher来创建可启动盘的方法
  16. 每秒处理10万高并发订单支付系统架构
  17. curator(curator)
  18. 医学图像处理国际学术会议2021年投稿截止时间及举办时间总结
  19. 饿了么ui elementui 浏览器日志报错的检查思路
  20. 微信高级群发之一上传图文消息素材

热门文章

  1. (一) : iview-form 表单循环数组 - 验证规则
  2. 怎么判断适合学java_如何知道自己是否适合学习java开发
  3. 代替for循环的常见问题
  4. 无线路由器的配置实例
  5. PHP函数——urlencode() 函数
  6. spring项目的 WebApplicationContext 初始化两次的解决方法
  7. 优雅且高效的使用Chrome Developer Tools
  8. 思科设备路由器间IPsec ×××实现私网之间通信实战
  9. 安装ORACLE 11。2.0.3 配置GRID执行脚本信息记录
  10. 看来cmwap真的是没有可以使用的邮件客户端了