#MyBatis查询之QueryVo:以封装了对象的对象作为parameterType @FDDLC

    科技2023-10-11  99

    入门步骤:

     

    先给出项目结构:

     

    0:新建Maven工程,导入Maven依赖:mysql-connector-java、mybatis、junit。

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>mybatis-test</artifactId> <version>1.0-SNAPSHOT</version> <dependencies> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.16</version> </dependency> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.5</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> </project>

     

    1.1、准备好数据库,新建account表(id,name,money),填充若干条记录。

    database:test        port:3306        table:account

     

     

    1.2、编写account表对应的实体类Account。

    package cn.liuxingchang.domain; import java.io.Serializable; public class Account implements Serializable { private Integer id; private String name; private Double money; @Override public String toString() { return "Account{" + "id=" + id + ", name='" + name + '\'' + ", money=" + money + '}'; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public Double getMoney() { return money; } public void setMoney(Double money) { this.money = money; } }

     

    1.3、编写QueryVo,封装Account作为查询参数parameterType。

    package cn.liuxingchang.domain; public class QueryVo { private Account account; public Account getAccount() { return account; } public void setAccount(Account account) { this.account = account; } @Override public String toString() { return super.toString(); } }

     

    2.1、编写AccountDao接口。

    package cn.liuxingchang.dao; import cn.liuxingchang.domain.Account; import cn.liuxingchang.domain.QueryVo; import java.util.List; public interface AccountDao { List<Account> findByQueryVo(QueryVo queryVo); }

     

    2.2、编写AccountMapper.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="cn.liuxingchang.dao.AccountDao"> <select id="findByQueryVo" resultType="cn.liuxingchang.domain.Account" parameterType="cn.liuxingchang.domain.QueryVo"> select * from account where name like #{account.name} </select> </mapper>

    说明:#{account.name}里的account.name这种写法叫做OGNL(Object Graph Navigation Language:对象图导航语言)。这种写法什么意思呢?很明显,这里的大括号是想通过parameterType为cn.liuxingchang.domain.QueryVo的一个实例(假如叫queryVo),去获取它的成员account(Account类型),再去获取account的成员name(String类型),正常的Java格式是queryVo.getAccount().getName(),显然这种写法很长,OGNL把一个get方法的get和()去掉,剩下部分首字母小写。比如getAccount(),去掉get和(),剩下Account,再将首字母小写,变成了account。于是, queryVo.getAccount().getName()用OGNL就可以写成queryVo.account.name!明显变短了有没有!

     

    3、编写MyBatis配置文件mybatis.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> <environments default="mysql"> <environment id="mysql"> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/Test?characterEncoding=UTF8&amp;serverTimezone=Asia/Shanghai"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> <mappers> <mapper resource="mapper/AccountMapper.xml" /> </mappers> </configuration>

     

    4、编写测试类Test。

    import cn.liuxingchang.dao.AccountDao; import cn.liuxingchang.domain.Account; import cn.liuxingchang.domain.QueryVo; 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.InputStream; import java.util.List; public class Test { @org.junit.Test public void test() throws Exception { InputStream in = Resources.getResourceAsStream("mybatis.xml"); SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); SqlSessionFactory factory = builder.build(in); SqlSession session = factory.openSession(); AccountDao accountDao = session.getMapper(AccountDao.class); Account a = new Account(); a.setName("%a%"); QueryVo queryVo = new QueryVo(); queryVo.setAccount(a); List<Account> accounts = accountDao.findByQueryVo(queryVo); for(Account account: accounts) { System.out.println(account); } session.close(); in.close(); } }

     

    Processed: 0.014, SQL: 8