Mybits入门
文章目录1、Mybatis概述1.1、Mybatis简介2、MyBatis入门3、Mapper代理开发4、MyBatis核心配置文件5、配置文件完成增删改查6、注解完成增删改查7、动态SQL1、Mybatis概述1.1、Mybatis简介MyBatis 是一款优秀的持久层框架,用于简化 JDBC 开发MyBatis 本是 Apache 的一个开源项目iBatis, 2010年这个项目由apache
文章目录
1、Mybatis概述
1.1、Mybatis简介
- MyBatis 是一款优秀的持久层框架,用于简化 JDBC 开发
- MyBatis 本是 Apache 的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis 。2013年11月迁移到Github
- 官网:https://mybatis.org/mybatis-3/zh/index.html
持久层:
- 负责将数据到保存到数据库的那一层代码。
- 以后开发我们会将操作数据库的Java代码作为持久层。而Mybatis就是对jdbc代码进行了封装。
- JavaEE三层架构:表现层、业务层、持久层
作用:
- MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。
持久层框架的使用占比。
2、MyBatis入门
需求:查询user表中所有数据。
-
创建user表,添加数据
create database mybatis; use mybatis; drop table if exists tb_user; create table tb_user( id int primary key auto_increment, username varchar(20), password varchar(20), gender char(1), addr varchar(30) ); INSERT INTO tb_user VALUES (1, 'zhangsan', '123', '男', '北京'); INSERT INTO tb_user VALUES (2, '李四', '234', '女', '天津'); INSERT INTO tb_user VALUES (3, '王五', '11', '男', '西安');
-
一、创建模块,导入坐标
在创建好的模块中的 pom.xml 配置文件中添加依赖的坐标<dependencies> <!--mybatis 依赖--> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.5.5</version> </dependency> <!--mysql 驱动--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.46</version> </dependency> <!--junit 单元测试--> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13</version> <scope>test</scope> </dependency> <!-- 添加slf4j日志api --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-api</artifactId> <version>1.7.20</version> </dependency> <!-- 添加logback-classic依赖 --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency> <!-- 添加logback-core依赖 --> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-core</artifactId> <version>1.2.3</version> </dependency> </dependencies>
-
二、注意:需要在项目的resources目录下创建
logback.xml
的文件
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--
CONSOLE :表示当前的日志信息是可以输出到控制台的。
-->
<appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[%level] %blue(%d{HH:mm:ss.SSS}) %cyan([%thread]) %boldGreen(%logger{15}) - %msg %n</pattern>
</encoder>
</appender>
<logger name="com.itheima" level="DEBUG" additivity="false">
<appender-ref ref="Console"/>
</logger>
<!--
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
, 默认debug
<root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。
-->
<root level="DEBUG">
<appender-ref ref="Console"/>
</root>
</configuration>
-
三、编写MyBatis核心配置文件
在模块下的 resources 目录下创建mybatis的配置文件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> <typeAliases> <package name="com.chuhe.pojo"/> </typeAliases> <!-- environments:配置数据库连接环境信息。可以配置多个environment,通过default属性切换不同的environment --> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <!--数据库连接信息--> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?useSSL=false"/> <property name="username" value="root"/> <property name="password" value="1234"/> </dataSource> </environment> <environment id="test"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <!--数据库连接信息--> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/> <property name="username" value="root"/> <property name="password" value="1234"/> </dataSource> </environment> </environments> <mappers> <!--加载sql映射文件--> <!--我们映射的是tb_user这张表,这里我们起名叫UseMapper.xml--> <mapper resource="UserMapper.xml"/> </mappers> </configuration>
-
四、编写 SQL 映射文件
在模块的resources
目录下创建映射配置文件UserMapper.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设置的是名称空间,这里起名为test--> <mapper namespace="test"> <!-- id设置的名称是该处设置的sql唯一名称; resultType设置的为该sql的返回值类型,这里我们返回的ResultSet最终封装成User对象 --> <select id="selectAll" resultType="com.chuhe.pojo.User"> select * from tb_user; </select> </mapper>
-
五、在
com.chuhe.pojo
包下创建 User类package com.chuhe.pojo; public class User { private String id; private String username; private String password; private String gender; private String addr; public String getId() { return id; } public void setId(String id) { this.id = id; } 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 String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public String getAddr() { return addr; } public void setAddr(String addr) { this.addr = addr; } @Override public String toString() { return "User{" + "id='" + id + '\'' + ", username='" + username + '\'' + ", password='" + password + '\'' + ", gender='" + gender + '\'' + ", addr='" + addr + '\'' + '}'; } }
-
六、 编写测试类
package com.chuhe.pojo; 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 java.io.IOException; import java.io.InputStream; import java.util.List; public class Demo { public static void main(String[] args) throws IOException { //加载mybatis的核心配置文件,获取SqlSessionFactory String resource="mybatis-config.xml"; InputStream inputStream= Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); //获取SqlSession对象,用来执行sql SqlSession sqlSession=sqlSessionFactory.openSession(); //执行sql List<User> users=sqlSession.selectList("test.selectAll"); //参数是一个字符串,该字符串必须是映射配置文件的namespace.id System.out.println(users); //释放资源 sqlSession.close(); } }
3、解决SQL映射文件的警告提示
映射配置文件中存在报红的情况。问题如下:
产生原因: IDEA和数据库没有建立连接,不识别表信息。但它并不影响程序的执行。
解决方式: 在Idea中配置MySQL数据库连接。
4、Mapper代理开发
4.1、解决的问题
- 使用加载sql映射文件这种方法,也存在硬编码的问题,不利于后期维护
- 使用 Mapper 代理方式(如下图)则不存在硬编码问题。
Mapper 代理方式的目的:
解决原生方式中的硬编码
简化后期执行SQL
4.2、使用Mapper代理要求
-
一、定义与SQL映射文件同名的Mapper接口,并且将Mapper接口和SQL映射文件放置同一目录下。 如下图
-
二、设置SQL映射文件的namespace属性为Mapper接口全限定名
-
三、在 Mapper 接口中定义方法,方法名就是SQL映射文件中sql语句的id,并保持参数类型和返回值类型一致。
4.3、代码实现
-
在
com.chuhe.mapper
包下创建 UserMapper接口,代码如下:package com.chuhe.mapper; import com.chuhe.pojo.User; import java.util.List; public interface UserMapper { List<User> selectAll(); }
-
在
resources
下创建com/itheima/mapper
目录,并在该目录下创建 UserMapper.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设置的是名称空间,这里起名为test--> <!--namespace设置的是名称空间,必须是对应接口的全限定名--> <mapper namespace="com.chuhe.mapper.UserMapper"> <!-- id设置的名称是该处设置的sql唯一名称; resultType设置的为该sql的返回值类型,这里我们返回的ResultSet最终封装成User对象 --> <select id="selectAll" resultType="com.chuhe.pojo.User"> select * from tb_user; </select> </mapper>
-
测试类中代码如下:
package com.chuhe.pojo; import com.chuhe.mapper.UserMapper; 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 java.io.IOException; import java.io.InputStream; import java.util.List; public class Demo { public static void main(String[] args) throws IOException { //加载mybatis的核心配置文件,获取SqlSessionFactory String resource="mybatis-config.xml"; InputStream inputStream= Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); //获取SqlSession对象,用来执行sql SqlSession sqlSession=sqlSessionFactory.openSession(); //执行sql //List<User> users=sqlSession.selectList("test.selectAll"); //参数是一个字符串,该字符串必须是映射配置文件的namespace.id //获取UserMapper接口的代理对象 UserMapper userMapper=sqlSession.getMapper(UserMapper.class); List<User> users=userMapper.selectAll(); System.out.println(users); //释放资源 sqlSession.close(); } }
4.4、包扫描方式简化SQL映射文件的加载
-
不使用Mapper代理mybatis-config.xml配置方法
若存在多个SQL映射文件,需要配置多个标签。<!--加载sql映射文件--> <mapper resource="com/chuhe/mapper/UserMapper.xml"/>
-
使用Mapper代理mybatis-config.xml配置方法
如果Mapper接口名称和SQL映射文件名称相同,并在同一目录下,则可以使用包扫描的方式简化SQL映射文件的加载。<!--mapper代理方式--> <package name="com.chuhe.mapper"/>
4.5、Mapper代理开发配置总结
4.5.1、SQL映射文件
这里以UserMapper.xml为例
一、namespace
<!--namespace设置的是名称空间,必须是对应接口的全限定名-->
<mapper namespace="com.chuhe.mapper.UserMapper">
二、id
UserMapper接口文件中定义的方法必须和id相同。
<select id="selectAll" resultType="com.chuhe.pojo.User">
select * from tb_user;
</select>
三、resultType
resultType为返回值,这里是要封装成User对象,必须要填User类的全限定名。
5、MyBatis核心配置文件
核心配置文件中现有的配置之前已经给大家进行了解释,而核心配置文件中还可以配置很多内容。我们可以通过查询官网看可以配置的内容https://mybatis.org/mybatis-3/zh/configuration.html
5.1、多环境配置
在核心配置文件的 environments
标签中其实是可以配置多个 environment
,使用 id
给每段环境起名,在 environments
中使用 default='环境id'
来指定使用哪儿段配置。我们一般就配置一个 environment
即可。
<?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>
<typeAliases>
<!--
name属性的值是实体类所在包
起别名
可以简化映射配置文件中 resultType 属性值的编写
-->
<package name="com.chuhe.pojo"/>
</typeAliases>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--数据库连接信息-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</dataSource>
</environment>
<environment id="test">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--数据库连接信息-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatis?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</dataSource>
</environment>
</environments>
<!--扫描mapper-->
<mappers>
<package name="com.chuhe.mapper"/>
</mappers>
</configuration>
5.2、类型别名
在映射配置文件中的 resultType
属性需要配置数据封装的类型(类的全限定名)。Mybatis 提供了 类型别名
(typeAliases) 可以简化这部分的书写。
首先需要现在核心配置文件中配置类型别名,也就意味着给pojo包下所有的类起了别名(别名就是类名),不区分大小写。内容如下:
<typeAliases>
<!--name属性的值是实体类所在包-->
<package name="com.chuhe.pojo"/>
</typeAliases>
通过上述的配置,我们就可以简化映射配置文件中 resultType
属性值的编写
<mapper namespace="com.chuhe.mapper.UserMapper">
<select id="selectAll" resultType="user">
select * from tb_user;
</select>
</mapper>
5.3、配置SQL映射文件
6、配置文件完成增删改查
6.1、准备环境
-- 删除tb_brand表
drop table if exists tb_brand;
-- 创建tb_brand表
create table tb_brand
(
-- id 主键
id int primary key auto_increment,
-- 品牌名称
brand_name varchar(20),
-- 企业名称
company_name varchar(20),
-- 排序字段
ordered int,
-- 描述信息
description varchar(100),
-- 状态:0:禁用 1:启用
status int
);
-- 添加数据
insert into tb_brand (brand_name, company_name, ordered, description, status)
values ('三只松鼠', '三只松鼠股份有限公司', 5, '好吃不上火', 0),
('华为', '华为技术有限公司', 100, '华为致力于把数字世界带入每个人、每个家庭、每个组织,构建万物互联的智能世界', 1),
('小米', '小米科技有限公司', 50, 'are you ok', 1);
SELECT * FROM tb_brand;
6.2、安装MyBatisX插件
6.3、MyBaits增删改查案例
Brand.java
package com.chuhe.pojo;
public class Brand {
private Integer id;
private String brandName;
private String companyName;
private Integer ordered;
private String description;
private Integer status;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getBrandName() {
return brandName;
}
public void setBrandName(String brandName) {
this.brandName = brandName;
}
public String getCommanyName() {
return companyName;
}
public void setCommanyName(String commanyName) {
this.companyName = commanyName;
}
public Integer getOrdered() {
return ordered;
}
public void setOrdered(Integer ordered) {
this.ordered = ordered;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
@Override
public String toString() {
return "Brand{" +
"id=" + id +
", brandName='" + brandName + '\'' +
", commanyName='" + companyName + '\'' +
", ordered=" + ordered +
", description='" + description + '\'' +
", status=" + status +
'}';
}
}
mybatisConfig.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>
<typeAliases>
<package name="com.chuhe.pojo"/>
</typeAliases>
<!--
environments:配置数据库连接环境信息。可以配置多个environment,通过default属性切换不同的environment
-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<!--数据库连接信息-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis?useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="1234"/>
</dataSource>
</environment>
</environments>
<mappers>
<!--加载sql映射文件-->
<!-- <mapper resource="com/chuhe/mapper/BrandMapper.xml"/>-->
<package name="com.chuhe.mapper"/>
</mappers>
</configuration>
6.3.1、查询所有数据
BrandMapper.java
package com.chuhe.mapper;
import com.chuhe.pojo.Brand;
import java.util.List;
public interface BrandMapper {
//查询所有
List<Brand> selectAll();
}
BrandMapper.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设置的是名称空间,必须是对应接口的全限定名-->
<mapper namespace="com.chuhe.mapper.BrandMapper">
<resultMap id="brandResultMap" type="com.chuhe.pojo.Brand">
<result column="brand_name" property="brandName"/>
<result column="company_name" property="companyName"/>
</resultMap>
<!--查询所有-->
<select id="selectAll" resultMap="brandResultMap">
select * from tb_brand;
</select>
</mapper>
Demo.java
package com.chuhe.test;
import com.chuhe.mapper.BrandMapper;
import com.chuhe.pojo.Brand;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class Demo {
@Test
public void testSelectAll() throws IOException {
//加载MyBatis核心配置文件,获取SqlSessionFactory
String resource="mybatisConfig.xml";
InputStream inputStream= Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//获取SqlSession对象
SqlSession sqlSession=sqlSessionFactory.openSession();
//获取BrandMapper接口的代理对象
BrandMapper brandMapper = sqlSession.getMapper(BrandMapper.class);
List<Brand> brands=brandMapper.selectAll();
System.out.println(brands);
//释放资源
sqlSession.close();
}
}
6.3.2、查看详情
BrandMapper.java
package com.chuhe.mapper;
import com.chuhe.pojo.Brand;
import java.util.List;
public interface BrandMapper {
//查看详情
Brand selectById(int id);
}
BrandMapper.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设置的是名称空间,必须是对应接口的全限定名-->
<mapper namespace="com.chuhe.mapper.BrandMapper">
<resultMap id="brandResultMap" type="com.chuhe.pojo.Brand">
<result column="brand_name" property="brandName"/>
<result column="company_name" property="companyName"/>
</resultMap>
<!--查看详情-->
<select id="selectById" parameterType="Brand" resultMap="brandResultMap">
select * from tb_brand where id=#{id};
</select>
</mapper>
Demo.java
package com.chuh.test;
import com.chuhe.mapper.BrandMapper;
import com.chuhe.pojo.Brand;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class Demo {
@Test
public void testSelectById() throws IOException {
int id=1;
//加载MyBatis核心配置文件,获取SqlSessionFactory
String resource="mybatisConfig.xml";
InputStream inputStream=Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//获取SqlSession对象
SqlSession sqlSession=sqlSessionFactory.openSession();
//获取BrandMapper接口的代理对象
BrandMapper brandMapper=sqlSession.getMapper(BrandMapper.class);
Brand brand=brandMapper.selectById(id);
System.out.println(brand);
//释放资源
sqlSession.close();;
}
}
6.3.3、条件查询
6.3.3.1、多条件查询:用参数传参
BrandMapper.java
package com.chuhe.mapper;
import com.chuhe.pojo.Brand;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface BrandMapper {
//条件查询
List<Brand> selectByCondition(@Param("status")int status, @Param("companyName")String companyName, @Param("brandName")String brandName);
// List<Brand> selectByCondition(Brand brand);
// List<Brand> selectByCondition(Map map);
}
BrandMapper.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设置的是名称空间,必须是对应接口的全限定名-->
<mapper namespace="com.chuhe.mapper.BrandMapper">
<resultMap id="brandResultMap" type="com.chuhe.pojo.Brand">
<result column="brand_name" property="brandName"/>
<result column="company_name" property="companyName"/>
</resultMap>
<!--条件查询-->
<select id="selectByCondition" resultMap="brandResultMap">
select *
from tb_brand
<where>
<if test="status !=null">
status=#{status}
</if>
<if test="companyName!=null and companyName !=''">
and company_name like #{companyName}
</if>
<if test="brandName!=null and brandName !=''">
and brand_name like #{brandName}
</if>
</where>
</select>
</mapper>
Demo.java
package com.chuh.test;
import com.chuhe.mapper.BrandMapper;
import com.chuhe.pojo.Brand;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class Demo {
@Test
public void testSelectByCondition() throws IOException {
//接收参数
int status=1;
String brandName="华为";
String companyName="华为";
//处理参数
brandName="%"+"华为"+"%";
companyName="%"+"华为"+"%";
//加载MyBatis核心配置文件,获取SqlSessionFactory
String resource="mybatisConfig.xml";
InputStream inputStream=Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//获取SqlSession对象
SqlSession sqlSession=sqlSessionFactory.openSession();
//获取BrandMapper接口的代理对象
BrandMapper brandMapper=sqlSession.getMapper(BrandMapper.class);
List<Brand> brands=brandMapper.selectByCondition(status,companyName,brandName);
System.out.println(brands);
//释放资源
sqlSession.close();
}
}
6.3.3.2、多条件查询:用对象传参
BrandMapper.java
package com.chuhe.mapper;
import com.chuhe.pojo.Brand;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface BrandMapper {
//条件查询
// List<Brand> selectByCondition(@Param("status")int status, @Param("companyName")String companyName, @Param("brandName")String brandName);
List<Brand> selectByCondition(Brand brand);
// List<Brand> selectByCondition(Map map);
}
BrandMapper.xml
三种方法用到的sql一致,这里不变
省略,具体参照
6.3.3.1、用参数传参
中的BrandMapper.xml
Demo.java
package com.chuh.test;
import com.chuhe.mapper.BrandMapper;
import com.chuhe.pojo.Brand;
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 java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class Demo {
@Test
public void testSelectByCondition() throws IOException {
//接收参数
int status=1;
String brandName="华为";
String companyName="华为";
//处理参数
brandName="%"+"华为"+"%";
companyName="%"+"华为"+"%";
Brand brand=new Brand();
brand.setStatus(status);
brand.setCompanyName(companyName);
brand.setBrandName(brandName);
//加载MyBatis核心配置文件,获取SqlSessionFactory
String resource="mybatisConfig.xml";
InputStream inputStream=Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//获取SqlSession对象
SqlSession sqlSession=sqlSessionFactory.openSession();
//获取BrandMapper接口的代理对象
BrandMapper brandMapper=sqlSession.getMapper(BrandMapper.class);
List<Brand> brands=brandMapper.selectByCondition(brand);
System.out.println(brands);
//释放资源
sqlSession.close();
}
}
6.3.3.3、多条件查询:用Map传参
BrandMapper.java
package com.chuhe.mapper;
import com.chuhe.pojo.Brand;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
public interface BrandMapper {
//条件查询
// List<Brand> selectByCondition(@Param("status")int status, @Param("companyName")String companyName, @Param("brandName")String brandName);
// List<Brand> selectByCondition(Brand brand);
List<Brand> selectByCondition(Map map);
}
BrandMapper.xml
三种方法用到的sql一致,这里不变
省略,具体参照
6.3.3.1、用参数传参
中的BrandMapper.xml
Demo.java
package com.chuh.test;
import com.chuhe.mapper.BrandMapper;
import com.chuhe.pojo.Brand;
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 java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Demo {
@Test
public void testSelectByCondition() throws IOException {
//接收参数
int status=1;
String brandName="华为";
String companyName="华为";
//处理参数
brandName="%"+"华为"+"%";
companyName="%"+"华为"+"%";
Map map=new HashMap();
map.put("status",status);
map.put("companyName",companyName);
map.put("brandName",brandName);
//加载MyBatis核心配置文件,获取SqlSessionFactory
String resource="mybatisConfig.xml";
InputStream inputStream=Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//获取SqlSession对象
SqlSession sqlSession=sqlSessionFactory.openSession();
//获取BrandMapper接口的代理对象
BrandMapper brandMapper=sqlSession.getMapper(BrandMapper.class);
List<Brand> brands=brandMapper.selectByCondition(map);
System.out.println(brands);
//释放资源
sqlSession.close();
}
}
6.3.3.4、单条件动查询:只能用对象传参
BrandMapper.java
package com.chuhe.mapper;
import com.chuhe.pojo.Brand;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
public interface BrandMapper {
//单条件动态查询
List<Brand> selectByConditionSingle(Brand brand);
}
BrandMapper.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设置的是名称空间,必须是对应接口的全限定名-->
<mapper namespace="com.chuhe.mapper.BrandMapper">
<resultMap id="brandResultMap" type="com.chuhe.pojo.Brand">
<result column="brand_name" property="brandName"/>
<result column="company_name" property="companyName"/>
</resultMap>
<select id="selectByConditionSingle" resultMap="brandResultMap">
select *
from tb_brand
<where>
<choose>
<when test="status != null">
status=#{status}
</when>
<when test="companyName!=null and companyName !=''">
and company_name like #{companyName}
</when>
<when test="brandName!=null and brandName !=''">
and brand_name like #{brandName}
</when>
</choose>
</where>
</select>
</mapper>
Demo.java
package com.chuh.test;
import com.chuhe.mapper.BrandMapper;
import com.chuhe.pojo.Brand;
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 java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Demo {
@Test
public void testSelectByCondition() throws IOException {
//接收参数
int status=1;
String brandName="华为";
String companyName="华为";
//处理参数
brandName="%"+"华为"+"%";
companyName="%"+"华为"+"%";
Brand brand=new Brand();
brand.setStatus(status);
// brand.setBrandName(brandName);
// brand.setCompanyName(companyName);
//加载MyBatis核心配置文件,获取SqlSessionFactory
String resource="mybatisConfig.xml";
InputStream inputStream=Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//获取SqlSession对象
SqlSession sqlSession=sqlSessionFactory.openSession();
//获取BrandMapper接口的代理对象
BrandMapper brandMapper=sqlSession.getMapper(BrandMapper.class);
List<Brand> brands=brandMapper.selectByConditionSingle(brand);
System.out.println(brands);
//释放资源
sqlSession.close();
}
}
6.3.4、添加
BrandMapper.java
package com.chuhe.mapper;
import com.chuhe.pojo.Brand;
public interface BrandMapper {
void add(Brand brand);
}
BrandMapper.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设置的是名称空间,必须是对应接口的全限定名-->
<mapper namespace="com.chuhe.mapper.BrandMapper">
<resultMap id="brandResultMap" type="com.chuhe.pojo.Brand">
<result column="brand_name" property="brandName"/>
<result column="company_name" property="companyName"/>
</resultMap>
<insert id="add" >
insert into
tb_brand(brand_name,company_name,ordered,description,status)
values(#{brandName},#{companyName},#{ordered},#{description},#{status});
</insert>
</mapper>
Demo.java
package com.chuh.test;
import com.chuhe.mapper.BrandMapper;
import com.chuhe.pojo.Brand;
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 java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
public class Demo {
@Test
public void testAdd() throws IOException {
//接收参数
int status=1;
String brandName="波导手机";
String companyName="波导";
int ordered=100;
String description="手机中的战战斗机";
Brand brand=new Brand();
brand.setStatus(status);
brand.setBrandName(brandName);
brand.setCompanyName(companyName);
brand.setOrdered(ordered);
brand.setDescription(description);
//加载MyBatis核心配置文件,获取SqlSessionFactory
String resource="mybatisConfig.xml";
InputStream inputStream=Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//获取SqlSession对象
//不带参数默认为false表示,开启事务,需手动提交事务
SqlSession sqlSession=sqlSessionFactory.openSession(false);
//获取BrandMapper接口的代理对象
BrandMapper brandMapper=sqlSession.getMapper(BrandMapper.class);
brandMapper.add(brand);
//提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
}
}
SqlSession sqlSession=sqlSessionFactory.openSession(false);
不带参数默认为false,表示开启事务,进行增删改操作后需手动提交事务
true表示关闭事务,会自动提交。
手动提 交事务:
sqlSession.commit();
6.3.4.1、主键返回
- 在数据添加成功后,需要获取插入数据库数据的主键的值。
- 返回添加数据的主键:
<insert useGenerateKeys="true" keyProperty="id">
BrandMapper.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设置的是名称空间,必须是对应接口的全限定名-->
<mapper namespace="com.chuhe.mapper.BrandMapper">
<resultMap id="brandResultMap" type="com.chuhe.pojo.Brand">
<result column="brand_name" property="brandName"/>
<result column="company_name" property="companyName"/>
</resultMap>
<insert id="add" useGeneratedKeys="true" keyProperty="id">
insert into
tb_brand(brand_name,company_name,ordered,description,status)
values(#{brandName},#{companyName},#{ordered},#{description},#{status});
</insert>
</mapper>
Demo.java
package com.chuh.test;
import com.chuhe.mapper.BrandMapper;
import com.chuhe.pojo.Brand;
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 java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Demo {
@Test
public void testAdd() throws IOException {
//接收参数
int status=1;
String brandName="波导手机";
String companyName="波导";
int ordered=100;
String description="手机中的战战斗机";
Brand brand=new Brand();
brand.setStatus(status);
brand.setBrandName(brandName);
brand.setCompanyName(companyName);
brand.setOrdered(ordered);
brand.setDescription(description);
//加载MyBatis核心配置文件,获取SqlSessionFactory
String resource="mybatisConfig.xml";
InputStream inputStream=Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//获取SqlSession对象
//不带参数默认为false表示,开启事务,需手动提交事务
SqlSession sqlSession=sqlSessionFactory.openSession(false);
//获取BrandMapper接口的代理对象
BrandMapper brandMapper=sqlSession.getMapper(BrandMapper.class);
brandMapper.add(brand);
System.out.println("添加数据的主键:"+brand.getId());
//提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
}
}
6.3.5、修改全部字段
BrandMapper.java
package com.chuhe.mapper;
import com.chuhe.pojo.Brand;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
public interface BrandMapper {
int updata(Brand brand);
}
BrandMapper.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设置的是名称空间,必须是对应接口的全限定名-->
<mapper namespace="com.chuhe.mapper.BrandMapper">
<resultMap id="brandResultMap" type="com.chuhe.pojo.Brand">
<result column="brand_name" property="brandName"/>
<result column="company_name" property="companyName"/>
</resultMap>
<update id="updata">
update tb_brand
set
brand_name=#{brandName},
company_name=#{companyName},
ordered=#{ordered},
description=#{description},
status=#{status}
where id=#{id};
</update>
</mapper>
Demo.java
package com.chuh.test;
import com.chuhe.mapper.BrandMapper;
import com.chuhe.pojo.Brand;
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 java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class Demo {
@Test
public void testUpdata() throws IOException {
//接收参数
int id=5;
int status=1;
String brandName="波导手机";
String companyName="波导";
int ordered=100;
String description="手机中的战战斗机";
Brand brand=new Brand();
brand.setId(id);
brand.setStatus(status);
brand.setBrandName(brandName);
brand.setCompanyName(companyName);
brand.setOrdered(ordered);
brand.setDescription(description);
//加载MyBatis核心配置文件,获取SqlSessionFactory
String resource="mybatisConfig.xml";
InputStream inputStream=Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//获取SqlSession对象
//不带参数默认为false表示,开启事务,需手动提交事务
SqlSession sqlSession=sqlSessionFactory.openSession(false);
//获取BrandMapper接口的代理对象
BrandMapper brandMapper=sqlSession.getMapper(BrandMapper.class);
int count=brandMapper.updata(brand);
System.out.println(count>0?"成功":"失败");
//提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
}
}
6.3.6、修改动态字段
BrandMapper.java
与6.3.5、修改全部字段保持一致
BrandMapper.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设置的是名称空间,必须是对应接口的全限定名-->
<mapper namespace="com.chuhe.mapper.BrandMapper">
<resultMap id="brandResultMap" type="com.chuhe.pojo.Brand">
<result column="brand_name" property="brandName"/>
<result column="company_name" property="companyName"/>
</resultMap>
<update id="updata">
update tb_brand
<set>
<if test="brandName != null and brandName!=''">
brand_name=#{brandName},
</if>
<if test="companyName!=null and companyName!=''">
company_name=#{companyName},
</if>
<if test="ordered!=null">
ordered=#{ordered},
</if>
<if test="description !=null and description!=''">
description=#{description},
</if>
<if test="status != null">
status=#{status}
</if>
</set>
where id=#{id};
</update>
</mapper>
Demo.java
与6.3.5、修改全部字段保持一致
6.3.7、删除一个
BrandMapper.java
package com.chuhe.mapper;
import com.chuhe.pojo.Brand;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
public interface BrandMapper {
int deleteById(int id);
}
BrandMapper.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设置的是名称空间,必须是对应接口的全限定名-->
<mapper namespace="com.chuhe.mapper.BrandMapper">
<resultMap id="brandResultMap" type="com.chuhe.pojo.Brand">
<result column="brand_name" property="brandName"/>
<result column="company_name" property="companyName"/>
</resultMap>
<delete id="deleteById">
delete
from tb_brand
where id=#{id};
</delete>
</mapper>
Demo.java
package com.chuh.test;
import com.chuhe.mapper.BrandMapper;
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 java.io.IOException;
import java.io.InputStream;
public class Demo {
@Test
public void testDeleteById() throws IOException {
//接收参数
int id=5;
//加载MyBatis核心配置文件,获取SqlSessionFactory
String resource="mybatisConfig.xml";
InputStream inputStream=Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//获取SqlSession对象
//不带参数默认为false表示,开启事务,需手动提交事务
SqlSession sqlSession=sqlSessionFactory.openSession(false);
//获取BrandMapper接口的代理对象
BrandMapper brandMapper=sqlSession.getMapper(BrandMapper.class);
int count=brandMapper.deleteById(id);
System.out.println(count>0?"成功":"失败");
//提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
}
}
6.3.8、批量删除
BrandMapper.java
package com.chuhe.mapper;
import com.chuhe.pojo.Brand;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import java.util.Map;
public interface BrandMapper {
int deleteByIds(int[] ids);
// int deleteByIds(@Param("ids")int[] ids);
}
BrandMapper.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设置的是名称空间,必须是对应接口的全限定名-->
<mapper namespace="com.chuhe.mapper.BrandMapper">
<resultMap id="brandResultMap" type="com.chuhe.pojo.Brand">
<result column="brand_name" property="brandName"/>
<result column="company_name" property="companyName"/>
</resultMap>
<delete id="deleteByIds">
delete
from tb_brand
where id in
<!--mybatis会将数组参数,封装为一个Map集合
key默认为arry,value为数组
即arry=数组,故collection="array"
-->
<foreach collection="array" item="id" separator="," open="(" close=")">
#{id}
</foreach>
</delete>
</mapper>
<foreach collection="array" item="id" separator="," open="(" close=")">
mybatis会将数组参数,封装为一个Map集合
key默认为arry,value为数组
即arry=数组,故collection=“array”若,非要写ids
<foreach collection="ids" item="id" separator="," open="(" close=")">
open表示在in语句开始前加"("
close表示在in语句开始前加")"
Demo.java
package com.chuh.test;
import com.chuhe.mapper.BrandMapper;
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 java.io.IOException;
import java.io.InputStream;
public class Demo {
@Test
public void testDeteleByIds() throws IOException {
//接收参数
int[] ids={3,6,8};
//加载MyBatis核心配置文件,获取SqlSessionFactory
String resource="mybatisConfig.xml";
InputStream inputStream=Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//获取SqlSession对象
//不带参数默认为false表示,开启事务,需手动提交事务
SqlSession sqlSession=sqlSessionFactory.openSession(false);
//获取BrandMapper接口的代理对象
BrandMapper brandMapper=sqlSession.getMapper(BrandMapper.class);
int count=brandMapper.deleteByIds(ids);
System.out.println(count);
//提交事务
sqlSession.commit();
//释放资源
sqlSession.close();
}
}
7、 MyBatis参数传递
MyBatis接口方法中可以接收各种各样的参数,MyBatis底层对于这些参数进行不同的封装处理方式
User Select(@Param("username") String username,@Param("password")String password);
<select id="select" resultType="user">
select *
from tb_user
where
username=#{username}
and password={#password};
</select>
MyBatis提供了ParamNameResolver类来进行参数封装
MyBatis参数封装:
-
单个参数:
- POJO类型:直接使用,属性名和参数占位符名称一致。如,本文中的User、Brand
- Map集合:直接使用,键名和参数占位符名称一致。
- Collection:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名
map.put("arg0",collection集合); map.put("collection",collection集合);
- List:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名
map.put("arg0",list集合); map.put("collection",list集合); map.put("list",list集合);
- Array:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名
map.put("arg0",数组); map.put("array",数组);
- 其他类型:直接使用
-
多个参数:封装为Map集合,可以使用@Param注解,替换Map集合中默认的arg键名。
map.put("arg0",参数值1) map.put("param1",参数值1) map.put("param2",参数值2) map.put("agr1",参数值2)
-
使用一个@Param(“username”)
User Select(@Param("username") String username,String password);
map.put("username",参数值1) map.put("param1",参数值1) map.put("param2",参数值2) map.put("agr1",参数值2)
8、动态SQL
8.1、实体类属性名和数据库表列名不一致
问题: 实体类属性名和数据库表列名不一致时,不能自动封装数据
如数据库中brand_name
字段在Brand类中定义为brandName
字段,MyBatis无法识别,导致无法封,就无法给brandName赋值,brandName就一直为默认值null。
解决方法:
方法一、sql中起别名
BrandMapper.xml中将SQL语句中,不一样的列名起别名,别名和实体类属性名一样。
缺点:sql过于冗长,每次查询都要定义别名。
方法二、定义sql片段,提升复用性
这种方法可以解决方法一中的缺点。
<mapper namespace="com.chuhe.mapper.BrandMapper">
<!--sql片断-->
<sql id="brand_colum">
id,brand_name brandName,company_name companyName,ordered,description, status
</sql>
<select id="selectAll" resultType="com.chuhe.pojo.Brand">
select
<include refid="brand_colum"/>
from tb_brand;
</select>
</mapper>
缺点:不灵活
方法三、resultMap
- resultMap:定义完成不一致的属性名和列名的映射。
<!--namespace设置的是名称空间,必须是对应接口的全限定名-->
<mapper namespace="com.chuhe.mapper.BrandMapper">
<resultMap id="brandResultMap" type="com.chuhe.pojo.Brand">
<result column="brand_name" property="brandName"/>
<result column="company_name" property="companyName"/>
</resultMap>
<!--select标签属性将不再使用resultType而是resultMap-->
<select id="selectAll" resultMap="brandResultMap">
select * from tb_brand;
</select>
</mapper>
注意:
- resultMap中的
type
属性,应和select标签中原来属性resultType
一致- select标签属性将不再使用
resultType
而是resultMap
8.2、参数占位符
#{}
:执行SQL时,会将#{}占位符替换成?,MyBatis自动设置参数值。${}
:拼SQL。会存在SQL注入问题。
使用时机:
- 参数传递,都使用
#{}
- 如果要对表名、列名进行动态设置,只能使用
${}
进行SQL拼接,但会存存SQL注入问题。
<select id="selectById" resultMap="brandResultMap">
select * from tb_brand where id=#{id};
</select>
8.3、parameterType
- 用于设置参数类型,该参数可以省略。
- 设置selectById返回的类型。
<select id="selectById" parameterType="Brand" resultMap="brandResultMap">
select * from tb_brand where id=#{id};
</select>
8.4、SQL语句中殊字符处理
-
转义字符
xml中的一些特殊字符需要转义,如<
需用<
xml常用转义字符显示结果 转义字符 描述
空格 < <
> >
& &
" "
' '
× ×
-
CDATA区
<![CDATA[ 内容 ]]>
写在里面的内容会被当作纯文本。
8.5、动态SQL
**动态SQL:**多条件查询时,用户在筛选条件时,可能某些多件不选择,我们的sql要根据用户填写的条件进行动态变化。
if标签
- 用于判断参数是否有值,使用set属性进行条件判断。
- 存在的问题:第一个条件不需要逻辑运算符,如
select * from tb_brand where and company_name=? and brand_name=?;
- 解决方案:
-
方法一:使用恒等式让所有条件格式都一样
select * from tb_brand where 1=1 <if test="status !=null"> and status=#{status} </if> <if test="companyName!=null and companyName !=''"> and company_name like #{companyName} </if> <if test="brandName!=null and brandName !=''"> and brand_name like #{brandName} </if>
-
方法二:
<where>
标签替换where关键字,MyBaits会根据实际情况决定要不要加逻辑运算符
-
8.5.1、多条件查询动态SQL
<?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设置的是名称空间,必须是对应接口的全限定名-->
<mapper namespace="com.chuhe.mapper.BrandMapper">
<resultMap id="brandResultMap" type="com.chuhe.pojo.Brand">
<result column="brand_name" property="brandName"/>
<result column="company_name" property="companyName"/>
</resultMap>
<!--条件查询-->
<select id="selectByCondition" resultMap="brandResultMap">
select *
from tb_brand
<where>
<if test="status !=null">
status=#{status}
</if>
<if test="companyName!=null and companyName !=''">
and company_name like #{companyName}
</if>
<if test="brandName!=null and brandName !=''">
and brand_name like #{brandName}
</if>
</where>
</select>
</mapper>
8.5.2、单条件动态条件查询
- choose (when, otherwise)
<?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设置的是名称空间,必须是对应接口的全限定名-->
<mapper namespace="com.chuhe.mapper.BrandMapper">
<resultMap id="brandResultMap" type="com.chuhe.pojo.Brand">
<result column="brand_name" property="brandName"/>
<result column="company_name" property="companyName"/>
</resultMap>
<select id="selectByConditionSingle" resultMap="brandResultMap">
select *
from tb_brand
<where>
<choose><!--类似于switch-->
<when test="status != null"><!--类似于case-->
status=#{status}
</when>
<when test="companyName!=null and companyName !=''">
and company_name like #{companyName}
</when>
<when test="brandName!=null and brandName !=''">
and brand_name like #{brandName}
</when>
<otherwise><!--类似于default,使用where标签,otherwish就可以不写了-->
1=1
</otherwise>
</choose>
</where>
</select>
</mapper>
动态SQL详见:https://mybatis.org/mybatis-3/zh/dynamic-sql.html
- if
- choose (when, otherwise)
- trim (where, set)
- foreach
8.5、SQL语句中设置多个参数
9、注解完成增删改查
-
使用注解开发会比配置文件开发更加方便:
@Select("select * from tb_user where id=#{id}") public User selectById(int id);
- 查询:@Select
- 添加:@Insert
- 修改:@Update
- 删除:@Delete
提示:
- 注解完成简单功能
配置文件完成复杂功能
BrandMapper.java
package com.chuhe.mapper;
import com.chuhe.pojo.Brand;
import org.apache.ibatis.annotations.Select;
import java.util.List;
import java.util.Map;
public interface BrandMapper {
//查看详情
@Select("select * from tb_brand where id=#{id}")
Brand selectById(int id);
}
Demo.java
package com.chuh.test;
import com.chuhe.mapper.BrandMapper;
import com.chuhe.pojo.Brand;
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 java.io.IOException;
import java.io.InputStream;
public class Demo {
@Test
public void testSelectById() throws IOException {
int id=1;
//加载MyBatis核心配置文件,获取SqlSessionFactory
String resource="mybatisConfig.xml";
InputStream inputStream=Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//获取SqlSession对象
SqlSession sqlSession=sqlSessionFactory.openSession();
//获取BrandMapper接口的代理对象
BrandMapper brandMapper=sqlSession.getMapper(BrandMapper.class);
Brand brand=brandMapper.selectById(id);
System.out.println(brand);
//释放资源
sqlSession.close();;
}
}
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)