mybatis框架学习(完整)

2023-11-10

 

目录

 

  1. 总结jdbc出现的问题
  2. mybatis介绍
  3. mybatis入门程序
  4. 占位符#{}与字符串拼接符${}区别
  5. mybatis框架的原理
  6. 别名配置与映射文件加载方式
  7. mybatis与hibernate的比较

 

一、总结jdbc出现的问题

 

 

1、准备数据库,执行mysql语句。

-- ----------------------------
-- Table structure for `orders`
-- ----------------------------
DROP TABLE IF EXISTS `orders`;
CREATE TABLE `orders` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `user_id` int(11) NOT NULL COMMENT '下单用户id',
  `number` varchar(32) NOT NULL COMMENT '订单号',
  `createtime` datetime NOT NULL COMMENT '创建订单时间',
  `note` varchar(100) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`),
  KEY `FK_orders_1` (`user_id`),
  CONSTRAINT `FK_order_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of orders
-- ----------------------------
INSERT INTO `orders` VALUES ('3', '1', '1000010', '2015-02-04 13:22:35', null);
INSERT INTO `orders` VALUES ('4', '1', '1000011', '2015-02-03 13:22:41', null);
INSERT INTO `orders` VALUES ('5', '10', '1000012', '2015-02-12 16:13:23', null);

-- ----------------------------
-- Table structure for `user`
-- ----------------------------
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `username` varchar(32) NOT NULL COMMENT '用户名称',
  `birthday` date DEFAULT NULL COMMENT '生日',
  `sex` char(1) DEFAULT NULL COMMENT '性别',
  `address` varchar(256) DEFAULT NULL COMMENT '地址',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=35 DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('1', '王五', null, '2', null);
INSERT INTO `user` VALUES ('10', '张三', '2014-07-10', '1', '北京市');
INSERT INTO `user` VALUES ('16', '张小明', null, '1', '河南郑州');
INSERT INTO `user` VALUES ('22', '陈小明', null, '1', '河南郑州');
INSERT INTO `user` VALUES ('24', '张三丰', null, '1', '河南郑州');
INSERT INTO `user` VALUES ('25', '陈小明', null, '1', '河南郑州');
INSERT INTO `user` VALUES ('26', '王五', null, null, null);

 

2、创建工程

   

3、配置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>com.liwei</groupId>
	<artifactId>mybatis01</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<!-- mysql版本 -->
		<mysql.version>5.1.30</mysql.version>
		<!-- junit版本 -->
		<junit.version>4.12</junit.version>
	</properties>

	<dependencies>
		<!-- mysql数据库依赖 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>${mysql.version}</version>
		</dependency>
		<!-- junit依赖 -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>${junit.version}</version>
			<scope>test</scope>
		</dependency>
	</dependencies>

</project>


4、编写代码

package com.liwei.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

/**
 * @ClassName: JdbcTest
 * @Description:jdbc问题总结
 * @author: Li_Wei
 * @date: 2018年6月27日 上午10:13:52
 */
public class JdbcTest {

	public static void main(String[] args) {
		Connection con = null;
		PreparedStatement psmt = null;
		ResultSet set = null;
		try {
			// 1.加载驱动
			Class.forName("com.mysql.jdbc.Driver");
			// 2.创建数据库的连接对象
			con = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/liwei", "root", "root");
			// 3.定义sql语句
			String sql = "select * from user where id = ?";
			// 4.创建statement对象
			psmt = con.prepareStatement(sql);
			// 5.设置参数
			psmt.setInt(1, 1);
			// 6.执行
			set = psmt.executeQuery();
			// 7.处理结果集
			while (set.next()) {
				System.out.println("用户Id:" + set.getInt("id") + ",用户名称:" + set.getString("username"));
			}
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				//8.释放资源
				if (set != null)set.close();
				if (psmt != null)psmt.close();
				if (con != null)con.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}

	}

}

5、测试结果

    

