网站首页 > 精选教程 正文
猿灯塔 全文略长 希望对各位有帮助!
另外!文末有令你们心动的白嫖惊喜哦!
想要的朋友关注一下小编、转发文章并私聊我哦!
Mybais简介:
- 作用:数据访问层框架。底层是对JDBC的封装。
- 优点:使用mybatis时不需要编写实现类,只需要写需要执行的sql命令即可。
一、MVC开发模式
- 先设计数据库
- 写实体类-pojo,
- 持久层-和数据库交互的
- 业务层-处理业务请求
- 表现层-用于展示数据。
二、项目之间的数据通信
- 项目之间如果想使用类,则在该项目下右键export,选择如下界面,选择JAR file。
三、环境搭建
1、导入jar包
2、在src下新建全局配置文件(编写JDBC的四个变量)
- 前面哪个dtd文件可以在mybatis的中文参考手册中看到复制过来就可以了。不写这句话的话是没有提示的,写的比较费劲。
- 中间有一个mysql的url 中间的&必须用&;才可以,不然会报错。
- 在configuration配置文件中填写内容,必须按照 configuration的dtd书写规则来写,即有一定的顺序,鼠标放到donfiguration上面会出现要编写的顺序。
<?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>
<!-- default引用environment的id,当前所使用的环境 -->
<environments default="default">
<!-- 声明可以使用的环境-可以写多个环境 -->
<environment id="default">
<!-- 使用原生JDBC事务 -->
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/ssm?useSSL=false & serverTimezone=UTC"/>
<property name="username" value="root"/>
<property name="password" value="qinyu888"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com\qdl\mapper\flowermapper.xml" />
</mappers>
</configuration>
3、新建mapper结尾的包,在包下新建:实体类名+Mapper.xml
- 文件作用:编写需要执行的 SQL 命令,把 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:理解成实现类的全路径(包名+类名) -->
<mapper namespace="a.b">
<!-- id:方法名
parameterType:定义参数类型
resultType:返回值类型
-->
<select id="selAll" resultType="com.qdl.pojo.Flower">
select * from flower
</select>
</mapper>
4、测试结果
- 只有在单独使用 mybatis 时使用,最后 ssm整合时下面代码不需要编写.
public static void main(String[] args) throws IOException {
//使用工厂设计模式
InputStream is=Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(is);
//生产sqlsession
SqlSession session=factory.openSession();
List<Flower> list=session.selectList("a.b.selAll");
for (Flower flower : list) {
System.out.println(flower.toString());
}
//关闭资源
session.close();
}
四、环境搭建详解
全局配置文件中内容:
<transactionManager/> type 属性可取值 - JDBC,事务管理使用 JDBC 原生事务管理方式 - MANAGED 把事务管理转交给其他容器.原生 JDBC 事务setAutoMapping(false); <dataSouce/>type 属性 - POOLED 使用数据库连接池 - UNPOOLED 不使用数据库连接池,和直接使用 JDBC 一样 - JNDI :java 命名目录接口技术
五、数据库连接池
概念:
- 在内存中开辟一块空间,存放多个数据库连接对象.
- JDBC Tomcat Pool,直接由 tomcat 产生数据库连接池.
状态:
- active 状态:当前连接对象被应用程序使用中
- Idle 空闲状态:等待应用程序使用
目的:
- 在高频率访问数据库时,使用数据库连接池可以降低服务器系统压力,提升程序运行效率.
- 小型项目不适用数据库连接池.
实现 JDBC tomcat Pool 的步骤.
- 在 web 项目的 META-INF 中存放 context.xml,在 context.xml 编
写数据库连接池相关属性
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<Resource
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/ssm"
username="root
password="smallming"
maxActive="50"
maxIdle="20"
name="test"
auth="Container"
maxWait="10000"
type="javax.sql.DataSource"
/>
</Context>
- 把项目发布到 tomcat 中,数据库连接池产生了
- 可以在 java 中使用 jndi 获取数据库连接池中对象
Context:上下文接口.context.xml 文件对象类型
其中下文的test就是上面的context.xml文档中存储的name属性值,test前面的是固定的路径写法。
···
Context cxt = new InitialContext();
DataSource ds = (DataSource)
cxt.lookup("java:comp/env/test");
Connection conn = ds.getConnection();
··· - 当关闭连接对象时,把连接对象归还给数据库连接池,把状态
改变成 Idle。
六、三种查询方式
- selectList() 返回值为 List<resultType 属性控制>
适用于查询结果都需要遍历的需求
List<Flower> list = session.selectList("a.b.selAll");
for (Flower flower : list) {
System.out.println(flower.toString());
}
- selectOne() 返回值 Object,
适用于返回结果只是变量或一行数据时
int count = session.selectOne("a.b.selById");
System.out.println(count);
- selectMap() 返回值 Map
适用于需要在查询结果中通过某列的值取到这行数据的需求.
Map<key,resultType 控制>
Map<Object, Object> map = session.selectMap("a.b.c",
"name123");
System.out.println(map);
七、parameterType属性
- 在 XXXMapper.xml 中<select><delete>等标签的 parameterType 可以
控制参数类型 - SqlSession 的 selectList()和 selectOne()的第二个参数和 selectMap()
的第三个参数都表示方法的参数 - 在 Mapper.xml 中可以通过#{}获取参数
- 其中parameterType 控制参数类型
- / #{}获取参数内容
- 使用索引,从 0 开始 #{0}表示第一个参数,也可以使用#{param1}第一个参数
- 如果只有一个参数(基本数据类型或 String),mybatis对#{}里面内容没有要求只要写内容即可.
- 如果参数是对象#{属性名}
- 如果参数是 map 写成#{key}
<select id="selOne" resultType="com.qdl.pojo.People" parameterType="com.qdl.pojo.People">
<!-- 参数获取从0 开始 -->
select * from people where id=#{id}
</select>
- / #{} 和 / ${} 的区别
#{}
获取参数的内容支持索引获取,param1 获取指定位置参数,并且 SQL 使用?占位符。
${}
字符串拼接不使用?,默认找${内容}内容的 get/set 方法,如
果写数字,就是一个数字
八、typeAliases 别名
- 系统内置别名: 把类型全小写
- 给某个类起别名:alias=”自定义
<typeAliases>
<typeAlias type="com.qdl.pojo.People" alias="peo"/> 可以直接在PeopleMapper.xml文件中使用peo代替整个包名和类名
<package name="com.qdl.pojo"/> 同上可以直接使用类名代替包名和类名
</typeAliases>
九、Mybatis实现对数据库的修改
- 在 mybatis 中默认是关闭了 JDBC 的自动提交功能,每一个 SqlSession 默认都是不自动提交事务.
- session.commit()提交事务.
- openSession(true);自动提交相当于JDBC中的setAutoCommit(true);
- JDBC 中 executeUpdate()执行新增,删除,修改的 SQL.返回值 int,表示受影响的行数.
- mybatis 中<insert> <delete> <update>标签没有 resultType 属性,认为返回值都是 int
- 在 openSession()时 Mybatis 会创建 SqlSession 时同时创建一个
Transaction(事务对象),同时 autoCommit 都为 false - 注意:如果出现异常,应该 session.rollback()回滚事务. 而且使用插入、删除、修改的时候不能够使用select了,要使用对应的标签
实现新增步骤:
- 在 mapper.xml 中提供<insert>标签,标签没有返回值类型
<insert id="ins" parameterType="People">
insert into people values(default,#{name},#{age})
</insert>
- 在表现层执行insert语句
int index1 = session.insert("a.b.ins", p);
if(index1>0){
System.out.println("成功");
}else{
System.out.println("失败");
}
实现修改
- 在 mapper.xml 中提供<update>标签
<update id="upd" parameterType="People">
update people set name = #{name} where id = #{id}
</update>
-----------------------------------------------------------------------------
People peo = new People();
peo.setId(3);
peo.setName("王五");
int index = session.update("a.b.upd", peo);
if(index>0){
System.out.println("成功");
}else{
System.out.println("失败");
}
session.commit();
实现删除:
- 在 mapper.xml 提供<delete>标签
<delete id="del" parameterType="int">
delete from people where id = #{0}
</delete>
-----------------------------------------------
int del = session.delete("a.b.del",3);
if(del>0){
System.out.println("成功");
}else{
System.out.println("失败");
}
session.commit();
我整理了一份文章相关知识点的资料总结
零基础到架构的都有哦!
如果需要获取到这个【核心知识点整理】文档的话帮忙转发一下然后再关注我私信回复“资料”得到免费获取方式吧!
(资料的相关图片过多,就不一一放出来了,想要的朋友加关注帮小编点赞转发文章并私聊我呀!)
猜你喜欢
- 2024-11-24 前两天,JavaEE22051也开班啦
- 2024-11-24 面试又被问源码?阿里P8架构师带你看透源码本质
- 2024-11-24 自学JavaEE成本高吗?
- 2024-11-24 Linux入门指南-搭建JAVAEE开发环境
- 2024-11-24 JavaEE核心「JVM 的作用、类加载器、JVM内存模型、GC回收机制」
- 2024-11-24 基于JavaEE的企业制度管理系统-计算机毕业设计源码+LW文档
- 2024-11-24 第一章JavaEE应用与开发环境--读书系列
- 2024-11-24 如何成为一名JAVAEE软件工程师?(前言)
- 2024-11-24 javaweb、spring、springmvc和springboot有什么区别?
- 2024-11-24 「译」构建可扩展的Java EE应用(一)
你 发表评论:
欢迎- 04-11Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- 04-11Java中你知道几种从字符串中找指定的字符的数量
- 04-11探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- 04-11Python字符串详解与示例(python字符串的常见操作)
- 04-11java正则-取出指定字符串之间的内容
- 04-11String s1 = new String("abc");这句话创建了几个字符串对象?
- 04-11java判断字符串中是否包含某个字符
- 04-11关于java开发中正确的发牌逻辑编写规范
- 最近发表
-
- Java面试“字符串三兄弟”String、StringBuilder、StringBuffer
- Java中你知道几种从字符串中找指定的字符的数量
- 探秘Java面试中问的最多的String、StringBuffer、StringBuilder
- Python字符串详解与示例(python字符串的常见操作)
- java正则-取出指定字符串之间的内容
- String s1 = new String("abc");这句话创建了几个字符串对象?
- java判断字符串中是否包含某个字符
- 关于java开发中正确的发牌逻辑编写规范
- windows、linux如何后台运行jar(并且显示进程名)
- 腾讯大佬私人收藏,GitHub上最受欢迎的100个JAVA库,值得学习
- 标签列表
-
- nginx反向代理 (57)
- nginx日志 (56)
- nginx限制ip访问 (62)
- mac安装nginx (55)
- java和mysql (59)
- java中final (62)
- win10安装java (72)
- java启动参数 (64)
- java链表反转 (64)
- 字符串反转java (72)
- java逻辑运算符 (59)
- java 请求url (65)
- java信号量 (57)
- java定义枚举 (59)
- java字符串压缩 (56)
- java中的反射 (59)
- java 三维数组 (55)
- java插入排序 (68)
- java线程的状态 (62)
- java异步调用 (55)
- java中的异常处理 (62)
- java锁机制 (54)
- java静态内部类 (55)
- java怎么添加图片 (60)
- java 权限框架 (55)
本文暂时没有评论,来添加一个吧(●'◡'●)