传统的方式写mybatis的应用程序
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的应用程序相关推荐
- 这么多移动开发的方式,传统方式写安卓、IOS 还有出路吗?
前言 我所说的传统的方式是指,用 Java 或者 Kotlin 写安卓,用 Object-C 或者 Swift 写 IOS. 回想我 2014 年上大学的时候,老师跟我们说最近两年移动端特别的火,出去 ...
- 与传统招聘方式相比,小程序招聘都有哪些优势?
在企业的竞争中,关于人才的竞争一直都是重中之重.然而,现今主流的招聘方式,都存在着致命缺点:传统的线下招聘如同大海捞针,效率极低:在互联网招聘平台上寻找人才,却要面临平台的各项收费,成本居高不下. 与 ...
- 三菱fx3u plc程序自己写的三菱fx3u程序 有伺服定位控制 触摸屏 模拟量 FB模块 编程方式很清楚明了
三菱fx3u plc程序自己写的三菱fx3u程序 有伺服定位控制 触摸屏 模拟量 FB模块 编程方式很清楚明了 适合初学者学习 :828668626283056工控老司机
- Mybatis(黑马程序员)
1. Mybatis基础操作 1.1 需求 需求说明: 根据资料中提供的<tlias智能学习辅助系统>页面原型及需求,完成员工管理的需求开发. 通过分析以上的页面原型和需求,我们确定了功能 ...
- 向量数据库入坑:传统文本检索方式的降维打击,使用 Faiss 实现向量语义检索
在上一篇文章<聊聊来自元宇宙大厂 Meta 的相似度检索技术 Faiss>中,我们有聊到如何快速入门向量检索技术,借助 Meta AI(Facebook Research)出品的 fais ...
- [转] 写给未来的程序媛 ----- 加油,姑娘~
可能是因为正当校招季,最近关于程序媛(女性程序员)的话题很火,朋友圈里一下就冒出很多相关文章,有的写自己求职入职的心路历程,有的从客观数据角度分析女性优劣势,也有过来人分享自己和周围人的看法,加之几天 ...
- 写给未来的程序媛|洞见
王妮 ThoughtWorks 可能是因为正当校招季,最近关于程序媛(女性程序员)的话题很火,朋友圈里一下就冒出很多相关文章,有的写自己求职入职的心路历程,有的从客观数据角度分析女性优劣势,也有过来人 ...
- 实际测试例子+源码分析的方式解剖MyBatis缓存的概念
前言: 前方高能! 本文内容有点多,通过实际测试例子+源码分析的方式解剖MyBatis缓存的概念,对这方面有兴趣的小伙伴请继续看下去~ 欢迎工作一到五年的Java工程师朋友们加入Java架构开发:79 ...
- javascript 编码规范 用更合理的方式写 javascript
目录 类型 引用 对象 数组 解构 Strings 函数 箭头函数 构造器 模块 Iterators and Generators 属性 变量 Hoisting 比较运算符和等号 代码块 注释 空白 ...
- python命令行大全-用什么库写 Python 命令行程序(示例代码详解)
一.前言 在近半年的 Python 命令行旅程中,我们依次学习了 argparse . docopt . click 和 fire 库的特点和用法,逐步了解到 Python 命令行库的设计哲学与演变. ...
最新文章
- 《网络攻防实践》第二周作业
- ListView用法
- cdh5.12.1 service monitor监控状态_来,我们在重新说下,线程状态?
- JAVA报错是一层一层的吗_Java异常处理:给程序罩一层保险
- 6.方法(go语言学习笔记)
- Strange Words 4
- CCNA配置试验之七 PPP中PAP和CHAP的验证
- react遍历对象的值_React 原理之实现 createElement 和 render 方法
- 安装Jmeter插件管理器
- linux的网卡部分
- HDU 2844 Coins (多重背包)
- 【Codevs3027】线段覆盖2
- java.lang.IllegalArgumentException 不合法的参数异常
- 为什么重写equals方法时,要求必须重写hashCode方法?
- Redis 禁止使用耗时命令和时间复杂度为O(n)的命令
- windows下使用linux terminal
- 万年历插件软件测试,中华万年历app测试用例.xls
- 机器人油封_机器人油封 机器人减速机 机器人伺服电机油封 KVNOK油封
- pycharm异常问题之Unable to save settings: Failed to save settings. Please restart PyCharm
- 直播播控和分发基础架构
热门文章
- skyfire塞班_Symbian Foundation的灯光熄灭
- linux 用户搬家后安装的软件,linux软件搬家
- 小试牛刀__GAN实战项目之mnist数据集(二)
- PSP金手指大全1215个CMF金手指合集
- 查看显卡型号命令_如何查看电脑显卡型号配置 快速查看显卡配置信息方法
- 你理解的精益可能是错的!——从源头重新解读精益
- 家用计算机的计算速度,计算机CPU运算速度是多少
- 登陆成功率99% 云知声携手平安好医生推声纹登录系统
- PDF文件怎么解密?教你三种解密的方法
- 拒绝反爬虫!教你搞定爬虫验证码