一、保存操作
在做这个方法之前,我们先把之前做的那个MybatisTest里面的每一个方法做成一个Test方法,也就是标注@Test这个注解
这样便于我们测试接下来的每一个方法。仔细分析一下上面的代码,会发现,可重复性的地方太多。比如我们如果要测试保存方法testSave()这个方法,那么又要复写如下代码
先拿出一些全局变量出来
这些变量拿出来是因为后面资源需要释放和提提交
先做成一个初始化的工作
再来做一个销毁工作,也就是测试方法之后会执行的工作
此时的testFindAll方法就会变得非常简洁
下面开始来测试保存方法testSave()方法
先去IUserDao.xml文件里面的<mapper>标签配置一下
去数据库里面看一下
数据插入
二、更新操作
然后去IUserDao.xml中配置一下更新这个操作
然后去添加一个测试方法
去数据库里面看一下修改信息
下面我们在做一个删除操作
然后去IUserDao.xml里面配置一下deleteUser方法
然后去添加测试方法
很明显49这个id的数据就没了
三、 查询一个和模糊查询
先去IUserDao.java添加
再去IUserDao.xml配置一下这个方法
然后再去添加一个测试方法
打印信息
下面做一个模糊查询
然后去配置mapper
去test类里面添加方法
运行结果:
下面来说,查询返回一行一列和占位符分析
来获取一下总记录数
然后去IUserDao.xml去配置mapper
然后去test里面添加方法
运行
四、下面来说一些操作细节问题
下面说一下获取保存数据的id问题
先来说说一下数据库中的一个函数操作
这个函数能得到一张表最后插入数据的id值
上面为什么就是会显示0呢,就是因为目前没有数据插入,你只有插入一条数据之后,子啊调用这个函数就会得到一个最新的插入id
那我们去到IUserDao.xml中做一些配置,就是配置一下这个函数的用法
然后去testSave中看一下情况
运行结果:
五、使用实体类的包装对象作为查询条件
下面先来说一个OGNL表达式
那如果我们传入的参数类型是一个对象呢?
那我们去IUserDao中实现一个方法
这个时候我们需要一个QueryVo这个类
QueryVo.java
package com.pxx.domain;
public class QueryVo {
private User user;
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}
下面我们去配置一下IUserDao.xml文件
下面我们去Test类里面用一下
查询结果:
六、调整实体类属性解决增和改方法的报错
在我们设计实体类的时候,要求的是实体类中的属性与数据库中表的属性保持一致,那么如果是不一致的情况呢
那么现在先去修改一下User类,改成与数据库中的数据字段不一致的情况
User.java
package com.pxx.domain;
import java.util.Date;
public class User {
private Integer userId;
private String userName;
private String userAddress;
private String userSex;
private Date userBirthday;
public Integer getUserId() {
return userId;
}
public void setUserId(Integer userId) {
this.userId = userId;
}
public String getUserName() {
return userName;
}
public void setUserName(String userName) {
this.userName = userName;
}
public String getUserAddress() {
return userAddress;
}
public void setUserAddress(String userAddress) {
this.userAddress = userAddress;
}
public String getUserSex() {
return userSex;
}
public void setUserSex(String userSex) {
this.userSex = userSex;
}
public Date getUserBirthday() {
return userBirthday;
}
public void setUserBirthday(Date userBirthday) {
this.userBirthday = userBirthday;
}
@Override
public String toString() {
return "User{" +
"userId=" + userId +
", userName='" + userName + '\'' +
", userAddress='" + userAddress + '\'' +
", userSex='" + userSex + '\'' +
", userBirthday=" + userBirthday +
'}';
}
}
然后去修改一下test文件,其实就是修改一下set字段
package com.pxx.test;
import com.pxx.dao.IUserDao;
import com.pxx.domain.QueryVo;
import com.pxx.domain.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.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
public class MybatisTest {
//把这些变量先全部做成全局变量
private InputStream in;
private SqlSession sqlSession;
private IUserDao userDao;
@Before
public void init() throws IOException {
//1.读取配置文件
//这个Resources是Mytais给我们提供的一个类,直接加载资源文件
in = Resources.getResourceAsStream("SqlMapConfig.xml");
//2.创建SqlSessionFactory工厂
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
SqlSessionFactory factory = builder.build(in);
//3.使用工厂生产SqlSession对象,这个可以理解为dao的实现类
sqlSession = factory.openSession();
//4.使用SqlSession创建Dao接口的代理对象
userDao = sqlSession.getMapper(IUserDao.class);
}
@After
public void destroy() throws IOException {
sqlSession.commit();
sqlSession.close();
in.close();
}
@Test
public void testFindAll() throws IOException {
//5.使用代理对象执行方法
List<User> users = userDao.findAll();
for(User user : users) {
System.out.println(user);
}
}
@Test
public void testSave() {
//把对象的数据给封装到数据库里面
User user = new User();
user.setUserName("张三丰");
user.setUserAddress("河南");
user.setUserSex("男");
user.setUserBirthday(new Date());
System.out.println(user);
userDao.saveUser(user);
System.out.println(user);
}
@Test
public void testUpdate() {
User user = new User();
user.setUserId(49);//这个是存在数据库中的一个字段
user.setUserName("zhoujielun");
user.setUserAddress("天津");
user.setUserSex("男");
user.setUserBirthday(new Date());
userDao.updateUser(user);
}
@Test
public void testDelete() {
userDao.deleteUser(48);
}
@Test
public void testFindOne() {
User user = userDao.findById(46);
System.out.println(user);
}
/**
* 模糊查询操作
*/
@Test
public void testFindByName() {
//执行一个查询方法
List<User> users = userDao.findByName("%王%");
System.out.println(users);
}
/**
* 查询总记录条数
*/
@Test
public void testFindTotal() {
//执行一个查询方法
int count = userDao.findTotal();
System.out.println(count);
}
/**
* 测试使用QueryVo作为查询条件
*/
@Test
public void testFindByVo(){
QueryVo vo = new QueryVo();
User user = new User();
user.setUserName("%王%");
vo.setUser(user);
//5.执行查询一个方法
List<User> users = userDao.findUserByVo(vo);
for(User u : users){
System.out.println(u);
}
}
}
修改一下IUserDao.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">
<!--配置每一个相应dao层的方法,写上相应dao的全类名-->
<mapper namespace="com.pxx.dao.IUserDao">
<!--Id代表方法名称 resultType:代表值类型
这里写上它的全类名 -->
<select id="findAll" resultType="com.pxx.domain.User">
select * from user
</select>
<!--保存用户信息就不是select语句了
而是insert语句-->
<insert id="saveUser" parameterType="com.pxx.domain.User">
<!--配置插入操作之后,获取插入数据的id-->
<selectKey keyProperty="userId" keyColumn="id" resultType="int" order="AFTER">
select last_insert_id();
</selectKey>
insert into user(username,address,sex,birthday)values(#{userName},#{userAddress},#{userSex},#{userBirthday});
</insert>
<!--这里更新操作就是update-->
<update id="updateUser" parameterType="com.pxx.domain.User">
update user set username=#{userName},address=#{userAddress},sex=#{userSex},birthday=#{userBirthday} where id=#{userId}
</update>
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from user where id=#{id}
</delete>
<!--根据id查询用户的方法,又是查询操作-->
<select id="findById" parameterType="java.lang.Integer" resultType="com.pxx.domain.User">
select * from user where id=#{id}
</select>
<!--根据名称进行模糊查询操作
但是模糊查询中like %名字% 中的这个百分号在在这里面体现不出来
-->
<select id="findByName" parameterType="string" resultType="com.pxx.domain.User">
select * from user where username like #{username}
</select>
<!--查询用户总记录数-->
<select id="findTotal" resultType="int" >
select count(id) from user
</select>
<!--根据queryVo的条件查询用户-->
<select id="findUserByVo" parameterType="com.pxx.domain.QueryVo" resultType="com.pxx.domain.User">
select * from user where username like #{user.userName}
</select>
</mapper>
上面修改之后,去测试test里面的方法,发现除了增,删,改能正常使用之外,查找方法都会出现一些问题
上面数据除了username之外,都封装不进去,而为什么username给封装进去了,去看看数据库里面的字段
是因为mysql在进行数据字段封装的时候,不考虑大小写,也就是说username与userName的用法是一样的。
下面我们就要去解决这个问题
想办法让Mybatis都匹配上
方法1:给数据库每一个查询字段取一个别名
查询结果:
方法2:在IUserDao.xml中配置查询结果列名与实体属性列名大的对应关系
当我们配置了上面的对应类型之后,下面配置resultType类型就没用了,而是要用resultMap来做
上面就会有一些影响效率,但是方便
下面直接上IUserDao.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">
<!--配置每一个相应dao层的方法,写上相应dao的全类名-->
<mapper namespace="com.pxx.dao.IUserDao">
<!--配置查询结果的列名和实体类的属性名对应的关系-->
<resultMap id="userMap" type="com.pxx.domain.User">
<!-- 主键字段的对应 -->
<id property="userId" column="id"></id>
<!--非主键字段的对应-->
<result property="userName" column="username"></result>
<result property="userAddress" column="address"></result>
<result property="userSex" column="sex"></result>
<result property="userBirthday" column="birthday"></result>
</resultMap>
<!--Id代表方法名称 resultType:代表值类型
这里写上它的全类名 -->
<!--<select id="findAll" resultType="com.pxx.domain.User">-->
<select id="findAll" resultMap="userMap">
select * from user
<!-- select id as userId,username as userName,address as userAddress,
sex as userSex,birthday as userBirthday from user-->
</select>
<!--保存用户信息就不是select语句了
而是insert语句-->
<insert id="saveUser" parameterType="com.pxx.domain.User">
<!--配置插入操作之后,获取插入数据的id-->
<selectKey keyProperty="userId" keyColumn="id" resultType="int" order="AFTER">
select last_insert_id();
</selectKey>
insert into user(username,address,sex,birthday)values(#{userName},#{userAddress},#{userSex},#{userBirthday});
</insert>
<!--这里更新操作就是update-->
<update id="updateUser" parameterType="com.pxx.domain.User">
update user set username=#{userName},address=#{userAddress},sex=#{userSex},birthday=#{userBirthday} where id=#{userId}
</update>
<delete id="deleteUser" parameterType="java.lang.Integer">
delete from user where id=#{id}
</delete>
<!--根据id查询用户的方法,又是查询操作-->
<select id="findById" parameterType="java.lang.Integer" resultMap="userMap">
select * from user where id=#{id}
</select>
<!--根据名称进行模糊查询操作
但是模糊查询中like %名字% 中的这个百分号在在这里面体现不出来
-->
<select id="findByName" parameterType="string" resultMap="userMap">
select * from user where username like #{username}
</select>
<!--查询用户总记录数-->
<select id="findTotal" resultType="int" >
select count(id) from user
</select>
<!--根据queryVo的条件查询用户-->
<select id="findUserByVo" parameterType="com.pxx.domain.QueryVo" resultMap="userMap">
select * from user where username like #{user.userName}
</select>
</mapper>
运行结果: