Mybatis 的基本增删改查操作
1. 导入相关的 jar 包
<dependencies>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!-- 数据库驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<!-- 日志 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- JUnit 单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
2. 创建实体类
package com.demo.entity;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String address;
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;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", birthday=" + birthday +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
}
3. 创建 dao 接口
package com.demo.dao;
import com.demo.entity.User;
import java.util.List;
public interface IUserDao {
/**
* 查询所有
* @return
*/
List<User> findAll();
/**
* 查询用户总个数
* @return
*/
Integer count();
/**
* 根据 id 查询
* @param userId
* @return
*/
User findById(Integer userId);
/**
* 根据名称查询
* @param username
* @return
*/
List<User> findByName(String username);
/**
* 保存用户
* @param user
*/
void saveUser(User user);
/**
* 更新用户
* @param user
*/
void updateUser(User user);
/**
* 删除用户
* @param userId
*/
void deleteUser(Integer userId);
}
4. 编写 Mybatis 主配置文件
<?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>
<!-- 引用 propertise 文件 -->
<properties resource="jdbcConfig.properties"></properties>
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<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="com/demo/dao/IUserDao.xml"></mapper>
</mappers>
</configuration>
小点总结:
1. 数据源的类型选择:
1.1 POOLED:使用连接池的数据源。采用池的思想,从池中获取连接
1.2 UNPOOLED:不使用连接池的数据源。采用传统的方式获取连接,每次都会注册驱动,获取一个新连接
1.3 JNDI:使用 JNDI 实现的数据源。采用服务器提供的 JNDI 技术来获取 DataSource 对象,不同的服务器拿到的 DataSource 是不一样的。
2. 指定映射文件位置的表示:
2.1 resource:表示使用 xml 文件配置,需要填入映射配置文件的位置
2.2 class:表示使用注解配置,需要填入 dao 层接口的全限定类名
2.3 package:表示指定包下的所有 dao 接口
5. 编写映射配置文件
<?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.demo.dao.IUserDao">
<!-- 查询所有 -->
<select id="findAll" resultType="com.demo.entity.User">
select * from user
</select>
<!-- 查询用户总条数 -->
<select id="count" resultType="int">
select count(id) from user
</select>
<!-- 根据 id 查询一个 -->
<select id="findById" resultType="com.demo.entity.User" parameterType="int">
select * from user where id = #{id}
</select>
<!-- 根据名称查询 -->
<select id="findByName" resultType="com.demo.entity.User" parameterType="String">
select * from user where username like #{username}
</select>
<!-- 保存操作 -->
<insert id="saveUser" parameterType="com.demo.entity.User">
insert into user(username,sex,birthday,address) values (#{username},#{sex},#{birthday},#{address})
</insert>
<!-- 更新操作 -->
<update id="updateUser" parameterType="com.demo.entity.User">
update user set username=#{username},sex=#{sex},birthday=#{birthday},address=#{address} where id=#{id}
</update>
<!-- 删除用户 -->
<delete id="deleteUser" parameterType="int">
delete from user where id=#{id}
</delete>
</mapper>
6. 编写测试类
package com.demo.test;
import com.demo.dao.IUserDao;
import com.demo.entity.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.InputStream;
import java.util.Date;
import java.util.List;
public class UserDaoTest {
private InputStream in;
private SqlSessionFactory sqlSessionFactory;
private SqlSession sqlSession;
private IUserDao userDao;
/**
* @Before 在测试方法之前执行
* @throws Exception
*/
@Before
public void init() throws Exception{
this.in = Resources.getResourceAsStream("SQLMapConfig.xml");
this.sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
this.sqlSession = sqlSessionFactory.openSession();
this.userDao = sqlSession.getMapper(IUserDao.class);
}
/**
* @After 在测试方法之后执行
* @throws Exception
*/
@After
public void destroy() throws Exception {
sqlSession.commit();
sqlSession.close();
in.close();
}
/**
* 测试查询所有
*/
@Test
public void testFindAll() {
List<User> users = userDao.findAll();
for (User user : users) {
System.out.println(user);
}
}
/**
* 测试查询用户总个数
*/
@Test
public void testCount() {
Integer count = userDao.count();
System.out.println(count);
}
/**
* 测试根据 id 查询
*/
@Test
public void testFindById() {
User user = userDao.findById(1);
System.out.println(user);
}
/**
* 测试根据名称模糊查询
*/
@Test
public void testFindByName() {
List<User> users = userDao.findByName("%xiong%");
for (User user : users) {
System.out.println(user);
}
}
/**
* 测试添加用户
*/
@Test
public void testSaveUser() {
User user = new User();
user.setUsername("xiao xiong 5 号");
user.setSex("女");
user.setAddress("西安");
user.setBirthday(new Date());
userDao.saveUser(user);
}
/**
* 测试更新用户
*/
@Test
public void testUpdateUser() {
User user = new User();
user.setId(4);
user.setUsername("xiao xiong 4号");
user.setSex("女");
user.setAddress("上海");
user.setBirthday(new Date());
userDao.updateUser(user);
}
/**
* 测试删除用户
*/
@Test
public void testDeleteUser() {
userDao.deleteUser(4);
}
}
使用 resultMap 封装结果集
在某些情况下,实体类的属性和数据库表的列名并不一致,会出现查询结果无法封装到实体类的问题。
以下是两种方法可以解决实体类属性名与数据库表列名不一致的问题:
- 在 SQL 语句中为所有列起别名,使别名与实体类属性名一致
(执行效率相对高,开发效率低) - 使用 resultMap 完成结果集到实体类的映射
(执行效率相对低,开发效率高)
使用 resultMap 解决问题的实现:
<mapper namespace="com.demo.dao.IUserDao">
<!-- resultMap 实现实体类与数据库表的映射 -->
<resultMap id="userMap" type="com.demo.entity.User">
<id property="userId" column="id"></id>
<result property="userName" column="username"></result>
<result property="userSex" column="sex"></result>
<result property="userAddress" column="address"></result>
<result property="userBirthday" column="birthday"></result>
</resultMap>
<!-- 查询所有 -->
<select id="findAll" resultMap="userMap">
select * from user
</select>
</mapper>