天天看点

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>
           

初学笔记,若有错误还请大佬指正,谢谢!

继续阅读