文章目录
项目结构
创建表
CREATE TABLE account(
id INT PRIMARY KEY AUTO_INCREMENT,
NAME VARCHAR(40),
money FLOAT
)CHARACTER SET utf8 COLLATE utf8_general_ci;
INSERT INTO account(NAME,money) VALUES('aaa',1000);
INSERT INTO account(NAME,money) VALUES('bbb',1000);
INSERT INTO account(NAME,money) VALUES('ccc',1000);
导入maven坐标
<dependencies>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.48</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13</version>
<scope>test</scope>
</dependency>
</dependencies>
实体类Account.java
package com.cenzn.domain;
public class Account {
private Integer id;
private String name;
private Float money;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Float getMoney() {
return money;
}
public void setMoney(Float money) {
this.money = money;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", money=" + money +
'}';
}
}
业务层接口IAccountService.java
package com.cenzn.service;
import com.cenzn.domain.Account;
import java.util.List;
public interface IAccountService {
//查询所有账户
List<Account> findAccountAll();
//通过名字查找账户
Account findAccountByName(String name);
//保存账户
void saveAccount(Account account);
//更新账户
void updateAccount(Account account);
//删除账户
void deleteAccount(Integer id);
}
业务层实现类AccountServiceImpl.java
package com.cenzn.service.impl;
import com.cenzn.domain.Account;
import com.cenzn.mapper.IAccountMapper;
import com.cenzn.service.IAccountService;
import java.util.List;
public class AccountServiceImpl implements IAccountService {
private IAccountMapper accountMapper;
public void setAccountMapper(IAccountMapper accountMapper) {
this.accountMapper = accountMapper;
}
/**
* 查询所有账户
* @return
*/
public List<Account> findAccountAll() {
return accountMapper.findAccountAll();
}
/**
* 通过名字查询账户
* @param name
* @return
*/
public Account findAccountByName(String name) {
return accountMapper.findAccountByName(name);
}
/**
* 保存账户
* @param account
*/
public void saveAccount(Account account) {
accountMapper.saveAccount(account);
}
/**
* 更新账户
* @param account
*/
public void updateAccount(Account account) {
accountMapper.updateAccount(account);
}
/**
* 删除账户
* @param id
*/
public void deleteAccount(Integer id) {
accountMapper.deleteAccount(id);
}
}
持久层接口IAccountMapper.java
package com.cenzn.mapper;
import com.cenzn.domain.Account;
import java.util.List;
public interface IAccountMapper {
//查询所有账户
List<Account> findAccountAll();
//通过名字查找账户
Account findAccountByName(String name);
//保存账户
void saveAccount(Account account);
//更新账户
void updateAccount(Account account);
//删除账户
void deleteAccount(Integer id);
}
持久层接口的映射文件IAccountMapper.xml
- 要注意
创建位置:必须和持久层接口在相同的包中。
名称:必须以持久层接口名称命名文件名,扩展名是.xml
- mapper 标签的属性
namespace 属性取值必须是持久层接口的全限定类名
- CRUD标签里面的相关属性:
id :对应持久层里面的某个方法名
resultType :用于指定结果集的类型(方法的返回值类型)
parameterType :用于指定传入参数的类型(方法里面的参数类型)
<?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.cenzn.mapper.IAccountMapper">
<!-- 查询所有账户-->
<select id="findAccountAll" resultType="com.cenzn.domain.Account">
select * from account
</select>
<!--通过名字查找账户-->
<select id="findAccountByName" parameterType="String" resultType="com.cenzn.domain.Account">
select * from account where name = #{name}
</select>
<!--保存账户-->
<insert id="saveAccount" parameterType="com.cenzn.domain.Account">
insert into account(name ,money) values (#{name},#{money})
</insert>
<!--更新账户-->
<update id="updateAccount" parameterType="com.cenzn.domain.Account">
update account set money = #{money} where id = #{id};
</update>
<!--删除账户-->
<delete id="deleteAccount" parameterType="java.lang.Integer">
delete from account where id = #{uid}
</delete>
</mapper>
SqlMapperConfig.xml
<?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>
<environments default="mysql">
<environment id="mysql">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///spring"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper class="com.cenzn.mapper.IAccountMapper"/>
</mappers>
</configuration>
测试类XMLTest.java
一般的步骤
//1.读取配置文件
InputStream in = Resources.getResourceAsStream("SqlMapperConfig.xml");
//2.创建 SqlSessionFactory 的构建者对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
//3.使用构建者创建工厂对象 SqlSessionFactory
SqlSessionFactory factory = builder.build(in);
//4.使用 SqlSessionFactory 生产 SqlSession 对象
SqlSession session = factory.openSession();
//5.使用 SqlSession 创建 dao 接口的代理对象
IAccountMapper userDao = session.getMapper(IAccountMapper.class);
//6.使用代理对象执行查询所有方法
List<Account> accounts = userDao.findAccountAll();
for(Account account : accounts) {
System.out.println(account);
}
//7.释放资源
session.close();
in.close();
由于有些测试的代码有重复的所以抽取在了init(),destroy()两个方法中
package com.cenzn.test;
import com.cenzn.domain.Account;
import com.cenzn.mapper.IAccountMapper;
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.Test;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
public class XMLTest {
private InputStream in;
private SqlSessionFactoryBuilder builder;
private SqlSessionFactory factory;
private SqlSession session;
private IAccountMapper accountMapper;
//由于每个测试这些步骤都是相同的,所有抽取出来
public void init() throws IOException {
//1.读取配置文件
in = Resources.getResourceAsStream("SqlMapperConfig.xml");
//2.创建 SqlSessionFactory 的构建者对象
builder = new SqlSessionFactoryBuilder();
//3.使用构建者创建工厂对象 SqlSessionFactory
factory = builder.build(in);
//4.使用 SqlSessionFactory 生产 SqlSession 对象
session = factory.openSession();
//5.使用 SqlSession 创建 dao 接口的代理对象
accountMapper = session.getMapper(IAccountMapper.class);
}
//释放资源
public void destroy() throws IOException {
in.close();
session.close();
}
/**
* 查询所有账户
* @throws IOException
*/
@Test
public void findAllTest() throws IOException {
//6.使用代理对象执行查询所有方法
List<Account> accounts = accountMapper.findAccountAll();
for (Account account : accounts){
System.out.println(account);
}
}
/**
* 通过名字查找账户
* @throws IOException
*/
@Test
public void findAccountByName() throws IOException {
init();
Account account = accountMapper.findAccountByName("aaa");
System.out.println(account);
destroy();
}
/**
* 保存账户
* @throws IOException
*/
@Test
public void saveAccounTest() throws IOException {
init();
Account account = new Account();
account.setName("ddd");
account.setMoney(1234f);
accountMapper.saveAccount(account);
session.commit();//注意要提交事务不然事务会回滚
destroy();
}
/**
* 删除账户
* @throws IOException
*/
@Test
public void deleteAccountTest() throws IOException {
init();
accountMapper.deleteAccount(4);
session.commit();//注意要提交事务不然事务会回滚
destroy();
}
/**
* 更新账户
* @throws IOException
*/
@Test
public void updateAccountTest() throws IOException {
init();
Account account = new Account();
account.setId(1);
account.setMoney(12345f);
accountMapper.updateAccount(account);
session.commit();//注意要提交事务不然事务会回滚
destroy();
}
}