1、环境搭建

pom.xml文件

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  <modelVersion>4.0.0</modelVersion>  <groupId>web-test-com</groupId>  <artifactId>MyBatis</artifactId>  <version>0.0.1-SNAPSHOT</version>  <packaging>war</packaging>  <dependencies>  <dependency>  <groupId>junit</groupId>  <artifactId>junit</artifactId>  <version>4.12</version>  <scope>provided</scope>  </dependency>  <dependency>  <groupId>log4j</groupId>  <artifactId>log4j</artifactId>  <version>1.2.17</version>  </dependency>  <dependency>  <groupId>org.mybatis</groupId>  <artifactId>mybatis</artifactId>  <version>3.1.1</version>  </dependency>  <dependency>  <groupId>mysql</groupId>  <artifactId>mysql-connector-java</artifactId>  <version>5.1.38</version>  </dependency>  </dependencies>
</project>  

2、SqlMappingConfig.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>  <!-- 加载属性文件 -->  <properties resource="db.properties">  <!--properties中还可以配置一些属性名和属性值 -->  <!-- <property name="jdbc.driver" value=""/> -->  </properties>  <!-- 全局配置参数,需要时再设置 -->  <!-- <settings> </settings> -->  <typeAliases>  <!-- 别名定义 -->  <!-- 针对单个别名定义 type:类型的路径 alias:别名 -->  <!-- <typeAlias type="cn.czy.mybatis.po.User" alias="user"/> -->  <typeAlias type="cn.com.czy.mybatis.pojo.User" alias="user" />  <!-- 批量别名定义 指定包名,mybatis自动扫描包中的po类,自动定义别名,别名就是类名(首字母大写或小写都可以) -->  <package name="cn.com.mybatis.mapper" />  </typeAliases>  <!-- 和spring整合后 environments配置将废除 -->  <environments default="development">  <environment id="development">  <!-- 使用jdbc事务管理,事务控制由mybatis -->  <transactionManager type="JDBC" />  <!-- 数据库连接池,由mybatis管理 -->  <dataSource type="POOLED">  <property name="driver" value="${jdbc.driver}" />  <property name="url" value="${jdbc.url}" />  <property name="username" value="${jdbc.username}" />  <property name="password" value="${jdbc.password}" />  </dataSource>  </environment>  </environments>  <!-- 加载 映射文件 -->  <mappers>  <!--通过resource方法一次加载一个映射文件 -->  <mapper resource="sqlMapper/user.xml" />  <mapper resource="sqlMapper/userMapper.xml" />  <mapper resource="sqlMapper/OrdersMapperCustom.xml"/>  <!-- 批量加载mapper 指定mapper接口的包名,mybatis自动扫描包下边所有mapper接口进行加载 -->  <!-- 遵循一些规范:需要将mapper接口类名和mapper.xml映射文件名称保持一致,且在一个目录 -->  <!-- 中 上边规范的前提是:使用的是mapper代理方法   <package name="cn.com.czy.mybatis.two.mapper" />-->  </mappers>  </configuration>  

