文章目录:
前言:
- 开始一段Mybatis旅程。
Mybatis的中文官网:
http://www.mybatis.org/mybatis-3/zh/index.html
本篇主要讲解Mybatis 的标签使用,理解其含义在什么场景使用;
写本文章的目的是为了让自己更清晰的理解Mybatis 标签使用场景,编写顺序。
Mybatis 的内容编写顺序:
-
第一步: 先编写实体类,也就是你数据库中用到的表数据字段。实体类名称要见名知意。
-
第二步:编写dao层接口,也就是 ShowUserMapper 这个接口。然后根据自己的需求进行编写对应的CRUD 需求。
-
第三步:编写接口映射文件,也就是mapper映射文件,在resources 目录下进行创建,使用new---->file 哪个文件夹进行创建!一般都放在此目录下,养成好习惯。。
-
上面部分先做个截图总结:
-
第四步:理解映射文件的标签及编写
mapper 映射文件的理解与案例:
1、mapper 映射文件中的红框部分记得更改下!
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语句属性配置细节:
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();
}
}
- 测试类结果:
@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();
}
@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();
}
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);
// 分页查询
@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();
}
-----------------------------------------要克服生活的焦虑和沮丧,得先学会做自己的主人-----------------------------------------