文章目录
文章使用的数据库表仍然为之前测试时使用的user表—数据库表在本文中。
一、输入映射parameterType
1.简单的参数类型(参数只有一个的时候)
使用#{任意的变量名}
或 ${value}
或${_parameter}
2.pojo类型
#{对象的属性名}
:可以把Java里面的参数和数据库中的类型进行自动转换。${对象的属性名}
:可以取出传了参数里面的属性值,智商税原封不动的取出。缺点:不能防止sql注入。
这种方式是利用OGNL表达式来解析pojo对象中属性对应的值。
3.pojo对象的包装类型
可以将pojo类型和扩展字段结合,封装一个新的类型。下面演示使用pojo对象的包装类型。查询数据库中姓名中包含"小"字的人的姓名。
(1)UserQueryvo类
package com.gql.pojo;
/**
* 类说明:
* pojo的包装对象
* @guoqianliang1998.
*/
public class UserQueryvo {
private User user;
//扩展的字段
private int producteId;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
public int getProducteId() {
return producteId;
}
public void setProducteId(int producteId) {
this.producteId = producteId;
}
}
(2)UserMapper接口
package com.gql.mapper;
import java.util.List;
import com.gql.pojo.User;
import com.gql.pojo.UserQueryvo;
/**
* 类说明:
* 接口
* @guoqianliang1998.
*/
public interface UserMapper {
User getUserById(int id);
List<User> getUserListByName(String name);
void saveUser(User user);
void updateUser(User user);
void deleteUser(int id);
List<User> getUserListByQueryvo(UserQueryvo vo);
}
(3)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.gql.mapper.UserMapper">
<select id="getUserListByQueryvo" parameterType="com.gql.pojo.UserQueryvo" resultType="com.gql.pojo.User">
SELECT id,
username as name,
sex,
address,
birthday
FROM user
WHERE username like '%${user.name}%';
</select>
</mapper>
(4)全局配置文件
<?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>
<properties resource="db.properties">
</properties>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC" />
<dataSource type="POOLED">
<property name="driver" value="${jdbc.driver}" />
<property name="url" value="${jdbc.url}" />
<property name="username" value="${jdbc.username}" />
<property name="password" value="${jdbc.password}" />
</dataSource>
</environment>
</environments>
<mappers>
<!-- <mapper resource="UserMapper.xml" /> -->
<!-- 如果使用接口的全限定名,接口名必须和sql配置文件同名且同级目录 -->
<mapper class="com.gql.mapper.UserMapper"/>
<!-- <package name="com.gql.mapper"/> -->
</mappers>
</configuration>
(5)测试类
package com.gql.mapper;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
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 com.gql.pojo.User;
import com.gql.pojo.UserQueryvo;
public class UserMapperTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void init() throws IOException{
String resource = "mybatis-config.xml";
InputStream in = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
}
@Test
public void testQueryVo(){
SqlSession session = sqlSessionFactory.openSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
UserQueryvo vo = new UserQueryvo();
User user = new User();
user.setName("小");
vo.setUser(user);
List<User> userList = userMapper.getUserListByQueryvo(vo);
for (User i : userList) {
System.out.println(i.getName());
}
}
}
成功打印出名字中包含"小"字的人的姓名。
二、输出类型resultType
1.返回简单的类型
下面的代码演示返回一个简单的int类型。
<?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.gql.mapper.UserMapper">
<select id="getCount" parameterType="com.gql.pojo.UserQueryvo" resultType="java.lang.Integer">
SELECT COUNT(1) FROM user WHERE username LIKE '%${user.name}%';
</select>
</mapper>
package com.gql.mapper;
import java.util.List;
import com.gql.pojo.User;
import com.gql.pojo.UserQueryvo;
/**
* 类说明:
* 接口
* @guoqianliang1998.
*/
public interface UserMapper {
int getCount(UserQueryvo vo);
}
package com.gql.mapper;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
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 com.gql.pojo.User;
import com.gql.pojo.UserQueryvo;
public class UserMapperTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void init() throws IOException{
String resource = "mybatis-config.xml";
InputStream in = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
}
@Test
public void testGetCount(){
SqlSession session = sqlSessionFactory.openSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
UserQueryvo vo = new UserQueryvo();
User user = new User();
user.setName("小");
vo.setUser(user);
int result = userMapper.getCount(vo);
System.out.println(result);
}
}
2.返回pojo对象
pojo对象的映射可能为单个或者多个,如何知道是单个还是多个呢?实际上当代理对象通过接口创建完成后,代理对象就知道了每个方法的返回值,如果返回类型是pojo类型就说明是单个对象,如果是list就说明是多个对象,
三、输出映射ResultMap
输出映射ResultMap完成较复杂的一对多,多对多的对应关系
,下面的代码测试使用输出映射ResultMao,注意这里的Map指的是映射,而不是集合。
1.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.gql.mapper.UserMapper">
<!-- 将数据库列名与pojo对象中的属性进行映射 -->
<select id="getUserByResultMap" parameterType="int" resultMap="userResultMap">
select id id_,
username,
sex sex_,
address ad
from user where id=#{id};
</select>
<resultMap type="com.gql.pojo.User" id="userResultMap">
<id column="id_" property="id"/>
<result column="username" property="name"/>
<result column="sex_" property="sex"/>
<result column="ad" property="address"/>
</resultMap>
</mapper>
2.UserMapper接口
package com.gql.mapper;
import java.util.List;
import com.gql.pojo.User;
import com.gql.pojo.UserQueryvo;
/**
* 类说明:
* 接口
* @guoqianliang1998.
*/
public interface UserMapper {
User getUserByResultMap(int id);
}
3.测试使用ResultMap进行
package com.gql.mapper;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
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 com.gql.pojo.User;
import com.gql.pojo.UserQueryvo;
public class UserMapperTest {
private SqlSessionFactory sqlSessionFactory;
@Before
public void init() throws IOException{
String resource = "mybatis-config.xml";
InputStream in = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
}
@Test
public void testResultMap(){
SqlSession session = sqlSessionFactory.openSession();
UserMapper userMapper = session.getMapper(UserMapper.class);
User user = userMapper.getUserByResultMap(1);
System.out.println(user.getName());
}
}
成功查询出数据库中的结果: