JavaEE學習日誌持續更新----> 必看!JavaEE學習路線(文章總彙)
JavaEE學習日誌(八十六)
MyBatis
註解開發
package com.itheima.dao;
import com.itheima.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 UserDao {
/**
* 查詢所有
* @return
*/
@Select("select * from user")
List<User> findAll();
/**
* 根據ID查詢
* @return
*/
@Select("select * from user where id = #{id}")
User findById(Integer id);
/**
* 根據姓名模糊查詢,注意sql語句不能用單引號
* @param username
* @return
*/
@Select("select * from user where username like \"%\"#{username}\"%\"")
List<User> findByUsername(String username);
/**
* 查詢總條數
* @return
*/
@Select("select count(*) from user")
Integer findTotalCount();
/**
* 添加用戶
* @param user
*/
@Insert("insert into user values(null,#{username},#{password},#{sex},#{address},#{birthday})")
void insert(User user);
/**
* 更新用戶
* @param user
*/
@Update("update user set username = #{username},password = #{password},sex = #{sex}+" +
", address = #{address},birthday = #{birthday} where id = #{id}")
void update(User user);
/**
* 根據ID刪除用戶
* @param id
*/
@Delete("delete from user where id = #{id}")
void del(Integer id);
}
結果集映射
注意:
@Results
映射結果集@Result
映射不一樣的列(列名與屬性名不一樣的列)- id=true 該列爲主鍵,id的默認值爲false
- 註解中,只需要寫列名和屬性名不一樣的,一樣的可以省略
/**
* 查詢所有
* @return
*/
@Select("select * from user")
@Results({
@Result(id=true, column = "uid",property = "id"),
@Result(column = "uname",property = "username")
})
List<User> findAll();
特殊情況:如果某列數據使用了兩次即以上,則兩次映射都要寫出來。
如:以下代碼將會獲取不到u_id
@Select("select * from account ")
@Results({
@Result(property = "user",column = "u_id", javaType = User.class,
one = @One(select = "com.itheima.dao.UserDao.findById", fetchType= FetchType.LAZY))
})
List<Account> findAll();
必須寫成這樣才能獲取到u_id
@Select("select * from account ")
@Results({
@Result(property = "u_id",column = "u_id"),
@Result(property = "user",column = "u_id", javaType = User.class,
one = @One(select = "com.itheima.dao.UserDao.findById", fetchType= FetchType.LAZY))
})
List<Account> findAll();
主鍵回顯
使用註解時
@SelectKey
保存後獲取主鍵:
keyProperty
主鍵的屬性名keyColumn
主鍵的列名resultType
主鍵的類型before=false
不是在添加之前,添加之後查詢statement
需要執行的sql語句
select last_insert_id()
最後一次執行添加生成的主鍵
/**
* 添加用戶
* @param user
*/
//保存後獲取主鍵,@SelectKey
//keyProperty主鍵的屬性名
//keyColumn主鍵的列名
//resultType主鍵的類型
//before=false 不是在添加之前,添加之後查詢
//statement 需要執行的sql語句
//select last_insert_id()最後一次執行添加生成的主鍵
@SelectKey(keyProperty = "id",keyColumn = "id",resultType = Integer.class,before = false,
statement = "select last_insert_id()")
@Insert("insert into user values(null,#{username},#{password},#{sex},#{address},#{birthday})")
void insert(User user);
使用xml時
<insert id="save" parameterType="com.itheima.domain.User">
<selectKey keyColumn="id" keyProperty="id" resultType="int" order="AFTER">
select last_insert_id()
</selectKey>
insert into user values(null,#{username},#{password},#{sex},#{address},#{birthday})
</insert>
這樣在數據表是自動增長的id時,保存數據之後可以回顯主鍵
@Test
public void test4(){
InputStream is = this.getClass().getClassLoader().getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserDao userDao = sqlSession.getMapper(UserDao.class);
User user = new User();
user.setUsername("小王2");
user.setSex("男");
user.setPassword("123");
user.setAddress("杭州");
user.setBirthday(new Date());
userDao.insert(user);//在數據庫中自動增長的id
System.out.println(user.getId());//16
sqlSession.commit();
sqlSession.close();
}
註解開發的一對一映射延遲加載
1、 pojo:User和Account
2、 AccountDao
注意:
one = @One(select = "", fetchType = "")
對應一個對象
select="namespace+id"
fetchType= FetchType.LAZY
延遲加載many
:對應多個對象
package com.itheima.dao;
import com.itheima.domain.Account;
import com.itheima.domain.User;
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 AccountDao {
/**
* one = @One(select = "", fetchType = "")對應一個對象
* select="namespace+id"
* fetchType= FetchType.LAZY 延遲加載
* many:對應多個對象
* 查詢全部賬戶(包含用戶信息)
* @return
*/
@Select("select * from account ")
@Results({
@Result(property = "user",column = "u_id", javaType = User.class,
one = @One(select = "com.itheima.dao.UserDao.findById", fetchType= FetchType.LAZY))
})
List<Account> findAll();
}
3、UserDao
package com.itheima.dao;
import com.itheima.domain.User;
import org.apache.ibatis.annotations.Select;
public interface UserDao {
/**
* 根據id查詢用戶
* @param id
* @return
*/
@Select("select * from user where id = #{id}")
User findById(Integer id);
}
註解開發的一對多映射延遲加載
1、 pojo:User和Account
2、UserDao
注意:javaType = List.class
可以省略
package com.itheima.dao;
import com.itheima.domain.Account;
import com.itheima.domain.User;
import org.apache.ibatis.annotations.Many;
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 UserDao {
/**
* 查詢所有用戶對象,包含所有賬戶信息
* @return
*/
@Select("select * from user")
@Results({
@Result(property = "id",column = "id"),
@Result(property = "accountList", column = "id", javaType = List.class,
many = @Many(select = "com.itheima.dao.AccountDao.findByUserId",fetchType = FetchType.LAZY))
})
List<User> findAll();
}
2、AccountDao
package com.itheima.dao;
import com.itheima.domain.Account;
import com.itheima.domain.User;
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 AccountDao {
/**
* 根據userId獲取賬戶信息
* @param uid
* @return
*/
@Select("select * from account where id = #{uid}")
List<Account> findByUserId(Integer uid);
}
註解開發的動態sql語句
@SelectProvider
:sql語句的提供者
type
:sql語句提供者的類的字節碼method
:提供者類中的方法
UserDao
package com.itheima.dao;
import com.itheima.domain.User;
import com.itheima.provider.UserSqlProvider;
import org.apache.ibatis.annotations.*;
import java.util.List;
public interface UserDao {
/**
* 根據姓名模糊查詢,性別等於查詢
* @SelectProvider:sql語句的提供者
* type:sql語句提供者的類的字節碼
* method:提供者類中的方法
* @return
*/
//@Select("select * from user where sex = #{sex} and username like \"%\"#{username}\"%\"")
@SelectProvider(type = UserSqlProvider.class,method = "findAll")
List<User> findByCondition(User user);
}
UserSqlProvider
package com.itheima.provider;
import com.itheima.domain.User;
/*
user sql語句的提供者
*/
public class UserSqlProvider {
public String findAll(User user){
StringBuilder sb = new StringBuilder();
sb.append("select * from user where 1=1 ");
if(user.getSex() != null){
sb.append(" and sex = #{sex} ");
}
if(user.getUsername() != null){
sb.append(" and username like \"%\"#{username}\"%\" ");
}
return sb.toString();
}
}
測試類
package com.itheima;
import com.itheima.dao.UserDao;
import com.itheima.domain.User;
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.InputStream;
import java.util.Date;
import java.util.List;
public class TestMyBatis {
@Test
public void test(){
InputStream is = this.getClass().getClassLoader().getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);
SqlSession sqlSession = sqlSessionFactory.openSession();
UserDao userDao = sqlSession.getMapper(UserDao.class);
User user = new User();
user.setUsername("明");
List<User> userList = userDao.findByCondition(user);
for (User u : userList) {
System.out.println(u);
}
sqlSession.close();
}
}