Mybatis学习笔记1
mybatis是一个orm持久化框架,mybatis专注于sql的操作
从3.0开始名字改变了:ibatis-mybatis
对象关系映射(Object Relational Mapping)
一、Mybatis搭建
1、导包
2、mybatis-config.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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED"><!-- 四大组件 --><!--池 提高效率管理连接 节省连接过程中消耗的资源 -->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/crm"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</dataSource>
</environment>
</environments>
<mappers><!-- 映射文件 现在不要配 ,有映射文件需要配在这里 包名前面的不要-->
<mapper resource="com/zy/mapper/UserMapper.xml"/>
</mappers>
</configuration>
3、创建表
4、创建实体类
package com.zy.entity; public class User {
private Integer uid;
private String username;
private String password;
private String address; public User() {
super();
// TODO Auto-generated constructor stub
} public User(Integer uid, String username, String password, String address) {
super();
this.uid = uid;
this.username = username;
this.password = password;
this.address = address;
} public Integer getUid() {
return uid;
}
public void setUid(Integer uid) {
this.uid = uid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
} @Override
public String toString() {
return "User [uid=" + uid + ", username=" + username + ", password=" + password + ", address=" + address + "]";
} }
5、搭建映射文件
UserMapper.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唯一表示此名字下的crud语句
-->
<mapper namespace="myuser"><!-- 无规律,起个代号就行,不要重复 -->
<!-- 提供了增删改查的相关标签 -->
<!-- 以后的sql都会写在这个配置文件中 -->
<!--<select id=""></select>
<insert id=""></insert>
<delete id=""></delete>
<update id=""></update> --> <!-- 查询 --> <!-- 如果结果是集合也填集合的泛型 -->
<!--
id:在此命名空间下唯一标识
resultType:查询结果的返回类型或者集合的泛型
-->
<select id="selectUser" resultType="com.zy.entity.User">
SELECT * FROM t_user
</select>
<delete id="deleteUser">
DELETE FROM t_user WHERE uid=1
</delete> <insert id="insertUseer">
INSERT INTO t_user VALUES(NULL,'bbbb','1234','德国')
</insert> <update id="updateUser">
UPDATE t_user SET username='武磊' WHERE uid=4
</update> <!-- 根据id查询用户 -->
<select id="selectUserByid" resultType="com.zy.entity.User">
SELECT * FROM t_user WHERE uid=#{id}<!-- 一个参数#{}占位符,里面写什么无所谓 -->
</select> <!-- 根据用户名和密码查询用户 -->
<select id="selectUserByNP" resultType="com.zy.entity.User">
SELECT * FROM t_user WHERE username=#{uu} AND password=#{pp}
</select> <!-- 特殊字符的转义 <![CDATA[]]> -->
<!-- xml把小于号当做标签 在sql语句中直接写小于号会报错 -->
<!-- The content of elements must consist of well-formed character data or markup. -->
<select id="selectUser007" resultType="com.zy.entity.User">
<![CDATA[ SELECT * FROM t_user WHERE uid<9 ]]>
</select> <!-- 多条件查询之对象传值 占位符要与对象属性保持一致,不然传不上去 -->
<insert id="insertUser007">
INSERT INTO t_user VALUES(NULL,#{username},#{password},#{address}) </insert>
</mapper>
<!-- 该实体类与表中列名有不一致的 使用as命别名解决 -->
<select id="uu" resultType="com.zy.entity.UU">
SELECT uid id,username name,password,address from t_user
</select>
6、在配置文件中引用映射文件
<mapper resource="com/zy/mapper/UserMapper.xml"/>
7、得到会话
package com.zy.test; import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map; 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 com.zy.entity.User; public class UserTest {
public static void main(String[] args) throws Exception {
//1读取配置文件得到会话工厂
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
//2sql会话工厂创建者
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//3生成sql会话工厂
SqlSessionFactory sf = sqlSessionFactoryBuilder.build(resourceAsStream);
//4得到mybatis和数据库会话对象
SqlSession session = sf.openSession(); //完成一个查询任务
/*// List<User> selectList = session.selectList("myuser.selectUser");
// for (User user : selectList) {
// System.out.println(user);
// } //完成一个删除任务(增删改需要提交事务commit)
// int delete = session.delete("myuser.deleteUser");
// session.commit();//相当于应用改变 //完成一个添加
// session.insert("myuser.insertUseer");
// session.commit(); //完成一个修改
// session.update("myuser.updateUser");
// session.commit(); //带一个参数的查询
// User uu = session.selectOne("myuser.selectUserByid",2);
// System.out.println(uu); //带两个参数的查询
//解决方案1把参数放对象中 2把参数放map中[map中的键需要与占位符一致] 灵活度更高
// Map<Object, Object> map = new HashMap();
// map.put("uu", "rose");
// map.put("pp", "654321");
//
// User uu = session.selectOne("myuser.selectUserByNP", map);
// System.out.println(uu); //调用带<号的
// List<User> selectList = session.selectList("myuser.selectUser007");
// for (User uu : selectList) {
// System.out.println(uu);
// }
*/
//用对象传递参数
session.insert("myuser.insertUser007",new User(null, "哈哈", "111111", "郑州"));
session.commit(); } }
8、使用mapper代理的方式
1).在实现的时候,查询字符串,需要namespace.sqlid,容易拼接出错,硬编码
2).参数是object类型,如果参数传入有问题,在编译的时候不报错
3).selectOne和seletList还需要判断
上述写法,有很多吐槽点,所以需要改成主流的方法
使用mapper代理的方式
package com.zy.mapper; import java.util.List; import com.zy.entity.User; public interface UserMapper {
//UserMapper.java接口和UserMapper.xml配套使用----关系密切
//查询用户
public List<User> getList(); //根据id删除用户
public void deleteById(int id); }
UserMapper.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">
<mapper namespace="com.zy.mapper.UserMapper">
<!-- 查询用户
1 namespace必须是接口全名称
2 id名必须和方法名一致
3 resultType和方法名的返回值保持一致,如果是集合和集合的泛型保持一致
4 接口和xml名字一致,放在同一包下
-->
<select id="getList" resultType="com.zy.entity.User">
SELECT * FROM t_user
</select> <delete id="deleteById">
DELETE FROM t_user WHERE uid=#{id}
</delete>
</mapper>
package com.zy.test; 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 com.zy.entity.User;
import com.zy.mapper.UserMapper; public class Test { public static void main(String[] args) throws Exception {
//新形势下,使用mapper代理完成调用
//1读取配置文件得到会话工厂
InputStream resourceAsStream = Resources.getResourceAsStream("mybatis-config.xml");
//2sql会话工厂创建者
SqlSessionFactoryBuilder sqlSessionFactoryBuilder = new SqlSessionFactoryBuilder();
//3生成sql会话工厂
SqlSessionFactory sf = sqlSessionFactoryBuilder.build(resourceAsStream);
//4得到mybatis和数据库会话对象
SqlSession session = sf.openSession();
//---------------------------
//旧的
//完成一个查询任务
// List<User> selectList = session.selectList("myuser.selectUser");
// for (User user : selectList) {
// System.out.println(user);
// }
//------------------------------------ //新的 //得到一个mapper代理
// UserMapper mapper = session.getMapper(UserMapper.class);//反射 UserMapper为接口
// //代理调用方法去查询
// List<User> list = mapper.getList();
// //遍历
// for (User user : list) {
// System.out.println(user);
//
// }
//------------------------ UserMapper mapper = session.getMapper(UserMapper.class);
mapper.deleteById(4);
session.commit();
} }
Mybatis学习笔记1的更多相关文章
- 【MyBatis学习笔记】
[MyBatis学习笔记]系列之预备篇一:ant的下载与安装 [MyBatis学习笔记]系列之预备篇二:ant入门示例 [MyBatis学习笔记]系列之一:MyBatis入门示例 [MyBatis学习 ...
- Mybatis学习笔记(二) 之实现数据库的增删改查
开发环境搭建 mybatis 的开发环境搭建,选择: eclipse j2ee 版本,mysql 5.1 ,jdk 1.7,mybatis3.2.0.jar包.这些软件工具均可以到各自的官方网站上下载 ...
- MyBatis:学习笔记(3)——关联查询
MyBatis:学习笔记(3)--关联查询 关联查询 理解联结 SQL最强大的功能之一在于我们可以在数据查询的执行中可以使用联结,来将多个表中的数据作为整体进行筛选. 模拟一个简单的在线商品购物系统, ...
- MyBatis:学习笔记(1)——基础知识
MyBatis:学习笔记(1)--基础知识 引入MyBatis JDBC编程的问题及解决设想 ☐ 数据库连接使用时创建,不使用时就释放,频繁开启和关闭,造成数据库资源浪费,影响数据库性能. ☐ 使用数 ...
- mybatis学习笔记(五) -- maven+spring+mybatis从零开始搭建整合详细过程(附demo和搭建过程遇到的问题解决方法)
文章介绍结构一览 一.使用maven创建web项目 1.新建maven项目 2.修改jre版本 3.修改Project Facts,生成WebContent文件夾 4.将WebContent下的两个文 ...
- mybatis学习笔记(四)-- 为实体类定义别名两种方法(基于xml映射)
下面示例在mybatis学习笔记(二)-- 使用mybatisUtil工具类体验基于xml和注解实现 Demo的基础上进行优化 以新增一个用户为例子,原UserMapper.xml配置如下: < ...
- mybatis学习笔记(二)-- 使用mybatisUtil工具类体验基于xml和注解实现
项目结构 基础入门可参考:mybatis学习笔记(一)-- 简单入门(附测试Demo详细过程) 开始体验 1.新建项目,新建类MybatisUtil.java,路径:src/util/Mybatis ...
- Mybatis学习笔记二
本篇内容,紧接上一篇内容Mybatis学习笔记一 输入映射和输出映射 传递简单类型和pojo类型上篇已介绍过,下面介绍一下包装类型. 传递pojo包装对象 开发中通过可以使用pojo传递查询条件.查询 ...
- Mybatis学习笔记之二(动态mapper开发和spring-mybatis整合)
一.输入映射和输出映射 1.1 parameterType(输入类型) [传递简单类型] 详情参考Mybatis学习笔记之一(环境搭建和入门案例介绍) 使用#{}占位符,或者${}进行sql拼接. [ ...
- mybatis学习笔记--常见的错误
原文来自:<mybatis学习笔记--常见的错误> 昨天刚学了下mybatis,用的是3.2.2的版本,在使用过程中遇到了些小问题,现总结如下,会不断更新. 1.没有在configurat ...
随机推荐
- aix5.3安装httpd服务
1.安装gcc(1)从IBM上下载 gcc-4.0.0-1.aix5.3.ppc.rpm gcc-cplusplus-4.0.0-1.aix5.3.ppc.rpm libgcc-4.0.0-1.aix ...
- #2020征文-开发板# 用鸿蒙开发AI应用(五)HDF 驱动补光灯
目录: 前言 硬件准备 HDF 驱动开发 总结 前言上一篇,我们在鸿蒙上运行了第一个程序,这一篇我们来编写一个驱动开启摄像头的红外补光灯,顺便熟悉一下鸿蒙上的 HDF 驱动开发. 硬件准备先查一下原理 ...
- 基于 OpenMP 的奇偶排序算法的实现
代码: #include <omp.h> #include <iostream> #include <cstdlib> #include <ctime> ...
- 【MySQL】使用WHERE子句 - 过滤数据
第6章 过滤数据 文章目录 第6章 过滤数据 1.使用WHERE子句 2.WHERE子句操作符 2.1.检查单个值 2.2.不匹配检查 2.3.范围值检查 2.4.空值检查 3.小结 简单记录 - M ...
- C# 请求被中止: 未能创建 SSL/TLS 安全通道。 设置SecurityProtocol无效
今天为了获取一张图片,用了一段代码: ServicePointManager.ServerCertificateValidationCallback += new RemoteCertificateV ...
- 4、python+selenium实现12306模拟登录
简介: 这里是利用了selenium+图片识别验证,来实现12306的模拟登录,中间也参考了好几个项目,实现了这个小demo,中间也遇到了很多的坑,主要难点在于图片识别和滑动验证这两个方面,图片识别是 ...
- 翻译 - ASP.NET Core 基本知识 - 通用主机 (Generic Host)
翻译自 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-5.0 ...
- JavaScript中函数的this指向!
JavaScript的this的指向问题! 这是我自己敲的, 报错! <button>点击查看绑定事件的this指向!</button> <script> // 函 ...
- C#高级编程第11版 - 第五章 索引
[1]5.1 泛型概述 1.通过泛型,你可以创建独立于特定类型(contained types)以外的方法和类,而不用为不同类型编写多份同样功能的代码,你只需要创建一个方法或者类. 2.泛型类使用泛型 ...
- Golang 性能优化实战
小结: 1. 性能查看工具 pprof,trace 及压测工具 wrk 或其他压测工具的使用要比较了解. 代码逻辑层面的走读非常重要,要尽量避免无效逻辑. 对于 golang 自身库存在缺陷的,可以寻 ...