mybatis Mapper文件内的配置标签使用 & CRUD编写 场景作用理解(一)

文章目录:

前言:
  • 开始一段Mybatis旅程。
Mybatis的中文官网:

http://www.mybatis.org/mybatis-3/zh/index.html

本篇主要讲解Mybatis 的标签使用,理解其含义在什么场景使用;
写本文章的目的是为了让自己更清晰的理解Mybatis 标签使用场景,编写顺序。

Mybatis 的内容编写顺序:
  • 第一步: 先编写实体类,也就是你数据库中用到的表数据字段。实体类名称要见名知意。

  • 第二步:编写dao层接口,也就是 ShowUserMapper 这个接口。然后根据自己的需求进行编写对应的CRUD 需求。

  • 第三步:编写接口映射文件,也就是mapper映射文件,在resources 目录下进行创建,使用new---->file 哪个文件夹进行创建!一般都放在此目录下,养成好习惯。。

  • 上面部分先做个截图总结:
    mybatis   Mapper文件内的配置标签使用 &  CRUD编写 场景作用理解(一)

  • 第四步:理解映射文件的标签及编写

mapper 映射文件的理解与案例:

1、mapper 映射文件中的红框部分记得更改下!
mybatis   Mapper文件内的配置标签使用 &  CRUD编写 场景作用理解(一)
1、mapper 映射文件中namespace 中绑定的是mapper 接口所在类的全限定名!
2、标签查询中的 id中对应的是接口中的方法名。
3、resultType :代表–> 返回结果(ResultType相对与ResultMap而言更简单一点。)

resultType 使用:

resultType 只有满足ORM(Object Relational Mapping,对象关系映射)时,即数据库表中的字段名和实体类中的属性完全一致时,才能使用,否则会出现数据不显示的情况。

ResultMap 使用:

ResultMap 使用:ResultMap和ResultType的功能类似,但是ResultMap更强大一点,ResultMap可以实现将查询结果映射为复杂类型的pojo。

ResultMap映射 使用用场景:
当查询出来的字段名和对象中的属性名不一致的情况,就没办法使用resultType来默认映射(同名规则)
解决方案:
使用resultMap来映射数据库中的字段到底注入到对象中什么属性中,说白了就是结局数据库不一致的问题,为了简写操作可以!

实战演练Mybatis 标签与理解:
  • 接口代码如下:

