1.准备工作
创建maven、添加jar包坐标、log4j的配置文件等准备工作可以参考:IDEA中Maven工程的MyBatis快速入门
2.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> <settings> <!-- 开启延迟加载 --> <setting name="lazyLoadingEnabled" value="true"/> <setting name="aggressiveLazyLoading" value="false"/> <!-- 开启二级缓存 --> <setting name="cacheEnabled" value="true"/> </settings> <environments default="local"> <!-- 数据库环境配置 --> <environment id="local"> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/test?characterEncoding=utf-8"/> <property name="username" value="root"/> <property name="password" value="sxd5443380"/> </dataSource> </environment> </environments> <mappers> <!-- 映射接口包路径 --> <package name="com.gqzzw.mapper"/> </mappers> </configuration>
3.编写实体类
假如数据库内容为:
DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(11) NOT NULL auto_increment, `username` varchar(32) NOT NULL COMMENT '用户名称', `sex` char(1) default NULL COMMENT '性别', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; insert into `user`(`id`,`username`,`sex`) values (41,'老王','男'),(42,'小二王','女'),(43,'小三王','女'); DROP TABLE IF EXISTS `account`; CREATE TABLE `account` ( `id` int(11) NOT NULL COMMENT '编号', `uid` int(11) default NULL COMMENT '用户编号', `money` double default NULL COMMENT '金额', PRIMARY KEY (`id`), CONSTRAINT `FK_Reference_1` FOREIGN KEY (`uid`) REFERENCES `user` (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; insert into `account`(`id`,`uid`,`money`) values (1,41,1000),(2,42,1000),(3,42,2000);
需要创建的User类具有相同的数表字段名,同时需要实现Serializable接口,放在src/main/java下,代码如下:
package com.gqzzw.domain; import java.io.Serializable; import java.util.List; public class User implements Serializable { private int id; private String username; private char sex; private List<Account> accounts; public List<Account> getAccounts() { return accounts; } public void setAccounts(List<Account> accounts) { this.accounts = accounts; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public char getSex() { return sex; } public void setSex(char sex) { this.sex = sex; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", sex=" + sex + '}'; } }
还需要创建的Account类具有相同的数表字段名,同时需要实现Serializable接口,放在src/main/java下,代码如下:
package com.gqzzw.domain; import java.io.Serializable; public class Account implements Serializable { private int id; private int uid; private double money; private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } public int getId() { return id; } public void setId(int id) { this.id = id; } public int getUid() { return uid; } public void setUid(int uid) { this.uid = uid; } public double getMoney() { return money; } public void setMoney(double money) { this.money = money; } @Override public String toString() { return "AccountMapper{" + "id=" + id + ", uid=" + uid + ", money=" + money + '}'; } }
4.编写实体类的持久层映射接口
这里对应的User类持久层映射接口取名UserMapper,放在src/main/java下,代码如下:
package com.gqzzw.mapper; import com.gqzzw.domain.User; import org.apache.ibatis.annotations.*; import org.apache.ibatis.mapping.FetchType; import java.util.List; @CacheNamespace(blocking = true)//开启二级缓存 public interface UserMapper { //保存用户 @Insert("insert into user(username,sex) value(#{username},#{sex})") void save(User user); //修改用户 @Update("update user set username=#{username},sex=#{sex} where id=#{id}") void update(User user); //根据id查询 @Select("select * from user where id=#{id}") List<User> findById(int id); //删除用户 @Delete("delete from user where id=#{id}") void delete(User user); //一对多查询 @Select("select * from user") @Results(value = { @Result(id = true,column = "id",property = "id"), @Result(column = "username",property = "username"), @Result(column = "sex",property = "sex"), @Result(column = "id",property = "accounts", many = @Many(select = "com.gqzzw.mapper.AccountMapper.findByUid", fetchType = FetchType.LAZY)) }) List<User> findAll(); }
这里对应的Account类持久层映射接口取名AccountMapper,放在src/main/java下,代码如下:
package com.gqzzw.mapper; import com.gqzzw.domain.Account; import org.apache.ibatis.annotations.*; import org.apache.ibatis.mapping.FetchType; import java.util.List; @CacheNamespace(blocking = true)//开启二级缓存 public interface AccountMapper { //多对一查询 @Select("select * from account") @Results(value = { @Result(id = true,column = "id",property = "id"), @Result(column = "uid",property = "uid"), @Result(column = "money",property = "money"), @Result(column = "uid",property = "user", one = @One(select = "com.gqzzw.mapper.UserMapper.findById",fetchType = FetchType.EAGER)) }) List<Account> findAll(); //根据uid查询账户 @Select("select * from account where uid=#{uid}") List<Account> findByUid(int uid); }
5.编写测试类
放在src/test/java下,编写测试类UserMapperTest,内容如下:
package com.gqzzw.mapper; import com.gqzzw.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.List; public class UserMapperTset { private InputStream in; private SqlSessionFactory factory; private SqlSession sqlSession; private UserMapper userMapper; @Before public void init() throws IOException { //读取配置文件 in = Resources.getResourceAsStream("SqlMapConfig.xml"); //创建SqlSessionFactory的构建者对象 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //使用构建者创建工厂对象SqlSessionFactory factory = builder.build(in); //使用SqlSessionFactory产SqlSession对象生 sqlSession = factory.openSession(); //产SqlSession对象时可以传true代表自动提交事务 //sqlSession = factory.openSession(true); //使用SqlSession创建映射接口的代理对象 userMapper = sqlSession.getMapper(UserMapper.class); } @After public void destroy() throws IOException { //提交事务,释放资源 sqlSession.commit(); sqlSession.close(); in.close(); } //保存用户 @Test public void save(){ User user = new User(); user.setUsername("05bk.com"); user.setSex('男'); userMapper.save(user); } //修改用户 @Test public void update(){ User user = new User(); user.setId(43); user.setUsername("05bk"); user.setSex('女'); userMapper.update(user); } //根据id查询 @Test public void findById(){ List<User> users = userMapper.findById(43); System.out.println(users); } //删除用户 @Test public void delete(){ User user = new User(); user.setId(43); userMapper.delete(user); } //一对多查询 @Test public void findAll(){ List<User> users = userMapper.findAll(); for (User user : users) { System.out.println(user); System.out.println(user.getAccounts()); } } }
放在src/test/java下,编写测试类AccountMapperTest,内容如下:
package com.gqzzw.mapper; import com.gqzzw.domain.Account; import com.gqzzw.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.List; public class AccountMapperTset { private InputStream in; private SqlSession sqlSession; private AccountMapper accountMapper; @Before public void init() throws IOException { //读取配置文件 in = Resources.getResourceAsStream("SqlMapConfig.xml"); //创建SqlSessionFactory的构建者对象 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); //使用构建者创建工厂对象SqlSessionFactory SqlSessionFactory factory = builder.build(in); //使用SqlSessionFactory产SqlSession对象生 sqlSession = factory.openSession(); //产SqlSession对象时可以传true代表自动提交事务 //sqlSession = factory.openSession(true); //使用SqlSession创建映射接口的代理对象 accountMapper = sqlSession.getMapper(AccountMapper.class); } @After public void destroy() throws IOException { //提交事务,释放资源 sqlSession.commit(); sqlSession.close(); in.close(); } @Test //多对一查询 public void findAll(){ List<Account> accounts = accountMapper.findAll(); for (Account account : accounts) { System.out.println(account); System.out.println(account.getUser()); } } @Test //根据uid查询账户 public void findByUid(){ List<Account> accounts = accountMapper.findByUid(42); System.out.println(accounts); } }