一、pojo实体类创建?
1.在pojo中创建User类
package com.pp.pojo;
import java.util.Date;
import java.util.List;
public class User {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
private List<Orders> ordersList;
public List<Orders> getOrdersList() {
return ordersList;
}
public void setOrdersList(List<Orders> ordersList) {
this.ordersList = ordersList;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", birthday=" + birthday +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
", ordersList=" + ordersList +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
User类中写的对应就是数据库中的usr表中的每一个属性,然后使用的set()和get()方法,又利用tostring()方法方便输出验证结果使用。
2.在com.pp.pojo包下创建QueryVo类
package com.pp.pojo;
public class QueryVo {
private User usser;
public User getUsser() {
return usser;
}
public void setUser(User user) {
this.usser = user;
}
}
创建的QueryVo类中创建了一个user对象,然后创建了get()和set()方法。
3.在pojo中创建order类
这个类再resultMap查询方法中会使用到该类
package com.pp.pojo;
import java.util.Date;
public class Orders {
/* `id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL COMMENT '下单用户id',
`number` varchar(32) NOT NULL COMMENT '订单号',
`createtime` datetime NOT NULL COMMENT '创建订单时间',
`note` varchar(100) DEFAULT NULL COMMENT '备注',*/
private Integer id;
private Integer userid;
private String number;
private Date createtime;
private String note;
public Integer getId() {
return id;
}
@Override
public String toString() {
return "Orders{" +
"id=" + id +
", userid=" + userid +
", number='" + number + '\'' +
", createtime=" + createtime +
", note='" + note + '\'' +
'}';
}
public void setId(Integer id) {
this.id = id;
}
public Integer getUserid() {
return userid;
}
public void setUserid(Integer userid) {
this.userid = userid;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
public Date getCreatetime() {
return createtime;
}
public void setCreatetime(Date createtime) {
this.createtime = createtime;
}
public String getNote() {
return note;
}
public void setNote(String note) {
this.note = note;
}
}
order类中写的对应就是数据库中的order表中的每一个属性,然后使用的set()和get()方法,又利用tostring()方法方便输出验证结果使用。
二、通过用户名和性别查询(QueryVoByUserList)
1.在com.pp的mapper包下的UserMapper类中定义抽象方法
代码如下(示例):
import com.pp.pojo.QueryVo;
import com.pp.pojo.User;
import java.util.List;
public interface UserMapper {
List<User> QueryVoByUserList(QueryVo queryVo);
}
2.在com.pp的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">
<mapper namespace="com.pp.mapper.UserMapper">
<select id="QueryVoByUserList" parameterType="com.pp.pojo.QueryVo" resultType="com.pp.pojo.User">
select * from user where username like '%${usser.username}%' and sex=#{usser.sex}
</select>
</mapper>
<select>
中id填写方法明;parameterType入口参数填写具体指向的类路径,这里填写com.pp.pojo.QueryVo;resultType放回参数写返回的参数类型路径,这里写com.pp.pojo.User。这里的where条件查询,参数要写类名.属性。这里填写的是user.username和user.sex,即根据用户名和性别去查询。
2.编写测试类,详见fun7()方法
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class UserTest {
private SqlSessionFactory factory;
@Test
@Before
public void Setup() throws IOException {
String res="SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(res);
factory=new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void fun7(){
SqlSession sqlSession = factory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
QueryVo queryVo = new QueryVo();
User user = new User();
user.setSex("男");
user.setUsername("张");
queryVo.setUser(user);
List<User> list = mapper.QueryVoByUserList(queryVo);
System.out.println(list);
}
}
由于QueryVoByUserList()方法的参数传递的是一个queryVo,所以需要创建一个queryVo类,而该类中有一个setUser()的方法用来构造user类,所以还需要创建User对象,在利用User的Set()方法去给user对象赋值,然后再把user对象作为queryVo.setUser()方法的参数传递进去。最终调用mapper.QueryVoByUserList(),将queryVo对象传递进去即可。
三、查询数据库中表的行数
1.编写UserMapper抽象类方法
import com.pp.pojo.QueryVo;
import com.pp.pojo.User;
import java.util.List;
public interface UserMapper {
Integer findUserCount();
}
2.编写UserMapper.xml中的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">
<mapper namespace="com.pp.mapper.UserMapper">
<select id="findUserCount" resultType="int">
select count(*) from user
</select>
</mapper>
这里的查询语句id填写fingUserCount,结果返回一个int类型的值,使用的sql语句是select count(*) from user
查询user表中的所有用户。
3.再测试类UserTest中写fun8()方法
@Test
public void fun8(){
SqlSession sqlSession = factory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
Integer userCount = mapper.findUserCount();
System.out.println(userCount);
}
四、查询用户表和订单
1.在pojo中创建User类中添加ordersList属性,因为再查询的时候即需要用户的信息也需要订单的信息。
User类中添加的内容具体请参考本文第一个标题(一、pojo实体类创建)
2.在UserMapper抽象类中写入findUserAndOrder()方法
import com.pp.pojo.QueryVo;
import com.pp.pojo.User;
import java.util.List;
public interface UserMapper {
List<User> findUserAndOrder();
}
2.在UserMapper.xml配置文件中写入findUserAndOrder()的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">
<mapper namespace="com.pp.mapper.UserMapper">
<!-- `id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL COMMENT '下单用户id',
`number` varchar(32) NOT NULL COMMENT '订单号',
`createtime` datetime NOT NULL COMMENT '创建订单时间',
`note` varchar(100) DEFAULT NULL COMMENT '备注',-->
<resultMap id="userAndOderResultMap" type="com.pp.pojo.User">
<id column="id" property="id"/>
<result column="username" property="username"/>
<result column="birthday" property="birthday"/>
<result column="sex" property="sex"/>
<result column="address" property="address"/>
<collection property="ordersList" ofType="com.pp.pojo.Orders">
<id column="id" property="id"/>
<result column="user_id" property="userid"/>
<result column="number" property="number"/>
<result column="createtime" property="createtime"/>
<result column="note" property="note"/>
</collection>
</resultMap>
<select id="findUserAndOrder" resultMap="userAndOderResultMap">
select a.*,b.* from user a, orders b where a.id=b.user_id;
</select>
</mapper>
-
<resultMap>
id值的就是一个名字,可以随便取,这里取名为userAndOderResultMap; -
而
<resultMap>
下的<id>
中的column的值填写对应表的id,这里填写对应数据库中user表中的id,property的值就叫id; -
然后有一个
<result>
中的column要一一的和实体类进行一一对应,所以这里column的值为username,property的值为username。 -
后面的几个
<result>
的column的和property的值分别就是实体类的birthday、sex、address -
实体类User中还加了个
List<order>
,要想对应该属性使用<collection>
-
<collection>
的property填写实体类的属性名,这里是ordersList,ofType意思是对应ordersList的那个实体类的orders.也就是ordersList的那个元素对应的是那个实体类。 -
<collection>
下的属性,就是order实体类的列(数据库中对应的列)的对应关系。根据数据表中,oders中有id,所以这里写:<id column="id" property="id"/>
-
orders表中的user_id在实体类中对应的是userid,所以这里应该写:
<result column="user_id" property="userid"/>
-
后面的数据库orders表 中的number、createtime、note都和实体类相同,这里就不一一介绍。
上面介绍的代码内容为:
<resultMap id="userAndOderResultMap" type="com.pp.pojo.User">
<id column="id" property="id"/>
<result column="username" property="username"/>
<result column="birthday" property="birthday"/>
<result column="sex" property="sex"/>
<result column="address" property="address"/>
<collection property="ordersList" ofType="com.pp.pojo.Orders">
<id column="id" property="id"/>
<result column="user_id" property="userid"/>
<result column="number" property="number"/>
<result column="createtime" property="createtime"/>
<result column="note" property="note"/>
</collection>
</resultMap>
- 上面关于一个类中的属性包含另一个实体类的情况已经完成,接下来我们写sql语句。
<select id="findUserAndOrder" resultMap="userAndOderResultMap">
select a.*,b.* from user a, orders b where a.id=b.user_id;
</select>
<select>
中的id就是我们在UserMapper中定义的方法名;resultMap结果返回的就是上面配置的resultMap的id名,这里是userAndOderResultMap。在标签里面写上sql语句 select a.*,b.* from user a, orders b where a.id=b.user_id;
这句话是给user定义别名为a,orders表定义别名为b,当user的id和orders的id相等的时候,查询两个表的所有信息。
2.UserTest测试类中写fun9()测试方法
import com.pp.mapper.UserMapper;
import com.pp.pojo.QueryVo;
import com.pp.pojo.User;
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.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class UserTest {
private SqlSessionFactory factory;
@Test
@Before
public void Setup() throws IOException {
String res="SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(res);
factory=new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void fun9(){
SqlSession sqlSession = factory.openSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
List<User> l = mapper.findUserAndOrder();
/* User user = l.get(0);
List<Orders> ordersList = user.getOrdersList();
System.out.println(ordersList);*/
System.out.println(l);
}
}
五、总结
提示:这里对文章进行总结:
例如:以上就是今天要讲的内容,本文仅仅输入参数,输出参数、还有resultMap。输入输出参数如果参数是实体类的话,需要写具体实体类的路径这里的路径就是com.pp.类名。resultMap是用来作两个表关联的查询。所以在xml配置中需要将实体类的属性和数据库中表的元素对应。