mybatis使用案例
一、MyBatis是一个基于Java的持久层框架。它支持定制化 SQL、存储过程以及高级映射。MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集。MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java对象)映射成数据库中的记录。
二、开始使用
1.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>
<environments default="development">
<environment id="development">
<!-- 采用jdbc事务管理 -->
<transactionManager type="JDBC" />
<!-- 采用jdbc数据库连接池 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/fresh" />
<property name="username" value="root" />
<property name="password" value="a" />
</dataSource>
</environment>
</environments>
<!-- 配置访问数据库的映射文件 -->
<mappers>
<mapper resource="mapper/TypeInfoMapper.xml" />
</mappers>
</configuration>
2.实体类
package com.hx.mybatis.empty;
public class TypeInfo {
private int tno;
private String tname;
private int status;
@Override
public String toString() {
return "TypeInfo [tno=" + tno + ", tname=" + tname + ", status=" + status + "]";
}
public int getTno() {
return tno;
}
public void setTno(int tno) {
this.tno = tno;
}
public String getTname() {
return tname;
}
public void setTname(String tname) {
this.tname = tname;
}
public int getStatus() {
return status;
}
public void setStatus(int status) {
this.status = status;
}
public TypeInfo(int tno, String tname, int status) {
super();
this.tno = tno;
this.tname = tname;
this.status = status;
}
public TypeInfo() {
super();
}
}
3.映射文件
<?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="/">
<!--
根据类型编号来查询信息,
id:是一个唯一标识,相当于数据中的主键,在同一命名空间下,不可出现同名id,
parameterType:参数类型 ,
resultType:返回类型
-->
<select id="findByTno" parameterType="int"
resultType="com.hx.mybatis.empty.TypeInfo">
<!-- #{id}获取用户给定的参数,若用户给定的是一个对象或map等这类有属性或键的,
那么#{}中就写对应的属性名或名字 -->
select * from typeinfo where tno = #{_parameter}
<!-- _parameter 指传的parameter参数-->
</select>
<!--
添加一個類型信息;
用戶給定的參數就是需要添加這個類型對象;
對應的增、刪、改,返回值都是語句執行后所影響的行數,故可不指定resultType
-->
<insert id="add" parameterType="com.hx.mybatis.empty.TypeInfo">
<!-- 自增列可写0或null -->
insert into typeinfo values(0,#{tname},#{status})
</insert>
</mapper>
4.测试类
package com.hx.d190831MyBatis1;
import java.io.IOException;
import java.io.Reader;
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.hx.mybatis.empty.TypeInfo;
public class MybatisTest{
//运行方式:选中方法名右击 -> run as -> junit test
@Test
public void test1() throws IOException{
//注意:mybatis-config.xml配置文件没有放在任何包中,若放在保重,则前边需要加上包路径
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(reader);
SqlSession ss = ssf.openSession(); //获取一个查询会话,相当于DBHelper中的建立连接
TypeInfo tf = ss.selectOne("findByTno",1);
//第一个参数是要执行的语句的id,这个id的值就是mapper文件中配置的各个执行语句中id属性的属性值
System.out.println( tf );
}
}
三、mybatis扩展
1.#{} 和 $ {} 都可以取值,但是#{}是采用的预编译方式,而$ {}采用的是字符串拼接方式。所以使用$ {}会有sql注入的风险
2.mybatis取值
<delete id="delete" parameterType="int">
delete from typeinfo where tno=#{0}<!-- #{0}取到传过来的参数中索引为0的,即第一个 -->
</delete>
<delete id="delete1" parameterType="int">
delete from typeinfo where tno=#{_parameter} <!-- _parameter 指传的parameter参数-->
</delete>
<delete id="delete2" parameterType="int">
delete from typeinfo where tno=#{tno} <!-- 直接写参数名 -->
</delete>
3.实体类的属性名与列名不一致
<!-- 当实体类的属性名与列名不一致时,需要进行处理。 eg:现在只定义了一个TypeInfo,若此时想要查询商品信息表中的gno,gname,则可以使用一下方法。 -->
<!-- 1.用map返回: 注意:此时传递过来的参数是一个map,查询语句中需要引用的是page和rows,即map中必须有page和rows这两个键 -->
<select id="findByPage" parameterType="map" resultType="map">
select
gno,gname,price from goodsinfo limit #{page},#{rows}
</select>
<!-- 2.重命名列 -->
<select id="findByPage1" parameterType="map"
resultType="TypeInfo">
select gno as tno,gname as tname from goodsinfo limit
#{page},#{rows}
</select>
4.resultMap映射(可以使用在对象中包含对象的查询情况)
<!-- resultMap 映射 -->
<select id="findByPage2" parameterType="map"
resultMap="goodsInfo">
select gno,gname from goodsinfo limit #{page},#{rows}
</select>
<select id="findAll" parameterType="map" resultMap="goodsInfo">
select
gno,gname from goodsinfo
</select>
<!-- 这个resultMap返回的类型是TypeInfo对象,与直接在select中指定resultType的区别在于,可以对实体属性和结果集中的列做映射 -->
<resultMap id="goodsInfo" type="TypeInfo">
<!-- 指定表中主键列与实体类中的属性的对应关系 -->
<id column="gno" property="tno" />
<!-- 指定表中非主键列与实体类中的属性的对应关系 -->
<result column="gname" property="tname" />
</resultMap>
初学笔记,若有错误还请大佬指正,谢谢!
本文来自博客园,作者:Huathy,遵循 CC 4.0 BY-NC-SA 版权协议。转载请注明原文链接:https://www.cnblogs.com/huathy/p/17253938.html
标签:
mybatis
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!