public interface ShowUserMapper {
// 查询出所有用户
List getShowUser();
// 根据ID查询某个用户
User getUserbyid(int id);
// 新增一个用户
void insertUserBy(User user);
//更新一个用户
int UpdateUserBy(Map map);
}

  • 实体类
    @Data
    @AllArgsConstructor
    @NoArgsConstructor
    public class User {
    private int id;
    private String firstname;
    private String lastname;
    private String sex;
    private int score;
    private int copyid;

  • 数据库中的字段:

CREATE TABLE user_q(
id INT NOT NULL AUTO_INCREMENT,
first_name VARCHAR(10) NOT NULL,
last_name VARCHAR(10) NOT NULL,
sex VARCHAR(5) NOT NULL,
score INT NOT NULL,
copy_id INT NOT NULL,
PRIMARY KEY (id)
);

  • 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>
         <properties resource="db.properties">
         </properties>
	<!--开启驼峰命名 -->
	<settings>
    <setting name="mapUnderscoreToCamelCase" value="true"/>
	</settings>
<environments default="development">
    <environment id="development">
        <transactionManager type="JDBC"/>
        <dataSource type="POOLED">
            <property name="driver" value="${driver}"/>
            <property name="url" value="${url}"/>
            <property name="username" value="${username}"/>
            <property name="password" value="${password}"/>
        </dataSource>
    </environment>
</environments>
<!-- 如下绑定的是SQL 映射文件也就是dao层下 mapper接口的映射文件与dao层的名称一致保持>
<mappers>
    <mapper resource="ShowUserMapper.xml"/>
</mappers>
  • ShowUserMapper.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">
    <!--namespace 绑定的是dao接口的全限定名称 -->
<mapper namespace="com.ZQQQ.dao.ShowUserMapper">
	<resultMap id="ShowUserMapper" type="pojo.User">
	<result property="id" column="id"/>
	<result property="firstname" column="first_name"/>
	<result property="lastname" column="last_name"/>
    <result property="sex" column="sex"/>
    <result property="score" column="score"/>
    <result property="copyid" column="copy_id"/>
</resultMap>
	<!-- 查询所有-->
	<select id="getShowUser" resultMap="ShowUserMapper">
	select * from user_q
	</select>
	    <!--根据Id 查询某一个用户的全部信息 -->
	<select id="getUserbyid" resultMap="ShowUserMapper">
select * from user_q where id= #{id}
</select>
    <!--插入一条数据-->
<insert id="insertUserBy"  parameterType="pojo.User" useGeneratedKeys="true" keyProperty="id">
insert into  user_q(id,first_name,last_name,sex,score,copy_id) values(
            #{id},
            #{firstname},
            #{lastname},
            #{sex},
            #{score},
            #{copyid}
    )
</insert>
<update id="UpdateUserBy" parameterType="map">
   update user_q
   <set>
       <if test="last_name !=null">
        last_name=#{last_name},
        </if>
    <if test="sex !=null">
        sex =#{sex}
    </if>
</set>	where id =#{id}
</select>
  • id 绑定的是接口方法名
  • resultMap 绑定的是dao 层接口的方法名。
id、result语句属性配置细节:

mybatis   Mapper文件内的配置标签使用 &  CRUD编写 场景作用理解(一)

resultMap 标签总结:

注意不要有空格,不然会有绑定异常!!

标签名字 含义
namespace dao层接口的全限定名
resultMap resultMap 内的标签id:绑定的是接口方法名,type :返回值的全限定类名,或类型别名。
id 绑定的也是接口全限定名称
type 实体类,使用报名点实体类名
property 需要映射的字段,编写标签时必须要和实体类的字段一致 resultMap 的特色这个是
column 数据库字段名
CRUD 中的ID 接口方法名
resultMap 也是dao层接口的全限定名,也就是叫结果集映射,不然显示为null
useGeneratedKeys 要求数据库本身具备主键自动增长的功能,比如说,mysql,sqlserver可以使用useGeneratedKeys =true 这功能,不支持主键自动增长的数据库是不能使用useGeneratedKeys =true的
keyProperty keyProperty=“id” ,这个keyProperty的id就是我们要返回的主键id
备注 useGeneratedKeys 和keyProperty 只有在新增也就是insert标签内的时候使用
foreach foreach元素的属性主要有item,index,collection,open,separator,close。
item item是指你循环对象的别名,可以由我们自己定义,只要能够对应就好。
separator separator=’,'是指你用什么分隔符分隔
if 动态SQL之if语句
where where 标签和if标签结合使用
set 用于动态更新语句的类似解决方案叫做 set。set 元素可以用于动态包含需要更新的列,忽略其它不更新的列。set 元素会动态地在行首插入 SET 关键字,并会删掉额外的逗号(这些逗号是在使用条件语句给列赋值时引入的)。此元素是更新时所使用得
  • 测试类代码:

package com.ZQQQ.dao;
import org.apache.ibatis.session.SqlSession;
import org.junit.Test;
import pojo.User;
import utils.MybatisUtils;
import java.util.List;
public class InfoUserTest {

@Test
//查询出全部用户
public void getShowUser(){
	SqlSession sqlSession = MybatisUtils.getSQLSession();
	ShowUserMapper mapper = sqlSession.getMapper(ShowUserMapper.class);
	List<User> showUser = mapper.getShowUser();
	for (User  user: showUser ){
		System.out.println(user);
	}
	sqlSession.close();
}

}

  • 测试类结果:
    mybatis   Mapper文件内的配置标签使用 &  CRUD编写 场景作用理解(一)

@Test
// 根据id 查询出某个用户
public void getUserbyid(){
SqlSession sqlSession = MybatisUtils.getSQLSession();
ShowUserMapper mapper = sqlSession.getMapper(ShowUserMapper.class);
User use = mapper.getUserbyid(3);
// System.out.println(“您的ID为:”+use.getId()+"\n"+“您的性别为”+use.getSex());
System.out.println(“该用户的信息为:”+use);
sqlSession.close();
}
//新增一个用户
@Test
public void insertUserBy(){
SqlSession sqlSession = MybatisUtils.getSQLSession();
ShowUserMapper mapper = sqlSession.getMapper(ShowUserMapper.class);
User user = new User();
user.setId(1001);
user.setFirstname(“贺”);
user.setLastname(“xinian”);
user.setSex(“男”);
user.setScore(99);
user.setCopyid(1001);
//List list = mapper.insertUserBy(user);
mapper.insertUserBy(user);
System.out.println(user.toString());
if (user !=null){
System.out.println(“恭喜您啊插入成功了!!!”);
}
sqlSession.close();
}

mybatis   Mapper文件内的配置标签使用 &  CRUD编写 场景作用理解(一)

@Test
public void UpdateUserBy(){
SqlSession sqlSession = MybatisUtils.getSQLSession();
ShowUserMapper mapper = sqlSession.getMapper(ShowUserMapper.class);
HashMap map = new HashMap();
map.put(“last_name”,“喜年”);
map.put(“sex”,“女”);
map.put(“id”,1001);
mapper.UpdateUserBy(map);
sqlSession.close();
}
mybatis   Mapper文件内的配置标签使用 &  CRUD编写 场景作用理解(一)

resultMap包含的元素的使用方法:
<!--column不做限制,可以为任意表的字段,而property须为type 定义的pojo属性-->

<resultMap id="唯一的标识" type="映射的pojo对象">
  <id column="表的主键字段,或者可以为查询语句中的别名字段" jdbcType="字段类型" property="映射pojo对象的主键属性" />
  <result column="表的一个字段(可以为任意表的一个字段)" jdbcType="字段类型"  property="映射到pojo对象的一个属性(须为type定义的pojo对象中的一个属性)"/>
  <association property="pojo的一个对象属性" javaType="pojo关联的pojo对象">
 <id column="关联pojo对象对应表的主键字段" jdbcType="字段类型" property="关联pojo对象的主席属性"/>
 <result  column="任意表的字段" jdbcType="字段类型" property="关联pojo对象的属性"/
</association>
<!-- 集合中的property须为oftype定义的pojo对象的属性-->
<collection property="pojo的集合属性" ofType="集合中的pojo对象">
<id column="集合中pojo对象对应的表的主键字段" jdbcType="字段类型" property="集合中pojo对象的主键属性" />
<result column="可以为任意表的字段" jdbcType="字段类型" property="集合中的pojo对象的属性" />  
  </collection>
	 	</resultMap>

如果collection标签是使用嵌套查询,格式如下:

<collection column="传递给嵌套查询语句的字段参数" 
property="pojo对象中集合属性" 
ofType="集合	属性中的pojo对象" select="嵌套的查询语句" > 
</collection>

注意:标签中的column:要传递给select查询语句的参数,如果传递多个参数,格式为column= ” {参数名1=表字段1,参数名2=表字段2} ;

分页查询 案例:

// 分页查询
List getUserByLimit(HashMap<String, Integer> map);
mybatis   Mapper文件内的配置标签使用 &  CRUD编写 场景作用理解(一)

// 分页查询
@Test
public void getUserByLimit(){
SqlSession sqlSession = MybatisUtils.getSQLSession();
ShowUserMapper mapper = sqlSession.getMapper(ShowUserMapper.class);
HashMap<String,Integer> map = new HashMap<String,Integer>();
map.put(“startIndex”,0);
map.put(“pageSize”,10);
List userByLimit = mapper.getUserByLimit(map);
for (User s:userByLimit ){
System.out.println(“分页显示”+ s);
}
sqlSession.close();
}

mybatis   Mapper文件内的配置标签使用 &  CRUD编写 场景作用理解(一)

-----------------------------------------要克服生活的焦虑和沮丧,得先学会做自己的主人-----------------------------------------

上一篇:user模块功能完成crud-王荣荣如此唯美


下一篇:ElasticSearch Java API之crud