3、映射文件user.xml(注意在SqlMappingConfig.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语句 -->  <!-- 将sql语句封装到mappedStatement对象中,所以将id称为statement的id -->  <!-- parameterType:指定输入 参数的类型,这里指定int型 #{}表示一个占位符号 -->  <!-- #{id}:其中的id表示接收输入 的参数,参数名称就是id,如果输入 -->  <!-- 参数是简单类型,#{}中的参数名可以任意,可以value或其它名称 -->  <!-- resultType:指定sql输出结果 的所映射的java对象类型,select指定resultType表示将单条记录映射成的java对象。 -->  <select id="findUserById" parameterType="int"  resultType="user">  <!-- 需求:通过select执行id查询用户表的记录 -->  SELECT * FROM USER WHERE id=#{value}  </select>  <!-- resultType:指定就是单条记录所映射的java对象类型  -->  <!-- ${}:表示拼接sql串,将接收到参数的内容不加任何修饰拼接在sql中。 使用${}拼接sql,引起 sql注入  -->  <!-- ${value}:接收输入 参数的内容,如果传入类型是简单类型,${}中只能使用value -->  <!-- 这个mapper文件user对象已经用别名代替 -->  <select id="findUserByName" parameterType="java.lang.String"  resultType="user">  <!-- 根据用户名称模糊查询用户信息,可能返回多条  -->  SELECT * FROM USER WHERE username LIKE '%${value}%'  </select>  <!-- parameterType:指定输入 参数类型是pojo(包括 用户信息)-->   <!-- #{}中指定pojo的属性名,接收到pojo对象的属性值,mybatis通过OGNL获取对象的属性值 -->  <insert id="insertUser" parameterType="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">  <!-- 将插入数据的主键返回,返回到user对象中 -->  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>  <delete id="deleteUser" parameterType="java.lang.Integer">  <!-- 删除 用户 根据id删除用户,需要输入 id值 -->  delete from user where  id=#{id}  </delete>  <!-- 需要传入用户的更新信息 parameterType指定user对象,包括 id和更新信息, -->  <!-- 注意:id必须存在 -->  <!-- #{id}:从输入 user对象中获取id属性值 -->  <update id="updateUser" parameterType="user">  <!-- 根据id更新用户 分析: 需要传入用户的id -->  update user set  username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}  where id=#{id}  </update>  </mapper>  

4、pojo类

import java.util.Date;  /** *  * <p>Title: User</p> * <p>Description:用户pojo </p> */
public class User {  //属性名和数据库表的字段对应  private int id;  private String username;    // 用户姓名  private String sex;     // 性别  private Date birthday;      // 生日  private String address;     // 地址  public int getId() {  return id;  }  public void setId(int id) {  this.id = id;  }  public String getUsername() {  return username;  }  public void setUsername(String username) {  this.username = username;  }  public String getSex() {  return sex;  }  public void setSex(String sex) {  this.sex = sex;  }  public Date getBirthday() {  return birthday;  }  public void setBirthday(Date birthday) {  this.birthday = birthday;  }  public String getAddress() {  return address;  }  public void setAddress(String address) {  this.address = address;  }  @Override  public String toString() {  return "User [id=" + id + ", username=" + username + ", sex=" + sex  + ", birthday=" + birthday + ", address=" + address + "]";  }  }   

5、测试类(传统的不用接口、只是简单的)

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 cn.com.czy.mybatis.pojo.User;
import org.junit.Test;  /** * 《单表映射》 * 入门程序总结:这是简单的mybatis入门程序 * -- 1、映射(mapper)文件是user.xml --  --  * -- 2、逻辑基本的resultType、parameterType等一下基础知识  --  --  * -- 3、SqlSessionFactory、SqlSession的原理  --  --  */
public class MybatisFirst {  public SqlSessionFactory getSqlSessionFactory() throws IOException {  // mybatis配置文件  String resource = "config/SqlMapConfig.xml";  // 得到配置文件流  InputStream inputStream = Resources.getResourceAsStream(resource);  // 创建会话工厂,传入mybatis的配置文件信息  SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);  return sqlSessionFactory;  }  // 根据id查询用户信息,得到一条记录结果  @Test  public void findUserByIdTest() throws IOException {  // 通过工厂得到SqlSession  SqlSession sqlSession = this.getSqlSessionFactory().openSession();  // 通过SqlSession操作数据库  // 第一个参数:映射文件中statement的id,等于=namespace+"."+statement的id  // 第二个参数:指定和映射文件中所匹配的parameterType类型的参数  // sqlSession.selectOne结果 是与映射文件中所匹配的resultType类型的对象  // selectOne查询出一条记录  User user = sqlSession.selectOne("test.findUserById", 1);  System.out.println(user);  // 释放资源  sqlSession.close();  }  // 根据用户名称模糊查询用户列表  @Test  public void findUserByNameTest() throws IOException {  // 通过工厂得到SqlSession  SqlSession sqlSession = this.getSqlSessionFactory().openSession();  // list中的user和映射文件中resultType所指定的类型一致  List<User> list = sqlSession.selectList("test.findUserByName", "小明");  System.out.println("信息:" + list);  sqlSession.close();  }  // 添加用户信息  @Test  public void insertUserTest() throws IOException {  // 通过工厂得到SqlSession  SqlSession sqlSession = this.getSqlSessionFactory().openSession();  // 插入用户对象  User user = new User();  user.setUsername("王小军");  user.setBirthday(new Date());  user.setSex("1");  user.setAddress("河南郑州");  sqlSession.insert("test.insertUser", user);  // 提交事务  sqlSession.commit();  // 获取用户信息主键  System.out.println(user.getId());  // 关闭会话  sqlSession.close();  }  // 根据id删除 用户信息  @Test  public void deleteUserTest() throws IOException {  // 通过工厂得到SqlSession  SqlSession sqlSession = this.getSqlSessionFactory().openSession();  // 传入id删除 用户  sqlSession.delete("test.deleteUser", 49);  // 提交事务  sqlSession.commit();  // 关闭会话  sqlSession.close();  }  // 更新用户信息  @Test  public void updateUserTest() throws IOException {  // 通过工厂得到SqlSession  SqlSession sqlSession = this.getSqlSessionFactory().openSession();  // 更新用户信息  User user = new User();  // 必须设置id  user.setId(41);  user.setUsername("王大军");  user.setBirthday(new Date());  user.setSex("2");  user.setAddress("河南郑州");  sqlSession.update("test.updateUser", user);  // 提交事务  sqlSession.commit();  // 关闭会话  sqlSession.close();  }  }  

传统的方式写mybatis的应用程序相关推荐

  1. 这么多移动开发的方式,传统方式写安卓、IOS 还有出路吗?

    前言 我所说的传统的方式是指,用 Java 或者 Kotlin 写安卓,用 Object-C 或者 Swift 写 IOS. 回想我 2014 年上大学的时候,老师跟我们说最近两年移动端特别的火,出去 ...

  2. 与传统招聘方式相比,小程序招聘都有哪些优势?

    在企业的竞争中,关于人才的竞争一直都是重中之重.然而,现今主流的招聘方式,都存在着致命缺点:传统的线下招聘如同大海捞针,效率极低:在互联网招聘平台上寻找人才,却要面临平台的各项收费,成本居高不下. 与 ...

  3. 三菱fx3u plc程序自己写的三菱fx3u程序 有伺服定位控制 触摸屏 模拟量 FB模块 编程方式很清楚明了

    三菱fx3u plc程序自己写的三菱fx3u程序 有伺服定位控制 触摸屏 模拟量 FB模块 编程方式很清楚明了 适合初学者学习 :828668626283056工控老司机

  4. Mybatis(黑马程序员)

    1. Mybatis基础操作 1.1 需求 需求说明: 根据资料中提供的<tlias智能学习辅助系统>页面原型及需求,完成员工管理的需求开发. 通过分析以上的页面原型和需求,我们确定了功能 ...

  5. 向量数据库入坑:传统文本检索方式的降维打击,使用 Faiss 实现向量语义检索

    在上一篇文章<聊聊来自元宇宙大厂 Meta 的相似度检索技术 Faiss>中,我们有聊到如何快速入门向量检索技术,借助 Meta AI(Facebook Research)出品的 fais ...

  6. [转] 写给未来的程序媛 ----- 加油,姑娘~

    可能是因为正当校招季,最近关于程序媛(女性程序员)的话题很火,朋友圈里一下就冒出很多相关文章,有的写自己求职入职的心路历程,有的从客观数据角度分析女性优劣势,也有过来人分享自己和周围人的看法,加之几天 ...

  7. 写给未来的程序媛|洞见

    王妮 ThoughtWorks 可能是因为正当校招季,最近关于程序媛(女性程序员)的话题很火,朋友圈里一下就冒出很多相关文章,有的写自己求职入职的心路历程,有的从客观数据角度分析女性优劣势,也有过来人 ...

  8. 实际测试例子+源码分析的方式解剖MyBatis缓存的概念

    前言: 前方高能! 本文内容有点多,通过实际测试例子+源码分析的方式解剖MyBatis缓存的概念,对这方面有兴趣的小伙伴请继续看下去~ 欢迎工作一到五年的Java工程师朋友们加入Java架构开发:79 ...

  9. javascript 编码规范 用更合理的方式写 javascript

    目录 类型 引用 对象 数组 解构 Strings 函数 箭头函数 构造器 模块 Iterators and Generators 属性 变量 Hoisting 比较运算符和等号 代码块 注释 空白 ...

  10. python命令行大全-用什么库写 Python 命令行程序(示例代码详解)

    一.前言 在近半年的 Python 命令行旅程中,我们依次学习了 argparse . docopt . click 和 fire 库的特点和用法,逐步了解到 Python 命令行库的设计哲学与演变. ...

最新文章

  1. 《网络攻防实践》第二周作业
  2. ListView用法
  3. cdh5.12.1 service monitor监控状态_来,我们在重新说下,线程状态?
  4. JAVA报错是一层一层的吗_Java异常处理:给程序罩一层保险
  5. 6.方法(go语言学习笔记)
  6. Strange Words 4
  7. CCNA配置试验之七 PPP中PAP和CHAP的验证
  8. react遍历对象的值_React 原理之实现 createElement 和 render 方法
  9. 安装Jmeter插件管理器
  10. linux的网卡部分
  11. HDU 2844 Coins (多重背包)
  12. 【Codevs3027】线段覆盖2
  13. java.lang.IllegalArgumentException 不合法的参数异常
  14. 为什么重写equals方法时,要求必须重写hashCode方法?
  15. Redis 禁止使用耗时命令和时间复杂度为O(n)的命令
  16. windows下使用linux terminal
  17. 万年历插件软件测试,中华万年历app测试用例.xls
  18. 机器人油封_机器人油封 机器人减速机 机器人伺服电机油封 KVNOK油封
  19. pycharm异常问题之Unable to save settings: Failed to save settings. Please restart PyCharm
  20. 直播播控和分发基础架构

热门文章

  1. skyfire塞班_Symbian Foundation的灯光熄灭
  2. linux 用户搬家后安装的软件,linux软件搬家
  3. 小试牛刀__GAN实战项目之mnist数据集(二)
  4. PSP金手指大全1215个CMF金手指合集
  5. 查看显卡型号命令_如何查看电脑显卡型号配置 快速查看显卡配置信息方法
  6. 你理解的精益可能是错的!——从源头重新解读精益
  7. 家用计算机的计算速度,计算机CPU运算速度是多少
  8. 登陆成功率99% 云知声携手平安好医生推声纹登录系统
  9. PDF文件怎么解密?教你三种解密的方法
  10. 拒绝反爬虫!教你搞定爬虫验证码