使用MyBatis搭建一个访问mysql数据库的简单示例
MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架。MyBatis消除了几乎所有的JDBC代码和参数的手工设置以及对结果集的检索封装。MyBatis可以使用简单的XML或注解用于配置和原始映射,将接口和Java的POJO(Plain Old Java Objects,普通的Java对象)映射成数据库中的记录。
框架整体结构图:
关键代码介绍
1.ICatagoryOperation接口
public interface ICatagoryOperation { void inserteCatagory(Catagory catagory); Catagory getCatagorybyID(int id); }
2.Catagory类
public class Catagory { private int id; private String name; private String description; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getDescription() { return description; } public void setDescription(String description) { this.description = description; } @Override public String toString() { return String.format("id:%d,name:%s,description:%s", id, name, description); } }
3.MyBatisUtils类
public class MyBatisUtils { private static final String CONFIG_PATH = "config/mybatis_config.xml"; /* * 获取数据库访问链接 */ public static SqlSession getSqlSession() { SqlSession session = null; try { InputStream stream = Resources.getResourceAsStream(CONFIG_PATH); // 可以根据配置的相应环境读取相应的数据库环境 // SqlSessionFactory factory = new SqlSessionFactoryBuilder().build( // stream, "development"); SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(stream); session = factory.openSession(); } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } return session; } /* * 获取数据库访问链接 */ public static void closeSession(SqlSession session) { session.close(); } }
4.CatagoryMapper.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.franson.study.interfaces.ICatagoryOperation"> <!-- 此处的resultType就是对应刚刚你在typeAlias节点里面规定的别名 --> <select id="inserteCatagory" parameterType="Catagory"> insert into tb_catagories(name,description) values(#{name},#{description}) </select> <select id="getCatagorybyID" resultType="Catagory" parameterType="java.lang.Integer"> select * from tb_catagories where id=#{id} </select> </mapper>
5.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> <typeAliases> <typeAlias type="com.franson.study.model.Catagory" alias="Catagory" /> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver" /> <!-- ?useUnicode=true&characterEncoding=utf8为了支持中文数据的写入 --> <property name="url" value="jdbc:mysql://127.0.0.1:3306/db_catagory?useUnicode=true&characterEncoding=utf8" /> <property name="username" value="root" /> <property name="password" value="123456" /> </dataSource> </environment> </environments> <mappers> <mapper resource="mapper/CatagoryMapper.xml" /> </mappers> </configuration>
6.TestMybatis测试入口类
public class TestMybatis { public static void main(String[] args) { addTest(); getTest(); } /* * 添加Catagory */ static void addTest() { SqlSession sqlSession = MyBatisUtils.getSqlSession(); ICatagoryOperation catagoryOperation = sqlSession.getMapper(ICatagoryOperation.class); Catagory item = new Catagory(); item.setName("sql server"); item.setDescription("sql server类"); int result = catagoryOperation.inserteCatagory(item); if (result > 0) { sqlSession.commit(); System.out.println("添加成功"); } else sqlSession.rollback(); MyBatisUtils.closeSession(sqlSession); } /* * 根据ID获取Catagory */ static void getTest() { SqlSession sqlSession = MyBatisUtils.getSqlSession(); ICatagoryOperation catagoryOperation = sqlSession.getMapper(ICatagoryOperation.class); System.out.println(catagoryOperation.getCatagorybyID(3).toString()); MyBatisUtils.closeSession(sqlSession); } }
7.测试运行结果
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话