【Maven+SSM】Mybatis基础使用及动态SQL拼接根据对象查询数据

来源:互联网 发布:樱井知香作品在线播放 编辑:程序博客网 时间:2024/06/16 13:15

一、创建一个SSM项目我就不多说了。详见这篇文章。

二、Mybatis的基础使用。

1、创建一个数据库

create database mysql_db;

2、创建一个数据表

CREATE TABLE `mysql_db`.`userinfo` (
  `id` INT UNSIGNED NOT NULL AUTO_INCREMENT,
  `username` VARCHAR(45) NULL,
  `password` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`id`, `password`));

3、插入一条数据

INSERT INTO `mysql_db`.`userinfo` (`username`, `password`) VALUES ('bobo', '111111');

4、修改连接数据库配置文件jdbc.properties

driver=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/mysql_db?useUnicode=true&characterEncoding=UTF-8username=rootpassword=haibo1118initialSize=5

5、修改Mybatis的核心配置generatorConfig.xml自动生成的BookMapper.xml和BookMapper.java代码修改。

BookMapper.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="dao.BookMapper">  <resultMap id="userMap" type="model.UserInfo">    <id column="id" jdbcType="VARCHAR" property="id" />    <result column="username" jdbcType="VARCHAR" property="username" />    <result column="password" jdbcType="VARCHAR" property="password" />  </resultMap>    <select id="selectByUsername" parameterType="java.lang.String" resultMap="userMap">    select     id,username,password     from userinfo    where username = #{username,jdbcType=VARCHAR}  </select>  </mapper>
下面是搜索select的语句,id对应BookMapper.java的接口:命名空间namespace对应的BookMapper.java的位置。resultMap对应结果集。

BookMapper.java修改如下:

package dao;import model.UserInfo;public interface BookMapper {    UserInfo selectByUsername(String username);}
补充,UserInfo代码如下:

package model;public class UserInfo {private int id;private String username;private String password;public String getUsername() {return username;}public void setUsername(String username) {this.username = username;}public String getPassword() {return password;}public void setPassword(String password) {this.password = password;}public int getId() {return id;}public void setId(int id) {this.id = id;}@Overridepublic String toString() {return "UserInfo [id=" + id + ", username=" + username + ", password=" + password + "]";}}
6、测试Mybatis
直接上代码,service接口如下:

package service;import model.UserInfo;public interface UserService {UserInfo getUserInfo(String username);}
接口实现如下:

package service;import javax.annotation.Resource;import org.springframework.stereotype.Service;import dao.BookMapper;import model.UserInfo;@Servicepublic class UserServiceImpl implements UserService{@Resourceprivate BookMapper bookDao;@Overridepublic UserInfo getUserInfo(String username) {return bookDao.selectByUsername(username);}}
controller如下:

package controller;import javax.annotation.Resource;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.RequestMapping;import model.UserInfo;import service.UserService;@Controllerpublic class EncodeController {@Resourceprivate UserService userService;@RequestMapping(value="h.do")public String viewAll2(UserInfo userInfo) {System.out.println(userService.getUserInfo("bobo").toString());return "successlogin";}}
这样就完成了简单的Mybatis代码编写。

仅仅这么简单的查询如果已经满足不了我们,需要各种条件判断的复杂查询怎么写呢?


三、Mybatis的一些复杂运用。

1、根据多个参数(或者说某个对象)查询:

之前传递参数仅仅传递了一个String参数。

parameterType="java.lang.String"

现在我要传递两个参数如何处理?先写一个必须传递两个参数的场景。

现在我在数据库中插入两条数据。

insert into userinfo(username,password) values ("xiaoming","222222");

insert into userinfo(username,password) values ("xiaoming","222222");

其中id自增长。查询结果如下。


现在我再通过姓名去搜索的xiaoming发现搜出来了两条数据。就会报这个错误。

org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 2

但是我返回结果仅仅只是一个对象,不是list。而且我本意就是精确搜索。

那么我需要id参数去区分。

parameterType

只能传递一个参数,因此我这里传递一个对象。就用UserInfo对象吧

parameterType="model.UserInfo"

修改BookMapper.java文件,新增一条select查询。

UserInfo selectByUser(UserInfo user);

修改BookMapper.xml文件,新增代码如下:

<selectid="selectByUser"parameterType="model.UserInfo"resultMap="userMap">

    select 

    id,username,password 

    fromuserinfo

    where 1 = 1

   <iftest="id!=0 and !&quot;&quot;.equals(username.trim())">andusername=#{username}</if>

   <iftest="id!=0 and !&quot;&quot;.equals(username.trim())">and id=#{id}</if>

 </select>

其中返回结果不变。可见最大的区别是if语句。这个语法是OGNL语法。OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法。

其中test后id,username都是直接通过取对象UserInfo的属性来获取数据。但是它有自己的语法,比如and,or这些。而且其中“”双引号需要用转义写法 &quot;&quot;  表示。

这样就可以精确搜到第二条数据并且叫做xiaoming的这个人。

当然OGNL还有其他的语法规则例如for each循环从列表数据中取出。







原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 打闲来麻将老输怎么办 儿子欠老子钱不还怎么办 傲风电竞椅扶手坏了怎么办 桑蚕丝面料发黄了怎么办? 天然植物纤维面料发黄怎么办 阴阳师吸血姬血太厚了怎么办 电话被骗了钱怎么办 镇魔曲元宝被扣怎么办 镇魔曲以前的角色怎么办 镇魔曲手游转职后装备怎么办 镇魔曲个性标签任务怎么办 教师资格证申请表打不开怎么办 怎么办appstore换到日本 电脑内存太小怎么办 win10声音卡顿怎么办 录音播放卡顿怎么办 笔记本电脑玩dnf卡怎么办 龙之谷约惠码被删了怎么办 天涯明月刀马没有了怎么办 icloud照片无法同步怎么办 ipad不能下载app怎么办 ipad屏幕孔进水怎么办 ipad无法验证登录怎么办 dnf电脑配置低怎么办 淘宝直播粉丝不够怎么办 电脑页面显示不全怎么办 脸上发痒长痘怎么办 扣扣魔性表情泡泡消失怎么办 脚起小泡泡很痒怎么办 孕妇脚痒起水泡怎么办 孕妇手脚起湿疹怎么办 嘴巴破皮了怎么办 小便刺痛阴唇红肿怎么办 集成墙面挂照片怎么办 苹果电脑网页游戏打不开怎么办 苹果6plus发热怎么办 玩手游手机太卡怎么办 苹果七发烫厉害怎么办 苹果手机延迟高怎么办 王者荣耀总是卡怎么办 王者荣耀卡屏怎么办