32.7 mybatis注解开发的环境搭建
<?xml version="1.0" encoding="UTF-8"?>
< project xmlns = " http://maven.apache.org/POM/4.0.0"
xmlns: xsi= " http://www.w3.org/2001/XMLSchema-instance"
xsi: schemaLocation= " http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" >
< modelVersion> 4.0.0</ modelVersion>
< groupId> com.xww</ groupId>
< artifactId> day32_mybatis3</ artifactId>
< version> 1.0-SNAPSHOT</ version>
< packaging> jar</ packaging>
< dependencies>
< 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.12</ version>
</ dependency>
< dependency>
< groupId> junit</ groupId>
< artifactId> junit</ artifactId>
< version> 4.10</ version>
</ dependency>
</ dependencies>
</ project>
package com. xww. domain;
import java. io. Serializable;
import java. util. Date;
public class User implements Serializable {
private Integer id;
private String username;
private String address;
private String sex;
private Date birthday;
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 String getAddress ( ) {
return address;
}
public void setAddress ( String address) {
this . address = address;
}
public String getSex ( ) {
return sex;
}
public void setSex ( String sex) {
this . sex = sex;
}
public Date getBirthday ( ) {
return birthday;
}
public void setBirthday ( Date birthday) {
this . birthday = birthday;
}
@Override
public String toString ( ) {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", address='" + address + '\'' +
", sex='" + sex + '\'' +
", birthday=" + birthday +
'}' ;
}
}
package com. xww. dao;
import com. xww. domain. User;
import org. apache. ibatis. annotations. Delete;
import org. apache. ibatis. annotations. Insert;
import org. apache. ibatis. annotations. Select;
import org. apache. ibatis. annotations. Update;
import java. util. List;
public interface IUserDao {
@Select ( "select * from user" )
List< User> findAll ( ) ;
@Insert ( "insert into user(username,address,sex,birthday)values(#{username},#{address},#{sex},#{birthday})" )
void saveUser ( User user) ;
@Update ( "update user set username=#{username},sex=#{sex},birthday=#{birthday},address=#{address} where id=#{id}" )
void updateUser ( User user) ;
@Delete ( "delete from user where id=#{id} " )
void deleteUser ( Integer userId) ;
@Select ( "select * from user where id=#{id} " )
User findById ( Integer userId) ;
@Select ( "select * from user where username like '%${value}%' " )
List< User> findUserByName ( String username) ;
@Select ( "select count(*) from user " )
int findTotalUser ( ) ;
}
准备主配置文件,SqlMapConfig.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.xww.domain" > </ package>
</ typeAliases>
< environments default = " mysql" >
< environment id = " mysql" >
< 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>
< mappers>
< mapper class = " com.xww.dao.IUserDao" > </ mapper>
</ mappers>
</ configuration>
package com. xww. test;
import com. xww. dao. IUserDao;
import com. xww. 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. InputStream;
import java. util. Date;
import java. util. List;
public class AnnotationCRUDTest {
private InputStream in;
private SqlSessionFactory factory;
private SqlSession session;
private IUserDao userDao;
@Before
public void init ( ) throws Exception{
in = Resources. getResourceAsStream ( "SqlMapConfig.xml" ) ;
factory = new SqlSessionFactoryBuilder ( ) . build ( in) ;
session = factory. openSession ( ) ;
userDao = session. getMapper ( IUserDao. class ) ;
}
@After
public void destroy ( ) throws Exception{
session. commit ( ) ;
session. close ( ) ;
in. close ( ) ;
}
@Test
public void testSave ( ) {
User user = new User ( ) ;
user. setUsername ( "注解" ) ;
user. setAddress ( "2021.2.26日很焦急" ) ;
userDao. saveUser ( user) ;
}
@Test
public void testUpdate ( ) {
User user = new User ( ) ;
user. setId ( 57 ) ;
user. setUsername ( "mybatis annotation update" ) ;
user. setAddress ( "北京市海淀区" ) ;
user. setSex ( "男" ) ;
user. setBirthday ( new Date ( ) ) ;
userDao. updateUser ( user) ;
}
@Test
public void testDelete ( ) {
userDao. deleteUser ( 51 ) ;
}
@Test
public void testFindOne ( ) {
User user = userDao. findById ( 57 ) ;
System. out. println ( user) ;
}
@Test
public void testFindByName ( ) {
List< User> users = userDao. findUserByName ( "mybatis" ) ;
for ( User user : users) {
System. out. println ( user) ;
}
}
@Test
public void testFindTotal ( ) {
int total = userDao. findTotalUser ( ) ;
System. out. println ( total) ;
}
}
32.8 mybatis注解建立实体类属性和数据库表中列的对应关系
如果字段和属性对应不上,可以使用别名解决,也可以使用注解映射的方式解决,如下:
package com. xww. dao;
import com. xww. domain. User;
import org. apache. ibatis. annotations. *;
import org. apache. ibatis. mapping. FetchType;
import java. util. List;
@CacheNamespace ( blocking = true )
public interface IUserDao {
@Select ( "select * from user" )
@Results ( id= "userMap" , value= {
@Result ( id= true , column = "id" , property = "userId" ) ,
@Result ( column = "username" , property = "userName" ) ,
@Result ( column = "address" , property = "userAddress" ) ,
@Result ( column = "sex" , property = "userSex" ) ,
@Result ( column = "birthday" , property = "userBirthday" )
} )
List< User> findAll ( ) ;
@Select ( "select * from user where id=#{id} " )
@ResultMap ( "userMap" )
User findById ( Integer userId) ;
@Select ( "select * from user where username like #{username} " )
@ResultMap ( "userMap" )
List< User> findUserByName ( String username) ;
}
32.9 mybatis注解开发一对一的查询配置
1.创建一个实体类Account
2.创建IAccountDao接口,并添加查询所有的方法,查询account的同时需要查询用户信息,首先修改accont的类
package com. xww. domain;
import java. io. Serializable;
public class Account implements Serializable {
private Integer id;
private Integer uid;
private Double money;
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 +
'}' ;
}
}
3.IAccountDao接口,并设置延迟查询策略为不延迟
package com. xww. dao;
import com. xww. domain. Account;
import org. apache. ibatis. annotations. One;
import org. apache. ibatis. annotations. Result;
import org. apache. ibatis. annotations. Results;
import org. apache. ibatis. annotations. Select;
import org. apache. ibatis. mapping. FetchType;
import java. util. List;
public interface IAccountDao {
@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.xww.dao.IUserDao.findById" , fetchType= FetchType. EAGER) )
} )
List< Account> findAll ( ) ;
@Select ( "select * from account where uid = #{userId}" )
List< Account> findAccountByUid ( Integer userId) ;
}
@Test
public void testFindAll ( ) {
List< User> users = userDao. findAll ( ) ;
for ( User user : users) {
System. out. println ( "---每个用户的信息----" ) ;
System. out. println ( user) ;
System. out. println ( user. getAccounts ( ) ) ;
}
}
32.10 mybatis注解开发一对多的查询配置
package com. xww. domain;
import java. io. Serializable;
import java. util. Date;
import java. util. List;
public class User implements Serializable {
private Integer userId;
private String userName;
private String userAddress;
private String userSex;
private Date userBirthday;
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 String getUserAddress ( ) {
return userAddress;
}
public void setUserAddress ( String userAddress) {
this . userAddress = userAddress;
}
public String getUserSex ( ) {
return userSex;
}
public void setUserSex ( String userSex) {
this . userSex = userSex;
}
public Date getUserBirthday ( ) {
return userBirthday;
}
public void setUserBirthday ( Date userBirthday) {
this . userBirthday = userBirthday;
}
@Override
public String toString ( ) {
return "User{" +
"userId=" + userId +
", userName='" + userName + '\'' +
", userAddress='" + userAddress + '\'' +
", userSex='" + userSex + '\'' +
", userBirthday=" + userBirthday +
'}' ;
}
}
修改IUserDao接口中的方法,并指明为延迟加载
package com. xww. dao;
import com. xww. domain. User;
import org. apache. ibatis. annotations. *;
import org. apache. ibatis. mapping. FetchType;
import java. util. List;
@CacheNamespace ( blocking = true )
public interface IUserDao {
@Select ( "select * from user" )
@Results ( id= "userMap" , value= {
@Result ( id= true , column = "id" , property = "userId" ) ,
@Result ( column = "username" , property = "userName" ) ,
@Result ( column = "address" , property = "userAddress" ) ,
@Result ( column = "sex" , property = "userSex" ) ,
@Result ( column = "birthday" , property = "userBirthday" ) ,
@Result ( property = "accounts" , column = "id" ,
many = @Many ( select = "com.xww.dao.IAccountDao.findAccountByUid" ,
fetchType = FetchType. LAZY) )
} )
List< User> findAll ( ) ;
@Select ( "select * from user where id=#{id} " )
@ResultMap ( "userMap" )
User findById ( Integer userId) ;
@Select ( "select * from user where username like #{username} " )
@ResultMap ( "userMap" )
List< User> findUserByName ( String username) ;
}
32.11 mybatis注解开发使用二级缓存
< settings>
< setting name = " cacheEnabled" value = " true" />
</ settings>
@CacheNamespace ( blocking = true )
public interface IUserDao {
@Test
public void testFindOne ( ) {
SqlSession session = factory. openSession ( ) ;
IUserDao userDao = session. getMapper ( IUserDao. class ) ;
User user = userDao. findById ( 57 ) ;
System. out. println ( user) ;
session. close ( ) ;
SqlSession session1 = factory. openSession ( ) ;
IUserDao userDao1 = session1. getMapper ( IUserDao. class ) ;
User user1 = userDao1. findById ( 57 ) ;
System. out. println ( user1) ;
session1. close ( ) ;
}