User.java
package com.how2java.pojo; import java.io.Serializable; import java.util.Date; import java.util.List; public class User implements Serializable{ private Integer userId; private String userName; private Date userBirthday; private String userSex; private String userAddress; //一对多的映射,一个用户有多个账户 private List<Account> accounts; public List<Account> getAccounts() { return accounts; } public void setAccounts(List<Account> accounts) { this.accounts = accounts; } 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 Date getUserBirthday() { return userBirthday; } public void setUserBirthday(Date userBirthday) { this.userBirthday = userBirthday; } public String getUserSex() { return userSex; } public void setUserSex(String userSex) { this.userSex = userSex; } public String getUserAddress() { return userAddress; } public void setUserAddress(String userAddress) { this.userAddress = userAddress; } @Override public String toString() { return "User{" + "userId=" + userId + ", userName='" + userName + '\'' + ", userBirthday=" + userBirthday + ", userSex='" + userSex + '\'' + ", userAddress='" + userAddress + '\'' + '}'; } }Account.java
package com.how2java.pojo; import java.io.Serializable; public class Account implements Serializable{ private Integer id; private Integer uid; private Double money; //多对一(Mybatis中称一对一)的映射,一个账户只属于一个用户 private User user; public User getUser() { return user; } public void setUser(User user) { this.user = user; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public Integer getUid() { return uid; } public void setUid(Integer uid) { this.uid = uid; } public Double getMoney() { return money; } public void setMoney(Double money) { this.money = money; } @Override public String toString() { return "Account{" + "id=" + id + ", uid=" + uid + ", money=" + money + '}'; } }IUserDao.java
package com.how2java.dao; import com.how2java.pojo.User; import org.apache.ibatis.annotations.*; import org.apache.ibatis.mapping.FetchType; import java.util.List; /** * 在Mybatis中CURD有四个注解 * @Sslect, @Insert, @Update, @Delete */ public interface IUserDao { /** * 查询所有用户信息, 并延迟加载用户下的账户信息 * @return */ @Select("select * from user") @Results(id = "userMap", value={ @Result(id = true, column = "id", property = "userId"), @Result(column = "username", property = "userName"), @Result(column = "birthday", property = "userBirthday"), @Result(column = "sex", property = "userSex"), @Result(column = "address", property = "userAddress"), @Result(property = "accounts", column = "id", many = @Many(select = "com.how2java.dao.IAccountDao.findByUid", fetchType = FetchType.LAZY)) }) List<User> findAll(); /** * 根据账户id查询账户所属的用户信息 * @param id * @return */ @Select("select * from user where id = #{id}") // @ResultMap(value = {"userMap"}) @ResultMap("userMap") User findById(Integer id); }IAccountDao.java
package com.how2java.dao; import com.how2java.pojo.Account; import org.apache.ibatis.annotations.*; import org.apache.ibatis.mapping.FetchType; import java.util.List; public interface IAccountDao { /** * 查询所有账户信息,并且立即加载账户所属的用户信息 * @return */ @Select("select * from account") @Results(id = "accountMap", value = { @Result(id = true, column = "id", property = "id"), @Result(column = "uid", property = "uid"), @Result(column = "money", property = "money"), @Result(property = "user", column = "uid", one = @One(select = "com.how2java.dao.IUserDao.findById", fetchType = FetchType.EAGER)) }) List<Account> findAll(); /** * 根据用户id查询用户下账户信息 * @param uid * @return */ @Select("select * from account where uid = #{id}") @ResultMap("accountMap") List<Account> findByUid(Integer uid); }jdbcConfig.properties
jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=UTF-8 jdbc.username=root jdbc.password=adminSqlMapConfig.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> <!--引入外部配置文件--> <properties resource="jdbcConfig.properties"></properties> <!--配置别名--> <typeAliases> <package name="com.how2java.pojo"></package> </typeAliases> <!--配置环境--> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"></transactionManager> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"></property> <property name="url" value="${jdbc.url}"></property> <property name="username" value="${jdbc.username}"></property> <property name="password" value="${jdbc.password}"></property> </dataSource> </environment> </environments> <!--引入指定带有注解的dao接口所在位置--> <mappers> <package name="com.how2java.dao"></package> </mappers> </configuration>TestUser.java
package com.how2java; import com.how2java.dao.IUserDao; import com.how2java.pojo.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.List; public class TestUser { private InputStream in; private SqlSessionFactory factory; private SqlSession sqlSession; private IUserDao userDao; @Before public void init() throws Exception { in = Resources.getResourceAsStream("SqlMapConfig.xml"); factory = new SqlSessionFactoryBuilder().build(in); sqlSession = factory.openSession(); userDao = sqlSession.getMapper(IUserDao.class); } @After public void destory() throws Exception { sqlSession.commit(); sqlSession.close(); in.close(); } @Test public void findAll() throws Exception { List<User> users = userDao.findAll(); for(User user : users) { System.out.println("——用户信息——"); System.out.println(user); System.out.println(user.getAccounts()); } } }TestAccount.java
package com.how2java; import com.how2java.dao.IAccountDao; import com.how2java.pojo.Account; 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.List; public class TestAccount { private InputStream in; private SqlSessionFactory factory; private SqlSession sqlSession; private IAccountDao accountDao; @Before public void init() throws Exception { in = Resources.getResourceAsStream("SqlMapConfig.xml"); factory = new SqlSessionFactoryBuilder().build(in); sqlSession = factory.openSession(); accountDao = sqlSession.getMapper(IAccountDao.class); } @After public void destory() throws Exception { sqlSession.commit(); sqlSession.close(); in.close(); } @Test public void findAll() throws Exception { List<Account> accounts = accountDao.findAll(); for(Account account : accounts) { System.out.println("——账户信息——"); System.out.println(account); System.out.println(account.getUser()); } } }IUserDao.java
@CacheNamespace(blocking = true) public interface IUserDao { }SqlMapConfig.java
<!--配置开启缓存--> <settings> <setting name="cacheEnabled" value="true"/> </settings>TestSecondLevelCache.java
package com.how2java; import com.how2java.dao.IUserDao; import com.how2java.pojo.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; public class TestSecondLevelCache { private InputStream in; private SqlSessionFactory factory; @Before public void init() throws Exception { in = Resources.getResourceAsStream("SqlMapConfig.xml"); factory = new SqlSessionFactoryBuilder().build(in); } @After public void destory() throws Exception { in.close(); } @Test public void testFindOne() throws Exception { SqlSession sqlSession1 = factory.openSession(); IUserDao userDao1 = sqlSession1.getMapper(IUserDao.class); User user1 = userDao1.findById(4); System.out.println(user1); sqlSession1.close();//释放一级缓存 SqlSession sqlSession2 = factory.openSession(); IUserDao userDao2 = sqlSession2.getMapper(IUserDao.class); User user2 = userDao2.findById(4); System.out.println(user2); } }