阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

MyBatis基于DAO实现CRUD

373次阅读
没有评论

共计 17515 个字符,预计需要花费 44 分钟才能阅读完成。

1、根据 id 查询

1.1、修改 IUserDao.java 文件

package com.tianyi.dao; import com.tianyi.javabean.User; import java.util.List; public interface IUserDao {List<User> findAll(); User findById(Integer uid); }

1.2、修改 IUserDao.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.tianyi.dao.IUserDao"> <!-- 配置查询所有操作 --> <select id="findAll" resultType="com.tianyi.javabean.User"> select * from user </select> <select id="findById" resultType="com.tianyi.javabean.User" parameterType="int"> select * from user where id=#{uid} </select> </mapper>

注:

resultType 属性: 用于指定结果集的类型。
**parameterType 属性:** 用于指定传入参数的类型。

sql 语句中使用 #{}字符:
它代表占位符,相当于原来 jdbc 部分所学的?,都是用于执行语句时替换实际的数据。
具体的数据是由 #{}里面的内容决定的。

#{}中内容的写法:

由于数据类型是基本类型,所以此处可以随意写。

1.3、编写测试类 MbTest1.java

package com.tianyi.test; import com.tianyi.dao.IUserDao; import com.tianyi.javabean.User; 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.After; import org.junit.Before; import org.junit.Test; import java.io.InputStream; public class MbTest1 {private InputStream in ; private SqlSessionFactory factory; private SqlSession session; private IUserDao userDao; @Test public void testFindOne() {//6. 执行操作 User user = userDao.findById(1); System.out.println(user); } @Before // 在测试方法执行之前执行 public void init()throws Exception {//1. 读取配置文件 in = Resources.getResourceAsStream("SqlMapConfig.xml"); //2. 创建构建者对象 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //3. 创建 SqlSession 工厂对象 factory = builder.build(in); // 4. 创建 SqlSession 对象 session = factory.openSession(); //5. 创建 Dao 的代理对象 userDao = session.getMapper(IUserDao.class); } @After// 在测试方法执行完成之后执行 public void destroy() throws Exception{session.commit(); //7. 释放资源 session.close(); in.close();} }

单元测试导包

<dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency>

注意:

执行测试时出现:不再支持源选项 1.5。请使用 1.6 或更高版本。

在 pom.xml 加入

<properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.9</maven.compiler.source> <maven.compiler.target>1.9</maven.compiler.target> </properties>

2、保存操作

2.1、修改 IUserDao.java 文件

package com.tianyi.dao; import com.tianyi.javabean.User; import java.util.List; public interface IUserDao {List<User> findAll(); User findById(Integer uid); int addUser(User user); }

2.2、修改 IUserDao.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.tianyi.dao.IUserDao"> <!-- 配置查询所有操作 --> <select id="findAll" resultType="com.tianyi.javabean.User"> select * from user </select> <select id="findById" resultType="com.tianyi.javabean.User" parameterType="int"> select * from user where id=#{uid} </select> <insert id="addUser" parameterType="com.tianyi.javabean.User" > insert into user(username,birthday,sex,address)values(#{username},#{birthday},#{sex},#{address}) </insert> </mapper>

注:

{}中内容的写法:

由于我们保存方法的参数是 一个 User 对象,此处要写 User 对象中的属性名称。它用的是 ognl 表达式。

ognl 表达式:
它是 apache 提供的一种表达式语言,全称是:Object Graphic Navigation Language 对象图导航语言, 它是按照一定的语法格式来获取数据的。

语法格式就是使用 #{对象. 对象}的方式

{user.username}它会先去找 user 对象,然后在 user 对象中找到 username 属性,并调用 getUsername()方法把值取出来。但是我们在 parameterType 属性上指定了实体类名称,所以可以省略 user. 而直接写 username。

2.3、修改 MbTest1.java 文件

package com.tianyi.test; import com.tianyi.dao.IUserDao; import com.tianyi.javabean.User; 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.After; import org.junit.Before; import org.junit.Test; import java.io.InputStream; import java.util.Date; public class MbTest1 {private InputStream in ; private SqlSessionFactory factory; private SqlSession session; private IUserDao userDao; @Test public void testFindOne() {//6. 执行操作 User user = userDao.findById(1); System.out.println(user); } @Test public void testAddUser(){// 增加操作 User user=new User(); user.setUsername("王小红"); user.setBirthday(new Date()); user.setAddress("北京昌平"); user.setSex("女"); System.out.println("保存前:"+user); userDao.addUser(user); System.out.println("保存后:"+user); } @Before // 在测试方法执行之前执行 public void init()throws Exception {//1. 读取配置文件 in = Resources.getResourceAsStream("SqlMapConfig.xml"); //2. 创建构建者对象 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //3. 创建 SqlSession 工厂对象 factory = builder.build(in); // 4. 创建 SqlSession 对象 session = factory.openSession(); //5. 创建 Dao 的代理对象 userDao = session.getMapper(IUserDao.class); } @After// 在测试方法执行完成之后执行 public void destroy() throws Exception{session.commit(); //7. 释放资源 session.close(); in.close();} }

2.4、设置新增加记录 id 返回值

<?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.tianyi.dao.IUserDao"> <!-- 配置查询所有操作 --> <select id="findAll" resultType="com.tianyi.javabean.User"> select * from user </select> <select id="findById" resultType="com.tianyi.javabean.User" parameterType="int"> select * from user where id=#{uid} </select> <insert id="addUser" parameterType="com.tianyi.javabean.User" > <selectKey keyColumn="id" keyProperty="id" resultType="java.lang.Integer" > select last_insert_id() </selectKey> insert into user(username,birthday,sex,address)values(#{username},#{birthday},#{sex},#{address}); </insert> </mapper>

注:

selectKey 标签表示子查询中主键的提取问题
keyColumn 表示查询语句返回结果的列名
SELECT LAST_INSERT_ID():得到刚 insert 进去记录的主键值,只适用与自增主键
keyProperty:将查询到主键值设置到 parameterType 指定的对象的那个属性
order:SELECT LAST_INSERT_ID() 执行顺序,相对于 insert 语句来说它的执行顺序(after,before)
resultType:指定 SELECT LAST_INSERT_ID() 的结果类型

3、用户更新

3.1、修改 IUserDao.java 文件

package com.tianyi.dao; import com.tianyi.javabean.User; import java.util.List; public interface IUserDao {List<User> findAll(); User findById(Integer uid); int addUser(User user); int updateUser(User user); }

3.2、修改 IUserDao.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.tianyi.dao.IUserDao"> <!-- 配置查询所有操作 --> <select id="findAll" resultType="com.tianyi.javabean.User"> select * from user </select> <select id="findById" resultType="com.tianyi.javabean.User" parameterType="int"> select * from user where id=#{uid} </select> <insert id="addUser" parameterType="com.tianyi.javabean.User" > <selectKey keyColumn="id" keyProperty="id" resultType="java.lang.Integer" > select last_insert_id() </selectKey> insert into user(username,birthday,sex,address)values(#{username},#{birthday},#{sex},#{address}); </insert> <update id="updateUser" parameterType="com.tianyi.javabean.User"> update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id} </update> </mapper>

3.3、修改 MbTest1.java 文件

package com.tianyi.test; import com.tianyi.dao.IUserDao; import com.tianyi.javabean.User; 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.After; import org.junit.Before; import org.junit.Test; import java.io.InputStream; import java.util.Date; public class MbTest1 {private InputStream in ; private SqlSessionFactory factory; private SqlSession session; private IUserDao userDao; @Test public void testFindOne() {//6. 执行操作 User user = userDao.findById(1); System.out.println(user); } @Test public void testAddUser(){User user=new User(); user.setUsername("王小红"); user.setBirthday(new Date()); user.setAddress("北京昌平"); user.setSex("女"); System.out.println("保存前:"+user); int id=userDao.addUser(user); System.out.println("保存后:"+user); System.out.println(user.getId()); } @Test public void updateUser(){User user=userDao.findById(6); user.setSex("男"); userDao.updateUser(user); } @Before // 在测试方法执行之前执行 public void init()throws Exception {//1. 读取配置文件 in = Resources.getResourceAsStream("SqlMapConfig.xml"); //2. 创建构建者对象 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //3. 创建 SqlSession 工厂对象 factory = builder.build(in); // 4. 创建 SqlSession 对象 session = factory.openSession(); //5. 创建 Dao 的代理对象 userDao = session.getMapper(IUserDao.class); } @After// 在测试方法执行完成之后执行 public void destroy() throws Exception{session.commit(); //7. 释放资源 session.close(); in.close();} }

4、用户删除

4.1、修改 IUserDao.java 文件

package com.tianyi.dao; import com.tianyi.javabean.User; import java.util.List; public interface IUserDao {List<User> findAll(); User findById(Integer uid); int addUser(User user); int updateUser(User user); int deleteUser(Integer uid); }

4.2、修改 IUserDao.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.tianyi.dao.IUserDao"> <!-- 配置查询所有操作 --> <select id="findAll" resultType="com.tianyi.javabean.User"> select * from user </select> <select id="findById" resultType="com.tianyi.javabean.User" parameterType="int"> select * from user where id=#{uid} </select> <insert id="addUser" parameterType="com.tianyi.javabean.User" > <selectKey keyColumn="id" keyProperty="id" resultType="java.lang.Integer" > select last_insert_id() </selectKey> insert into user(username,birthday,sex,address)values(#{username},#{birthday},#{sex},#{address}); </insert> <update id="updateUser" parameterType="com.tianyi.javabean.User"> update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id} </update> <delete id="deleteUser" parameterType="int"> delete from user where id=#{id} </delete> </mapper>

4.3、修改 MbTest1.java 文件

package com.tianyi.test; import com.tianyi.dao.IUserDao; import com.tianyi.javabean.User; 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.After; import org.junit.Before; import org.junit.Test; import java.io.InputStream; import java.util.Date; public class MbTest1 {private InputStream in ; private SqlSessionFactory factory; private SqlSession session; private IUserDao userDao; @Test public void testFindOne() {//6. 执行操作 User user = userDao.findById(1); System.out.println(user); } @Test public void testAddUser(){User user=new User(); user.setUsername("王小红"); user.setBirthday(new Date()); user.setAddress("北京昌平"); user.setSex("女"); System.out.println("保存前:"+user); int id=userDao.addUser(user); System.out.println("保存后:"+user); System.out.println(user.getId()); } @Test public void updateUser(){User user=userDao.findById(6); user.setSex("男"); int n=userDao.updateUser(user); System.out.println("n="+n); } @Test public void deleteUser(){int n=userDao.deleteUser(12); System.out.println("n="+n); } @Before // 在测试方法执行之前执行 public void init()throws Exception {//1. 读取配置文件 in = Resources.getResourceAsStream("SqlMapConfig.xml"); //2. 创建构建者对象 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //3. 创建 SqlSession 工厂对象 factory = builder.build(in); // 4. 创建 SqlSession 对象 session = factory.openSession(); //5. 创建 Dao 的代理对象 userDao = session.getMapper(IUserDao.class); } @After// 在测试方法执行完成之后执行 public void destroy() throws Exception{session.commit(); //7. 释放资源 session.close(); in.close();} }

5、用户模糊查询

5.1、修改 IUserDao.java 文件

package com.tianyi.dao; import com.tianyi.javabean.User; import java.util.List; public interface IUserDao {List<User> findAll(); User findById(Integer uid); int addUser(User user); int updateUser(User user); int deleteUser(Integer uid); List<User> findByName(String username); }

5.2、修改 IUserDao.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.tianyi.dao.IUserDao"> <!-- 配置查询所有操作 --> <select id="findAll" resultType="com.tianyi.javabean.User"> select * from user </select> <select id="findById" resultType="com.tianyi.javabean.User" parameterType="int"> select * from user where id=#{uid} </select> <insert id="addUser" parameterType="com.tianyi.javabean.User" > <selectKey keyColumn="id" keyProperty="id" resultType="java.lang.Integer" > select last_insert_id() </selectKey> insert into user(username,birthday,sex,address)values(#{username},#{birthday},#{sex},#{address}); </insert> <update id="updateUser" parameterType="com.tianyi.javabean.User"> update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id} </update> <delete id="deleteUser" parameterType="int"> delete from user where id=#{id} </delete> <select id="findByName" resultType="com.tianyi.javabean.User" parameterType="java.lang.String"> select * from user where username like #{username} </select> </mapper>

5.3、修改 MbTest1.java 文件

package com.tianyi.test; import com.tianyi.dao.IUserDao; import com.tianyi.javabean.User; 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.After; import org.junit.Before; import org.junit.Test; import java.io.InputStream; import java.util.Date; import java.util.List; public class MbTest1 {private InputStream in ; private SqlSessionFactory factory; private SqlSession session; private IUserDao userDao; @Test public void testFindOne() {//6. 执行操作 User user = userDao.findById(1); System.out.println(user); } @Test public void testAddUser(){User user=new User(); user.setUsername("王小红"); user.setBirthday(new Date()); user.setAddress("北京昌平"); user.setSex("女"); System.out.println("保存前:"+user); int id=userDao.addUser(user); System.out.println("保存后:"+user); System.out.println(user.getId()); } @Test public void updateUser(){User user=userDao.findById(6); user.setSex("男"); int n=userDao.updateUser(user); System.out.println("n="+n); } @Test public void deleteUser(){int n=userDao.deleteUser(12); System.out.println("n="+n); } @Test public void findByName(){List<User> users=userDao.findByName("% 王 %"); for(User u:users){System.out.println(u.getId()+":"+u.getUsername()); } } @Before // 在测试方法执行之前执行 public void init()throws Exception {//1. 读取配置文件 in = Resources.getResourceAsStream("SqlMapConfig.xml"); //2. 创建构建者对象 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //3. 创建 SqlSession 工厂对象 factory = builder.build(in); // 4. 创建 SqlSession 对象 session = factory.openSession(); //5. 创建 Dao 的代理对象 userDao = session.getMapper(IUserDao.class); } @After// 在测试方法执行完成之后执行 public void destroy() throws Exception{session.commit(); //7. 释放资源 session.close(); in.close();} }

5.4、模糊查询的另一种配置方式

修改 IUserDao.xml 文件

<select id="findByName" resultType="com.tianyi.javabean.User" parameterType="java.lang.String"> select * from user where username like '%${value}%' </select>

注:

将原来的 #{}占位符,改成了 ${value}。注意如果用模糊查询的这种写法,那么​{value}的写法就是固定的,不能写成其它名字。

5.5、#{}与 ${}区别

#{}表示一个占位符号

通过 #{}可以实现 preparedStatement 向占位符中设置值,自动进行 java 类型和 jdbc 类型转换,#{}可以有效防止 sql 注入。#{}可以接收简单类型值或 pojo 属性值。如果 parameterType 传输单个简单类型值,#{}括号中可以是 value 或其它名称。
**{}表示拼接 sql 串 **
通过 {} 可以将 parameterType 传入的内容拼接在 sql 中且不进行 jdbc 类型转换,{}可以接收简单类型值或 pojo 属性值,如果 parameterType 传输单个简单类型值,{}括号中只能是 value。

6、查询中的函数使用

6.1、修改 IUserDao.java 文件

package com.tianyi.dao; import com.tianyi.javabean.User; import java.util.List; public interface IUserDao {List<User> findAll(); User findById(Integer uid); int addUser(User user); int updateUser(User user); int deleteUser(Integer uid); List<User> findByName(String username); int allCount(); }

6.2、修改 IUserDao.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.tianyi.dao.IUserDao"> <!-- 配置查询所有操作 --> <select id="findAll" resultType="com.tianyi.javabean.User"> select * from user </select> <select id="findById" resultType="com.tianyi.javabean.User" parameterType="int"> select * from user where id=#{uid} </select> <insert id="addUser" parameterType="com.tianyi.javabean.User" > <selectKey keyColumn="id" keyProperty="id" resultType="java.lang.Integer" > select last_insert_id() </selectKey> insert into user(username,birthday,sex,address)values(#{username},#{birthday},#{sex},#{address}); </insert> <update id="updateUser" parameterType="com.tianyi.javabean.User"> update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id} </update> <delete id="deleteUser" parameterType="int"> delete from user where id=#{id} </delete> <select id="findByName" resultType="com.tianyi.javabean.User" parameterType="java.lang.String"> select * from user where username like '%${value}%' </select> <select id="allCount" resultType="int"> select count(*) from user </select> </mapper>

6.3、修改 MbTest1.java 文件

package com.tianyi.test; import com.tianyi.dao.IUserDao; import com.tianyi.javabean.User; 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.After; import org.junit.Before; import org.junit.Test; import java.io.InputStream; import java.util.Date; import java.util.List; public class MbTest1 {private InputStream in ; private SqlSessionFactory factory; private SqlSession session; private IUserDao userDao; @Test public void testFindOne() {//6. 执行操作 User user = userDao.findById(1); System.out.println(user); } @Test public void testAddUser(){User user=new User(); user.setUsername("王小红"); user.setBirthday(new Date()); user.setAddress("北京昌平"); user.setSex("女"); System.out.println("保存前:"+user); int id=userDao.addUser(user); System.out.println("保存后:"+user); System.out.println(user.getId()); } @Test public void updateUser(){User user=userDao.findById(6); user.setSex("男"); int n=userDao.updateUser(user); System.out.println("n="+n); } @Test public void deleteUser(){int n=userDao.deleteUser(12); System.out.println("n="+n); } @Test public void findByName(){List<User> users=userDao.findByName("王"); for(User u:users){System.out.println(u.getId()+":"+u.getUsername()); } } @Test public void allCount(){int n=userDao.allCount(); System.out.println(n); } @Before // 在测试方法执行之前执行 public void init()throws Exception {//1. 读取配置文件 in = Resources.getResourceAsStream("SqlMapConfig.xml"); //2. 创建构建者对象 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //3. 创建 SqlSession 工厂对象 factory = builder.build(in); // 4. 创建 SqlSession 对象 session = factory.openSession(); //5. 创建 Dao 的代理对象 userDao = session.getMapper(IUserDao.class); } @After// 在测试方法执行完成之后执行 public void destroy() throws Exception{session.commit(); //7. 释放资源 session.close(); in.close();} }

正文完
星哥玩云-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-06-06发表,共计17515字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中

星哥玩云

星哥玩云
星哥玩云
分享互联网知识
用户数
4
文章数
19348
评论数
4
阅读量
7822329
文章搜索
热门文章
开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南

开发者必备神器:阿里云 Qoder CLI 全面解析与上手指南 大家好,我是星哥。之前介绍了腾讯云的 Code...
星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛NAS-6:抖音视频同步工具,视频下载自动下载保存

星哥带你玩飞牛 NAS-6:抖音视频同步工具,视频下载自动下载保存 前言 各位玩 NAS 的朋友好,我是星哥!...
云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板1Panel:小白轻松构建Web服务与面板加固指南

云服务器部署服务器面板 1Panel:小白轻松构建 Web 服务与面板加固指南 哈喽,我是星哥,经常有人问我不...
我把用了20年的360安全卫士卸载了

我把用了20年的360安全卫士卸载了

我把用了 20 年的 360 安全卫士卸载了 是的,正如标题你看到的。 原因 偷摸安装自家的软件 莫名其妙安装...
星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛NAS-3:安装飞牛NAS后的很有必要的操作

星哥带你玩飞牛 NAS-3:安装飞牛 NAS 后的很有必要的操作 前言 如果你已经有了飞牛 NAS 系统,之前...
阿里云CDN
阿里云CDN-提高用户访问的响应速度和成功率
随机文章
12.2K Star 爆火!开源免费的 FileConverter:右键一键搞定音视频 / 图片 / 文档转换,告别多工具切换

12.2K Star 爆火!开源免费的 FileConverter:右键一键搞定音视频 / 图片 / 文档转换,告别多工具切换

12.2K Star 爆火!开源免费的 FileConverter:右键一键搞定音视频 / 图片 / 文档转换...
手把手教你,购买云服务器并且安装宝塔面板

手把手教你,购买云服务器并且安装宝塔面板

手把手教你,购买云服务器并且安装宝塔面板 前言 大家好,我是星哥。星哥发现很多新手刚接触服务器时,都会被“选购...
星哥带你玩飞牛NAS硬件02:某鱼6张左右就可拿下5盘位的飞牛圣体NAS

星哥带你玩飞牛NAS硬件02:某鱼6张左右就可拿下5盘位的飞牛圣体NAS

星哥带你玩飞牛 NAS 硬件 02:某鱼 6 张左右就可拿下 5 盘位的飞牛圣体 NAS 前言 大家好,我是星...
让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级

让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级

让微信公众号成为 AI 智能体:从内容沉淀到智能问答的一次升级 大家好,我是星哥,之前写了一篇文章 自己手撸一...
【开源神器】微信公众号内容单篇、批量下载软件

【开源神器】微信公众号内容单篇、批量下载软件

【开源神器】微信公众号内容单篇、批量下载软件 大家好,我是星哥,很多人都希望能高效地保存微信公众号的文章,用于...

免费图片视频管理工具让灵感库告别混乱

一言一句话
-「
手气不错
手把手教你,购买云服务器并且安装宝塔面板

手把手教你,购买云服务器并且安装宝塔面板

手把手教你,购买云服务器并且安装宝塔面板 前言 大家好,我是星哥。星哥发现很多新手刚接触服务器时,都会被“选购...
三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Android 的最优解?

三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Android 的最优解?

  三大开源投屏神器横评:QtScrcpy、scrcpy、escrcpy 谁才是跨平台控制 Andr...
星哥带你玩飞牛NAS硬件 01:捡垃圾的最爱双盘,暴风二期矿渣为何成不老神话?

星哥带你玩飞牛NAS硬件 01:捡垃圾的最爱双盘,暴风二期矿渣为何成不老神话?

星哥带你玩飞牛 NAS 硬件 01:捡垃圾的最爱双盘,暴风二期矿渣为何成不老神话? 前言 在选择 NAS 用预...
星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的NAS中!

星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的NAS中!

星哥带你玩飞牛 NAS-10:备份微信聊天记录、数据到你的 NAS 中! 大家对「数据安全感」的需求越来越高 ...
支付宝、淘宝、闲鱼又双叕崩了,Cloudflare也瘫了连监控都挂,根因藏在哪?

支付宝、淘宝、闲鱼又双叕崩了,Cloudflare也瘫了连监控都挂,根因藏在哪?

支付宝、淘宝、闲鱼又双叕崩了,Cloudflare 也瘫了连监控都挂,根因藏在哪? 最近两天的互联网堪称“故障...