6、总结jdbc开发出现的问题

  • 频繁创建数据库连接对象、释放、容易造成系统资源浪费,影响系统性能。企业项目中可以使用连接池解决这个问题,但是使用Jdbc需要自己实现连接池。mybatis框架已经提供连接池。
  • sql语句定义、参数设置、结果集处理存在硬编码。企业项目中sql语句变化的可能性较大,一旦发生变化,需要修改java代码,系统需要重新编译,重新发布。不好维护。
  • 结果集处理存在重复代码,处理麻烦。如果可以映射成为java对象会比较方便。

二、mybatis介绍

 

        mybatis是Apache软件基金会下的一个开源项目,前身是Ibatis框架。2010年这个项目由apache 软件基金会迁移到google code下,改名为mybatis。2013年11月又迁移到了github(https://github.com/mybatis/mybatis-3/releases)。

        mybatis是一个持久层的框架,是对JDBC操作数据库的封装,使开发者只需要关注业务本身,不需要花费精力去处理加载驱动、创建数据库连接对象、创建statement语句对象、参数设置、结果集处理等一系列繁杂的过程代码。

        mybatis通过xml或注解进行配置,将java对象与sql语句中的参数自动映射生成最终执行的sql语句,并将sql语句执行结果自动映射成java对象,返回给业务层(service)应用。

三、mybatis的入门程序

    

需求:实现用户表(user)增、删、改、查操作。

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>com.liwei</groupId>
	<artifactId>mybatis01</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<!-- mysql版本 -->
		<mysql.version>5.1.30</mysql.version>
		<!-- junit版本 -->
		<junit.version>4.12</junit.version>
		<!-- mybatis版本号 -->
		<mybatis.version>3.4.5</mybatis.version>
		<!-- log4j日志包版本 -->
		<slf4j.version>1.7.7</slf4j.version>
		<log4j.version>1.2.17</log4j.version>
	</properties>

	<dependencies>
		<!-- mysql数据库依赖 -->
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<version>${mysql.version}</version>
		</dependency>
		<!-- mybatis核心包 -->
		<dependency>
			<groupId>org.mybatis</groupId>
			<artifactId>mybatis</artifactId>
			<version>${mybatis.version}</version>
		</dependency>
		<!-- log4j日志包 -->
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>${log4j.version}</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>${slf4j.version}</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>${slf4j.version}</version>
		</dependency>
		
		<!-- junit依赖 -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>${junit.version}</version>
			<scope>test</scope>
		</dependency>
	</dependencies>

</project>

2、sqlMapConfig.xml配置文件,是mybatis框架的核心配置文件。

<?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属性:指定使用哪一个运行环境  -->
	<environments default="development">
		<!--id属性:唯一标识一个运行环境  -->
		<environment id="development">
			<!-- 事务管理器配置,type="JDBC":mybatis框架默认使用jdbc事务 -->
			<transactionManager type="JDBC" />
			<!--数据源配置,type="POOLED":mybatis框架提供的连接池  -->
			<dataSource type="POOLED">
				<property name="driver" value="com.mysql.jdbc.Driver" />
				<property name="url" value="jdbc:mysql://127.0.0.1:3306/liwei" />
				<property name="username" value="root" />
				<property name="password" value="root" />
			</dataSource>
		</environment>
	</environments>
	<!-- 加载映射文件 -->
	<mappers>
		<mapper resource="mybatis/UserMapper.xml"/>
	</mappers>
</configuration>

3、log4j.properties日志文件

   

# Global logging configuration
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

4、实体类User.java文件

package com.liwei.mybatis.domain;

import java.util.Date;

public class User {
	private Integer id; // 主键id
	private String username; // 用户名称
	private Date birthday; // 生日
	private String sex; // 性别
	private String address; // 地址
	
	public Integer getId() {
		return id;
	}
	public void setId(Integer id) {
		this.id = id;
	}
	public String getUsername() {
		return username;
	}
	public void setUsername(String username) {
		this.username = username;
	}
	public Date getBirthday() {
		return birthday;
	}
	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
	public String getSex() {
		return sex;
	}
	public void setSex(String sex) {
		this.sex = sex;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}
	@Override
	public String toString() {
		return "User [id=" + id + ", username=" + username + ", birthday=" + birthday + ", sex=" + sex + ", 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">
<mapper namespace="mybatis">
	<!-- 新增用户 -->
	<insert id="addUser" parameterType="com.liwei.mybatis.domain.User">
		insert into user (id,username,birthday,sex,address)
		values (#{id},#{username},#{birthday},#{sex},#{address})
	</insert>
	
	<!-- 根据用户id删除用户 -->
	<delete id="deleteUser" parameterType="int">
		delete from user where id = #{id}
	</delete>
	
	<!-- 根据用户id修改用户 -->
	<update id="updateUserById" parameterType="com.liwei.mybatis.domain.User">
		update user set username=#{username},sex=#{sex} where id=#{id}
	</update>
	
	<!-- 根据id查询 -->
	<select id="queryUserById" parameterType="int" resultType="com.liwei.mybatis.domain.User">
		select id,username,birthday,sex,address from user where id = #{id}
	</select>
	
	<!-- 方式一:根据用户名称模糊查询用户 -->
	<select id="queryUserByName1" parameterType="string" resultType="com.liwei.mybatis.domain.User">
		select id,username,birthday,sex,address from `user` where username like  #{username}
	</select>
	
	<!-- 方式二:根据用户名称模糊查询用户 -->
	<select id="queryUserByName2" parameterType="string" resultType="com.liwei.mybatis.domain.User">
		select id,username,birthday,sex,address from `user` where username like  '%${value}%'
	</select>
		
</mapper>

 

6、MyBatisTest测试类

package com.liwei.mybatis.test;

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 org.junit.Test;

import com.liwei.mybatis.domain.User;

public class MyBatisTest {
	/**
	 * @Title: getSqlSessionFactory
	 * @Description: 将增、删、改、查公共使用的部分提出来
	 * @param: @return
	 * @param: @throws
	 *             IOException
	 * @return: SqlSession
	 * @throws @author
	 *             Li_Wei
	 */
	public SqlSessionFactory getSqlSessionFactory() throws IOException {
		// 1.加载核心配置文件
		InputStream inputStream = Resources.getResourceAsStream("sqlMapConfig.xml");
		// 2.读取配置文件的内容
		SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
		SqlSessionFactory sqlSessionFactory = builder.build(inputStream);

		return sqlSessionFactory;
	}

	/**
	 * @Title: addUser
	 * @Description: 新增用户
	 * @param:
	 * @return: void
	 * @throws IOException
	 * @throws @author
	 *             Li_Wei
	 */
	@Test
	public void addUser() throws IOException {
		// 3.使用sqlSessionFactory对象,创建SqlSession对象,开启自动提交事务
		SqlSession sqlSession = this.getSqlSessionFactory().openSession(true);
		// 调用方法执行
		User user = new User();
		user.setId(4);
		user.setUsername("林诗音");
		user.setBirthday(new Date());
		user.setSex("女");
		user.setAddress("来自大明朝");
		sqlSession.insert("mybatis.addUser", user);
		// 事务提交
		// sqlSession.commit();
		// 释放资源
		sqlSession.close();
	}

	/**
	 * @Title: deleteUser
	 * @Description: 根据用户id删除用户
	 * @param:
	 * @return: void
	 * @throws IOException
	 * @throws @author
	 *             Li_Wei
	 */
	@Test
	public void deleteUser() throws IOException {
		// 创建SqlSession对象
		SqlSession sqlSession = this.getSqlSessionFactory().openSession(true);
		// 调用方法执行
		sqlSession.delete("mybatis.deleteUser", 3);
		// 释放资源
		sqlSession.close();
	}

	/**
	 * @Title: updateUser
	 * @Description: 根据用户id修改用户
	 * @param:
	 * @return: void
	 * @throws IOException
	 * @throws @author
	 *             Li_Wei
	 */
	@Test
	public void updateUserById() throws IOException {
		// 创建SqlSession对象
		SqlSession sqlSession = this.getSqlSessionFactory().openSession(true);
		// 调用方法执行
		// 创建用户对象
		User user = new User();
		user.setId(1);
		user.setUsername("林诗音和小李飞刀");
		user.setSex("1");

		sqlSession.update("mybatis.updateUserById", user);
		// 释放资源
		sqlSession.close();
	}

	/**
	 * @Title: queryUserById
	 * @Description: 根据id查询用户(查询)
	 * @param:
	 * @return: void
	 * @throws IOException
	 * @throws @author
	 *             Li_Wei
	 */
	@Test
	public void queryUserById() throws IOException {
		// 3.使用sqlSessionFactory对象,创建SqlSession对象
		SqlSession sqlSession = this.getSqlSessionFactory().openSession();
		// 4.使用sqlSession对象,调用方法执行
		Object user = sqlSession.selectOne("mybatis.queryUserById", 24);
		System.out.println(user);
		// 5.释放资源
		sqlSession.close();
	}

	/**
	 * @Title: queryUserNameLike
	 * @Description: 方式一:根据用户名称模糊查询用户
	 * @param:
	 * @return: void
	 * @throws IOException
	 * @throws @author
	 *             Li_Wei
	 */
	@Test
	public void queryUserByName1() throws IOException {
		// 3.使用sqlSessionFactory对象,创建SqlSession对象
		SqlSession sqlSession = this.getSqlSessionFactory().openSession();
		// 4.使用sqlSession对象,调用方法执行
		List<Object> userList = sqlSession.selectList("mybatis.queryUserByName1", "%小明%");
		for (Object object : userList) {
			System.out.println(object);
		}
		// 5.释放资源
		sqlSession.close();
	}

	/**
	 * @Title: queryUserNameLike
	 * @Description: 根据用户名称模糊查询用户
	 * @param:
	 * @return: void
	 * @throws IOException
	 * @throws @author
	 *             Li_Wei
	 */
	@Test
	public void queryUserByName2() throws IOException {
		// 3.使用sqlSessionFactory对象,创建SqlSession对象
		SqlSession sqlSession = this.getSqlSessionFactory().openSession();
		// 4.使用sqlSession对象,调用方法执行
		List<Object> userList = sqlSession.selectList("mybatis.queryUserByName2", "小明");
		for (Object object : userList) {
			System.out.println(object);
		}
		// 5.释放资源
		sqlSession.close();
	}
}

 

7、打印结果如下

新增用户:

            

    

删除:根据用户id删除用户

 

修改:根据用户id修改用户

 

查询:根据id查询

    

根据用户名称模糊查询:

方式一:使用#{}

方式二:使用${}

方式一与方式二具体看上面的代码。

在方式一与方式二中,我们使用到了#{}与${}两种方式,name这两种方式用什么区别呢?

 

四、占位符#{}与字符串拼接符${}区别

  1. 占位符#{},相当于jdbc中的问号?,当参数类型传递的是java简单类型的时候,花括号中的内容可以是任意字符串。
  2. 字符串拼接符${},当参数传递的是java简单类型的时候,花括号中的内容只能是:value
  3. sql语句中使用字符串拼接,可能引起sql注入的问题。但是mybatis框架中字符串拼接符可以放心使用。原因是mybatis是后端dao层开发,参数在前端表现层(action)和业务层(service)已经处理好。

五、mybatis框架的原理

    

六、别名配置与映射文件加载方式

别名有两种方式:

映射文件加载:两种方法

注意:包扫描需要将映射文件放在相应的包下面

七、mybatis与hibernate的比较

相同点
都是对jdbc的封装,都是持久层的框架,都用于dao层的开发。

不同点

  1. hibernate对sql语句做了封装,提供了HQL语句操作数据库,数据库无关性支持好,在项目需要支持多种数据库的情况下,代码开发量较少,sql语句优化困难。mybaits是直接使用sql语句操作数据库,不支持数据库无关性,在项目需要支持多种数据库的情况下,代码开发量较多,sql语句优化容易。
  2. hibernate配置java对象与数据库表的对应关系,多表关联关系配置复杂。mybatis是配置java对象与sql语句的对应关系,多表关联关系配置简单。
  3. hibernate是一个重量级的框架,学习使用门槛高,适合于需求相对稳定,中小型的项目,比如:办公自动化系统(OA)。mybatis是一个轻量级的框架,学习使用门槛低,适合于需求变化频繁,大型的项目,比如:互联网项目。目前企业项目中,mybatis框架使用更多。

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mybatis框架学习(完整) 的相关文章

  • nginx(一)下载、安装、启动、关闭(Windows)

    前言 我们现在部署项目用nginx的是比较普遍的 这里分享一些资料 1 下载安装包 官网入口 提供了 window和linux两个版本 根据自己需要来下载 我这里是window 2 打开下载的压缩包 目录如下 启动服务 双击运行nginx
  • python 常见入门问题一

    python 常见入门问题一 入门的第一个问题 TypeError can only concatenate str not int to str 在python中 中为字符串不能直接和int类型的数字相加 说到相加 C语言也有类似的cha
  • Kotlin协程视频教程,极简入门与解密

    Kotlin协程极简入门与解密视频教程已经发布到CSDN学院 https edu csdn net course detail 31728 Kotlin作为目前最为流行的编程语言之一 学Kotlin的同学们都被Kotlin的简洁的语法和它强
  • oracle replace怎么用,oracle replace()函数用法

    用法介绍 REPLACE char search string replacement string char 等待替换的字符串 search string 搜索需要替换的字符串 replacement string 替换字符串 如果rep
  • XGboost进行时间序列预测

    文章最前 我是Octopus 这个名字来源于我的中文名 章鱼 我热爱编程 热爱算法 热爱开源 所有源码在我的个人github 这博客是记录我学习的点点滴滴 如果您对 Python Java AI 算法有兴趣 可以关注我的动态 一起学习 共同
  • 跳出弹窗页面禁止滚动(PC端和手机端)

    pc端如何实现 1 当弹窗显示时 为body元素添加属性 overflow hidden 当关闭弹窗时移除该属性即可2 在弹窗的div上设置 scroll stop prevent div 你要显示的内容 div 3 出现弹窗时 为body
  • 移动应用开发---uni-app框架

    目录 一 什么是uni app 二 环境搭建 三 uni app的构造 四 uni app框架主要有五大优势 五 运行项目 六 发布小程序 发布为微信小程序 发布为支付宝小程序 一 什么是uni app uni app 是一个使用 Vue
  • 数据库查询的基本运算,关系代数

    1 关系属性的指定 投影运算 这个操作是对一个关系进行垂直分割 消去某些列 并重新安排列的顺序 为投影运算符 表示按照i1 i2 in的顺序从关系R中取出n列 并删除结果中的重复元组 组成一个新的以i1 i2 in为列顺序的n元关系 2 关
  • doker部署postgres

    doker部署postgres 参考该博文 1 安装docker sudo apt get update sudo apt get install docker 2 在docker里面安装postgres镜像 docker pull pos
  • 第14.9节 Python中使用urllib.request+BeautifulSoup获取url访问的基本信息

    利用urllib request读取url文档的内容并使用BeautifulSoup解析后 可以通过一些基本的BeautifulSoup对象输出html文档的基本信息 以博文 第14 6节 使用Python urllib request模拟
  • c++11/14之std::shared_ptr作为引用参数,普通参数

    1 c 中使用std shared ptr类型做为构造函数参数 并使用std move 初始化成员变量 使用std shared ptr类型作为形参 shared ptr会被复制 使用std move 之后 形参对象就没有内容了 inclu
  • java根据生日计算年龄工具类

    在开发中时常遇到要通过生日计算年龄的需求 这里记录一下 private static int getAgeByBirth Date birthday int age 0 try Calendar now Calendar getInstan
  • linux强制卸载mysql报错

    error Failed dependencies mysql community client x86 64 gt 8 0 11 is needed by installed mysql community server 8 0 31 1
  • html在线校验器,HTML validate HTML验证

    HTML validate是指HTML验证 它是通过与标准HTML规则进行比较的方式 分析HTML文档 标记出错误和非标准代码的处理过程 Web页面使用HTML进行渲染 而HTML本身采用了HTML规范作为其规则和标准 通过验证HTML代码
  • 驱动开发 作业 day9 9/20

    基于platform实现 head h ifndef HEAD H define HEAD H 构建LED开关的功能码 不添加ioctl第三个参数 define LED ON IO l 1 define LED OFF IO l 0 end
  • 同时安装cuda8和cuda9

    转载自 https blog csdn net lovebyz article details 80704800 为了使用tensorflow目标检测API的所有算法 所以打算升级一下CUDA版本以支持tf gpu 1 5 但原本项目都是基
  • HTML5 canvas标签-1 基本使用

    终于有空使用csdn和大家分享点自己平时学习工作时候的心德啦 第一步 介绍下canvas的基本使用 首先 因为canvas是html5的一个标签 所以保险起见 可以先确认下canvas是否兼容 try document createElem
  • VISIO中的工具栏、菜单栏丢失的原因及解决办法

    症状 在 Microsoft Visio 中 您可能会遇到一个或多个以下症状 您所了解的工具栏是启用是不可见的 找不到菜单栏 按钮从工具栏中消失了
  • k8s搭建部署3个节点服务器

    目录 一 环境准备 二 安装kubeadm kubelet和kubectl 三 部署kubernetes Master 四 node节点加入集群 五 查看集群的状态 Init ImagePullBackOff错误 swap分区没有关闭 没有
  • 华为OD机试真题2023(JavaScript)

    华为机试题库已于5月10号由2022Q4 A卷 切换 为2023 B卷 B卷区地址 华为OD机试真题2023 B卷 JS 华为机试有三道题目 第一道和第二道属于简单或中等题 分值为100分 第三道为中等或困难题 分值为200分 总分为400

随机推荐

  • matlab 平方差,第七章 最小平方差的方法(The Method of Least Square ).doc

    第七章 最小平方差的方法 The Method of Least Square doc 第七章 最小平方差的方法 The Method of Least Square 本章說明利用最小平方差法 找出適合一組資料的曲線 在本章中包含Matla
  • T100客户端接口开发实例(T100对接销售易CRM)

    design bu leezec 296066606 应用实例 T100销售订单推送到CRM 需求分解 1 调用销售易接口校验取得token 2 取得token后按照要求推送数据 1 什么是token 首先 要调用CRM的实际应用场景 就绕
  • ISula 容器学习历程

    容器统一架构图 转自ISula容器引擎 openeuler org 1 下载安装 iSulad容器的下载安装只需要很简单的一条命令 yum install y iSulad 安装完成 2 容器配置 以配置nginx服务器为例 2 1 启动i
  • python 算法基础

    目录 基础算法 一元回归算法 多项式回归 预测 任意函数回归 分类算法 kNN k最邻近算法 聚类算法 k means DBSCAN 推荐算法 暂时不写 降维算法 数据预处理 主成分分析 PCA 因子分析 FactorAnalysis sk
  • 浅谈Web用户体验(一)

    最近一段时间在接触web用户体验 我认为 如果要鼓励用户去使用一个新的网站或软件 首先要做到的是 把用户需要完成的事的难度尽量降低 因为一般用户是没有耐性 有点懒的去做复杂的事的人 要解决这些问题 下面总结了一些方法 第一 尽量告诉用户需要
  • TightVNC H264编解码(二)之硬编码库的编译

    AVCodec codec avcodec find encoder by name nvenc h264 如果是默认的ffmpeg库 返回结果是NULL 看来是不带有硬编码功能的 重新编译分支ffnvcodec 不到半个小时编译完成 返回
  • Git 常用命令 --- git push命令

    git push的一般形式为 git push lt 远程主机名 gt lt 本地分支名 gt lt 远程分支名 gt 例如 git push origin master refs for master 即是将本地的master分支推送到远
  • golang配置国内镜像

    点击进入 golang中文网
  • elementUI图片遍历循环+预览【el-image查看大图+预览】

    我这边接受的数据结构 code 200 msg 图片列表 object id 1 partsName picturesName a jpg picturesUrl http 192 168 3 65 8111 image a jpg typ
  • POI向Excel中插入图片

    package com xiangyu bigdata xycom execl import java awt image BufferedImage import java io ByteArrayOutputStream import
  • flask-sqlalchemy 解决 with_for_update() 行锁不生效、数据滞后问题

    解决方案 我先把解决方案放在前面 后面慢慢阐明拖了我三天的研究过程和原因 若出现带锁的查询修改前 先行commit一次 model db session commit 先行commit一次 user models User query wi
  • Python-字符串str和json格式的转换

    我是精神抖擞王大鹏 不卑不亢 和蔼可亲 计算机硕士 目前小米大数据开发 日常会分享总结一些自己面试实际问题的回答 欢迎一起讨论 公众号 diting dapeng str转json str转换为json格式 前提一定需要保证这个str的格式
  • Building the kernel with clang

    https lwn net Articles 734071 https oschina net news 89194 linux build kernel with clang Building the kernel with clang
  • neo4j语法-where

    where语句无法单独使用 而是和match optional match start with一起使用 或者做为with和start的结果过滤器 基础使用 操作符 MATCH n WHERE n name Peter XOR n age
  • Matlab绘图案例,MATLAB画图大法,附详细代码

    目录 1 使用subplot创建多个子图 2 绘制误差棒图 3 绘制条形堆积图 4 绘制堆积面积图 5 绘制直方图并拟合曲线 6 绘制等高线图 7 绘制光滑的曲线 8 绘制彩虹图 9 绘制带有错误标记的散点图 10 绘制水平堆积条形 11
  • Syncthing 1.1.1 发布,文件持续同步应用

    百度智能云 云生态狂欢季 热门云产品1折起 gt gt gt Syncthing 1 1 1 发布了 Syncthing 是一款持续文件同步应用 可同步多台计算机之间的文件 此版本更新内容包括 5531 根据大小而不是条目刷新数据库 557
  • 莫烦---Tensorflow学习

    加粗样式边学边记录 感谢莫烦大神的教学视频 获益良多 之前已经看完了吴恩达Andrew Ng的视频 但对Tensorflow的使用还是有很多不懂的地方 还是要花些时间好好学学tensorflow和keras 莫烦大神的视频学习地址 Tens
  • css 动态生成动画代码在线工具,非常好用!推荐

    网址 Animista CSS Animations on Demand 这个网站提供了大量的css动画效果 用户可以自定义动画 在线生成动画代码
  • ChatGPT的代码生成是怎么做的?「基于深度学习的代码生成方法」最新研究进展...

    机器学习研究组 代码生成 Code Generation 是指根据自然语言描述生成相关代码片段的任务 在软件开发过程中 常 常会面临大量重复且技术含量较低的代码编写任务 代码生成作为最直接辅助开发人员完成编码的工作受到学术 界和工业界的广泛
  • mybatis框架学习(完整)

    目录 总结jdbc出现的问题 mybatis介绍 mybatis入门程序 占位符 与字符串拼接符 区别 mybatis框架的原理 别名配置与映射文件加载方式 mybatis与hibernate的比较 一 总结jdbc出现的问题 1 准备数据