mybatis+spring的TODO小项目记录(六)使用mybatis进行数据库操作
2017-04-26 17:04
751 查看
在前面的准备工作完成之后,我们终于可以使用mybatis进行数据库操作啦。在第一篇中介绍了三张简单的表结构:user、project、step。鉴于数据表很简单并且很相似,在这里只以用户表user为例进行说明。
第一步,我们首先创建与user表对应的pojo类(Plain Ordinary Java Object),命名为User,并且让数据表中的每一列都与类中的实例变量相对应。根据user表中的列id、name、password、email、last_login,我们相应创建了User类,如下:
注意到,由于java一般采用驼峰式命名法,数据表中带下划线的列名last_login对应的是lastLogin属性。
设计完User类的属性之后,我们还需要为每个属性设置setter和getter方法,可以使用intellij快捷键Alt+Insert自动添加。添加的代码如下:
为了方便调试中打印对象信息,我们再添加对象的toString方法,如下:
第二步,使用mybatis进行数据库操作,可以采用xxxMapper.xml及XxxDao接口的方式,即在XxxDao接口中定义需要的数据操作方法,然后在xxxMapper.xml中使用相应的sql语句实现。
对应地,我们在com.loveqh.dao包中创建UserDao接口,并在mybatis-mapper文件夹下创建userMapper.xml文件。
首先,我们想实现查询总用户数的操作,那么就可以在UserDao接口中添加相应方法:
对应地,在userMapper.xml中添加相应的sql语句:
在该文件中,我们注意两点:
1. mapper节点的namespace属性要对应UserDao接口。
2. select节点的id对应接口中的方法名,然后设置方法相应的参数类型及返回类型。
当然,这个mapper的xml文件需要在mybatis的配置文件中声明才能够使用。打开Configuration.xml文件,在environments节点后面添加以下节点:
为了测试该方法能否成功执行,我们可以在user数据表中先插入一条测试数据,然后使用junit进行单元测试。我们在com.loveqh.test包中新建UserTest测试类,以测试getAllUsersCount方法。代码如下:
增加以下几点说明:
1. 使用mybatis访问数据库,我们需要根据数据库配置文件构造出SqlSessionFactory对象,然后得到SqlSession对象。MyBatisSessionFactory类是为了方便获取SqlSessionFactory对象而创建的工具类,代码稍后贴出。
2. 在使用时需要首先创建SqlSession对象,操作完毕之后就要进行关闭,因此这两步我们分别在@Before和@After中进行。
3. 对象userDao不是(也不能)直接由接口创建,而是通过session的getMapper方法构造出了的UserDao接口的实例。
4. 在@Test声明的测试方法中,我们调用UserDao接口中的getAllUsersCount方法,由于我们插入了一条测试数据,因此可以使用断言判断总用户数是否为1,如果是,则测试通过。
MyBatisSessionFactory类的代码如下:
在用户管理中,我们可能会需要根据用户的id来得到用户的详细信息,因此在UserDao类中需要一个findUserById方法,如下:
对应地,userMapper.xml中添加相应的sql语句实现:
这里存在两个问题:
如果很多方法都是返回User对象,那么每个resultType都需要填写完整的包名路径,十分繁琐,也容易出错。不过,当然也有解决办法,就是使用mybatis提供的别名,我们可以再次打开Configuration.xml文件,在environments节点之前添加以下节点:
这样我们便可以把包路径替换成别名User。
前面提到过,由于java的驼峰式命名法,使得对象属性与数据表列名可能不一致,例如这里的lastLogin和last_login。这时,我们可以采用resultMap方式,将数据表的列名与类的属性名进行映射。打开userMapper.xml文件,添加以下节点:
然后在select节点中使用resultMap替换掉resultType,修改如下:
在项目中,我还增加了根据字符串进行模糊查询的操作,由于sql语句需要使用%通配符,所以在字符串拼接时不能使用#{},这里改用${},如下:
注意到这里返回类型仍然是User,当查询结果多于一条时,mybatis会自动帮我们保存到List中,是不是很方便?关于mybatis中#和$的区别,可以参考mybatis中的#和$的区别。
数据库的基本原子操作是CURD,即创建(Create)、更新(Update)、读取(Retrieve)和删除(Delete)操作。上面只介绍了读取操作,而其他三个操作也类似,只不过它们都会对数据库进行修改,因此在执行完操作后会返回影响的记录数,并且需要执行commit操作。示例如下:
具体的代码实现可以参考提交到github上的本项目,用户管理对应的文件分别是:
- User.java
- UserDao.java
- userMapper.xml
- UserTest.java
类似地,我们可以根据需求实现project和step的数据库逻辑。接下来,我们就可以安心进行界面实现了。
第一步,我们首先创建与user表对应的pojo类(Plain Ordinary Java Object),命名为User,并且让数据表中的每一列都与类中的实例变量相对应。根据user表中的列id、name、password、email、last_login,我们相应创建了User类,如下:
package com.loveqh.pojo; /** * Created by WL on 2017-04-23. */ public class User { private int id; private String name; private String password; private String email; private String lastLogin; }
注意到,由于java一般采用驼峰式命名法,数据表中带下划线的列名last_login对应的是lastLogin属性。
设计完User类的属性之后,我们还需要为每个属性设置setter和getter方法,可以使用intellij快捷键Alt+Insert自动添加。添加的代码如下:
public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } public String getLastLogin() { return lastLogin; } public void setLastLogin(String lastLogin) { this.lastLogin = lastLogin; }
为了方便调试中打印对象信息,我们再添加对象的toString方法,如下:
@Override public String toString() { return "User{" + "id=" + id + ", name='" + name + '\'' + ", password='" + password + '\'' + ", email='" + email + '\'' + ", lastLogin='" + lastLogin + '\'' + '}'; }
第二步,使用mybatis进行数据库操作,可以采用xxxMapper.xml及XxxDao接口的方式,即在XxxDao接口中定义需要的数据操作方法,然后在xxxMapper.xml中使用相应的sql语句实现。
对应地,我们在com.loveqh.dao包中创建UserDao接口,并在mybatis-mapper文件夹下创建userMapper.xml文件。
首先,我们想实现查询总用户数的操作,那么就可以在UserDao接口中添加相应方法:
package com.loveqh.dao; import com.loveqh.pojo.User; /** * Created by WL on 2017-04-23. */ public interface UserDao { int getAllUsersCount(); }
对应地,在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.loveqh.dao.UserDao"> <select id="getAllUsersCount" resultType="int"> select count(*) from user </select> <mapper>
在该文件中,我们注意两点:
1. mapper节点的namespace属性要对应UserDao接口。
2. select节点的id对应接口中的方法名,然后设置方法相应的参数类型及返回类型。
当然,这个mapper的xml文件需要在mybatis的配置文件中声明才能够使用。打开Configuration.xml文件,在environments节点后面添加以下节点:
<mappers> <mapper resource="mybatis-mapper/userMapper.xml"/> </mappers>
为了测试该方法能否成功执行,我们可以在user数据表中先插入一条测试数据,然后使用junit进行单元测试。我们在com.loveqh.test包中新建UserTest测试类,以测试getAllUsersCount方法。代码如下:
package com.loveqh.test; import com.loveqh.dao.UserDao; import com.loveqh.pojo.User; import com.loveqh.util.MyBatisSessionFactory; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import org.junit.After; import org.junit.Assert; import org.junit.Before; import org.junit.Test; /** * Created by WL on 2017-04-23. */ public class UserTest { private SqlSession session; private UserDao userDao; @Before public void setUp() { SqlSessionFactory sessionFactory = MyBatisSessionFactory.getSessionFactory(); session = sessionFactory.openSession(); userDao = session.getMapper(UserDao.class); } @Test public void getAllUsersCount() { int count = userDao.getAllUsersCount(); Assert.assertEquals(count, 1); } @After public void tearDown() { session.close(); } }
增加以下几点说明:
1. 使用mybatis访问数据库,我们需要根据数据库配置文件构造出SqlSessionFactory对象,然后得到SqlSession对象。MyBatisSessionFactory类是为了方便获取SqlSessionFactory对象而创建的工具类,代码稍后贴出。
2. 在使用时需要首先创建SqlSession对象,操作完毕之后就要进行关闭,因此这两步我们分别在@Before和@After中进行。
3. 对象userDao不是(也不能)直接由接口创建,而是通过session的getMapper方法构造出了的UserDao接口的实例。
4. 在@Test声明的测试方法中,我们调用UserDao接口中的getAllUsersCount方法,由于我们插入了一条测试数据,因此可以使用断言判断总用户数是否为1,如果是,则测试通过。
MyBatisSessionFactory类的代码如下:
package com.loveqh.util; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import java.io.InputStream; /** * Created by WL on 2017-04-23. */ public class MyBatisSessionFactory { public static SqlSessionFactory getSessionFactory() { SqlSessionFactory sessionFactory = null; String resource = "Configuration.xml"; try { InputStream inputStream = Resources.getResourceAsStream(resource); sessionFactory = new SqlSessionFactoryBuilder().build(inputStream); } catch (Exception e) { e.printStackTrace(); } return sessionFactory; } }
在用户管理中,我们可能会需要根据用户的id来得到用户的详细信息,因此在UserDao类中需要一个findUserById方法,如下:
User findUserById(int id);
对应地,userMapper.xml中添加相应的sql语句实现:
<select id="findUserById" resultType="com.loveqh.pojo.User" parameterType="int"> select * from user where id=#{value} </select>
这里存在两个问题:
如果很多方法都是返回User对象,那么每个resultType都需要填写完整的包名路径,十分繁琐,也容易出错。不过,当然也有解决办法,就是使用mybatis提供的别名,我们可以再次打开Configuration.xml文件,在environments节点之前添加以下节点:
<typeAliases> <typeAlias type="com.loveqh.pojo.User" alias="User"></typeAlias> </typeAliases>
这样我们便可以把包路径替换成别名User。
前面提到过,由于java的驼峰式命名法,使得对象属性与数据表列名可能不一致,例如这里的lastLogin和last_login。这时,我们可以采用resultMap方式,将数据表的列名与类的属性名进行映射。打开userMapper.xml文件,添加以下节点:
<resultMap id="userResultMap" type="User"> <id property="id" column="id"></id> <result property="name" column="name"></result> <result property="password" column="password"></result> <result property="email" column="email"></result> <result property="lastLogin" column="last_login"></result> </resultMap>
然后在select节点中使用resultMap替换掉resultType,修改如下:
<select id="findUserById" resultMap="userResultMap" parameterType="int"> select * from user where id=#{value} </select>
在项目中,我还增加了根据字符串进行模糊查询的操作,由于sql语句需要使用%通配符,所以在字符串拼接时不能使用#{},这里改用${},如下:
List<User> findUsersLikeName(String name);
<select id="findUsersLikeName" resultMap="userResultMap" parameterType="String"> select * from user where name like '%${value}%' </select>
注意到这里返回类型仍然是User,当查询结果多于一条时,mybatis会自动帮我们保存到List中,是不是很方便?关于mybatis中#和$的区别,可以参考mybatis中的#和$的区别。
数据库的基本原子操作是CURD,即创建(Create)、更新(Update)、读取(Retrieve)和删除(Delete)操作。上面只介绍了读取操作,而其他三个操作也类似,只不过它们都会对数据库进行修改,因此在执行完操作后会返回影响的记录数,并且需要执行commit操作。示例如下:
@Test public void deleteUserById() { int id = 2; int count = userDao.deleteUserById(id); //返回影响的记录数 session.commit(); //提交 Assert.assertEquals(count, 1); findAllUsers(); }
具体的代码实现可以参考提交到github上的本项目,用户管理对应的文件分别是:
- User.java
- UserDao.java
- userMapper.xml
- UserTest.java
类似地,我们可以根据需求实现project和step的数据库逻辑。接下来,我们就可以安心进行界面实现了。
相关文章推荐
- Spring Boot快速入门(五):使用MyBatis(注解形式)进行数据库操作
- mybatis+spring的TODO小项目记录(二)使用maven
- mybatis+spring的TODO小项目记录(四)使用github管理代码
- mybatis+spring的TODO小项目记录(三)使用log4j
- day03-spring与数据库操作的框架解析即dataSource的获取(JDBC)、使用spring中已经有的事务进行JDBC操作
- 使用QT对access数据库进行操作——————数据库中表、记录和域的读取
- 非Spring环境下使用Mybatis操作数据库的流程
- Spring中使用HibernateTemplate来进行数据库操作
- springboot+springmvc+mybatis 使用注解对数据库的增、改和查操作
- SpringBoot项目 使用Sprin Data Jpa 操作数据库
- 三、springboot项目的简单使用之:JPA使用操作数据库
- mybatis+spring的TODO小项目记录(七)上手spring mvc
- 使用MyBatis进行数据库的操作,出现XAER_RMFAIL错误
- Spring中使用HibernateDaoSupport来进行数据库的操作
- mybatis+spring的TODO小项目记录(八)整合spring和mybatis
- 使用QT对access数据库进行操作——数据库中表、记录和域的读取
- mybatis+spring的TODO小项目记录(一)总体设计
- SpringBoot中连接MYSQL数据库,并使用JPA进行数据库的相关操作
- mybatis+spring的TODO小项目记录(五)配置mybatis
- SpringBoot中连接MYSQL数据库,并使用JPA进行数据库的相关操作