【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 !"".equals(username.trim())">andusername=#{username}</if>
<iftest="id!=0 and !"".equals(username.trim())">and id=#{id}</if>
</select>
其中返回结果不变。可见最大的区别是if语句。这个语法是OGNL语法。OGNL是Object-Graph Navigation Language的缩写,它是一种功能强大的表达式语言,通过它简单一致的表达式语法,可以存取对象的任意属性,调用对象的方法。
其中test后id,username都是直接通过取对象UserInfo的属性来获取数据。但是它有自己的语法,比如and,or这些。而且其中“”双引号需要用转义写法 "" 表示。
这样就可以精确搜到第二条数据并且叫做xiaoming的这个人。
当然OGNL还有其他的语法规则例如for each循环从列表数据中取出。
- 【Maven+SSM】Mybatis基础使用及动态SQL拼接根据对象查询数据
- 【Maven+SSM】Mybatis动态SQL拼接根据对象删除单条或者多条数据
- 根据条件查询动态拼接sql语句
- 根据查询参数list动态拼接SQL
- Mybatis动态拼接SQL
- Mybatis动态拼接SQL
- MyBatis动态拼接SQL
- Mybatis动态拼接sql
- ssm项目使用Mybatis动态拼接sql语句,生成的sql中文全部显示为???的问题(配置文件sql语句中文解析问题)
- mybatis mapper使用字段使用in 查询sql语句拼接
- mybatis使用及动态sql
- mybatis中怎么使用like形成动态模糊查询,错误使用CONCAT拼接sql的看过来
- 使用存储过程查询数据库(sql有动态拼接)
- php根据查询条件拼接sql语句
- MyBatis动态sql查询
- Mybatis动态sql查询
- mybatis动态sql查询
- MyBatis模糊查询的sql拼接
- czl蒟蒻的模板库2——FASTIO
- 网络字节序转化
- isNotEmpty 和isNotBlank的区别
- 友盟集成QQ第三方登录
- czl蒟蒻的模板库3——KMP
- 【Maven+SSM】Mybatis基础使用及动态SQL拼接根据对象查询数据
- Handler内存泄漏
- 11.9
- 百度自动驾驶系统Apollo源码分析
- IOS-Quartz2D & CALayer & CAShapeLayer
- vc状态栏添加进度条
- czl蒟蒻的模板库4——Tarjan
- h5表格隔行换色
- RAM/DDR/ROM/FLASH/EMMC