Mybatis 第二天
原始dao開發方法
1。建立User實體類. 實現get和set方法
public class User {
//屬性名和資料庫表的欄位對應
private int id;
private String username;// 使用者姓名
private String sex;// 性別
private Date birthday;// 生日
private String address;// 地址
}
2.建立dao介面
/* * dao介面,使用者管理 */ public interface UserDao { //根據id查詢使用者資訊 public User findUserById(int id) throws Exception; //根據使用者名稱列查詢使用者列表 public List<User> findUserByName(String name) throws Exception; //新增使用者資訊 public void insertUser(User user) throws Exception; //刪除使用者資訊 public void deleteUser(int id) throws Exception; }
3.建立dao介面的實現類
public class UserDaoImpl implements UserDao { // 需要向dao實現類中注入SqlSessionFactory // 這裡通過構造方法注入 private SqlSessionFactory sqlSessionFactory; public UserDaoImpl(SqlSessionFactory sqlSessionFactory) { this.sqlSessionFactory = sqlSessionFactory; } @Override public User findUserById(int id) throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); User user = sqlSession.selectOne("test.findUserById", id); // 釋放資源 sqlSession.close(); return user; } @Override public List<User> findUserByName(String name) throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); List<User> list = sqlSession.selectList("test.findUserByName", name); // 釋放資源 sqlSession.close(); return list; } @Override public void insertUser(User user) throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); //執行插入操作 sqlSession.insert("test.insertUser", user); // 提交事務 sqlSession.commit(); // 釋放資源 sqlSession.close(); } @Override public void deleteUser(int id) throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); //執行插入操作 sqlSession.delete("test.deleteUser", id); // 提交事務 sqlSession.commit(); // 釋放資源 sqlSession.close(); }
4.建立一個User.xml 裡面寫對映語句
<?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"> <!-- namespace 名稱空間,作用就是對sql進行分類華管理 注意:使用mapper代理方法開發,namespace有特殊重要的作用 --> <mapper namespace="test"> <!-- 在對映檔案中配置很多sql語句 --> <!-- 需求:通過id查詢使用者表的記錄 #{}表示一個佔位符 parameterType指定輸入引數的型別 #{id} 其中的id表示輸入輸出引數,引數名稱就是id, --> <select id="findUserById" parameterType="int" resultType="com.dc.mybatis.po.User"> select *from user where id=#{id} </select> <select id="findUserByName" parameterType="java.lang.String" resultType="cn.itcast.mybatis.po.User"> SELECT * FROM USER WHERE username LIKE '%${value}%' </select> <insert id="insertUser" parameterType="cn.itcast.mybatis.po.User"> <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer"> SELECT LAST_INSERT_ID() </selectKey> insert into user(username,birthday,sex,address) value(#{username},#{birthday},#{sex},#{address}) </insert> <!-- 刪除 使用者 根據id刪除使用者,需要輸入 id值 --> <delete id="deleteUser" parameterType="java.lang.Integer"> delete from user where id=#{id} </delete> <update id="updateUser" parameterType="cn.itcast.mybatis.po.User"> update user set username=#{username},birthday=#{birthday},sex=#{sex},address=#{address} where id=#{id} </update> </mapper>
5.建立一個SqlMapConfig.xml 必須載入User.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>
<!-- 和spring整合後 environments配置將廢除-->
<environments default="development">
<environment id="development">
<!-- 使用jdbc事務管理-->
<transactionManager type="JDBC" />
<!-- 資料庫連線池-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/mybatis" />
<property name="username" value="root"/>
<property name="password" value="root" />
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="sqlmap/User.xml"></mapper>
</mappers>
</configuration>
6.建立測試類,來測試程式
public class UserDaoImplTest {
private SqlSessionFactory sqlSessionFactory;
//此方法時在執行testFindUserById之前執行的
@Before
public void setUp() throws Exception{
//建立sqlSessionFactory
// mybatis配置檔案
String resource = "SqlMapConfig.xml";
// 得到配置檔案流
InputStream inputStream = Resources.getResourceAsStream(resource);
// 建立會話工廠,傳入mybatis的配置檔案資訊
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
@Test
public void testFindUserById() throws Exception {
//建立UserDao的物件
UserDao userDao=new UserDaoImpl(sqlSessionFactory);
User user=userDao.findUserById(10);
System.out.println(user);
}
}
mapper代理開發
開發規範:
1、在mapper.xml中namespace等於mapper介面地址
2、mapper.java介面中的方法名和mapper.xml中statement的id一致
3、mapper.java介面中的方法輸入引數型別和mapper.xml中statement的parameterType指定的型別一致。
4、mapper.java介面中的方法返回值型別和mapper.xml中statement的resultType指定的型別一致。
Mapper代理的實現
1.mapper.java
2.mapper.xml
3.在SqlMapConfig.xml中載入mapper.xml
4.測試
Mybatis的全域性配置檔案:SqlMapConfig.xml
properties(屬性)
settings(全域性配置引數)
typeAliases(類型別名)
typeHandlers(型別處理器)
objectFactory(物件工廠)
plugins(外掛)
environments(環境集合屬性物件)
environment(環境子屬性物件)
transactionManager(事務管理)
dataSource(資料來源)
mappers(對映器)
properties:
將資料庫連線引數單獨配置在db.properties中,只需要在SqlMapConfig.xml中載入db.properties的屬性值。
typeAliases(類型別名)
mybatis預設支援別名
別名 對映的型別
_byte byte
_long long
_short short
_int int
_integer int
_double double
_float float
_boolean boolean
string String
byte Byte
long Long
short Short
int Integer
integer Integer
double Double
float Float
boolean Boolean
date Date
decimal BigDecimal
bigdecimal BigDecimal
單個別名定義
<!-- 單個別名定義 -->
<typeAliases>
<!-- 針對單個別名定義
type:型別的路徑
alias:別名
-->
<typeAlias type="com.dc.mybatis.po.User" alias="User" />
</typeAliases>
多個別名定義(常用)
<!-- 多個別名定義 -->
<typeAliases>
<!-- 針對單個別名定義
type:型別的路徑
alias:別名
-->
<package name="com.dc.mybatis.po" />
</typeAliases>
typeHandlers(型別處理器)
一般我們都不需要去指定,因為他裡面有預設的
**mappers(對映器) **
1.載入單個對映檔案
2.載入多個對映檔案 (常用)
輸入對映parameterType
通過parameterType指定輸入引數的型別,型別可以是簡單型別、hashmap、pojo的包裝型別
傳遞自定義的pojo的包裝型別
1.新建一個UserCustom類繼承User
//使用者的擴充套件類
public class UserCustom extends User{
//可以擴充套件使用者的資訊
}
2.建立包裝型別pojo
//包裝型別
public class UserQueryVo{
//使用者查詢條件
private UserCustom userCustom;
public UserCustom getUserCustom() {
return userCustom;
}
public void setUserCustom(UserCustom userCustom) {
this.userCustom = userCustom;
}
}
3.在UserMapper.xml中定義使用者資訊綜合查詢
4.建立UserMapper介面
public iinterface UserMapper{
public List<UserCustom> findUserList(UserQueryVo userQueryVo) throws Exception
}
5.測試程式碼
輸出對映
resultType
使用resultType進行輸出對映時,只有資料庫中的列和pojo類中的屬性名一致,才可以對映成功
1.輸出簡單型別 mapper.xml
需求:檢視使用者資訊列表總數
2.mapper.java
3.測試程式碼
輸出pojo物件和pojo列表
不管是輸出的pojo單個物件還是一個列表(list中包括pojo),在mapper.xml中resultType指定的型別是一樣的。
在mapper.java指定的方法返回值型別不一樣:
1、輸出單個pojo物件,方法返回值是單個物件型別
2、輸出pojo物件list,方法返回值是List<Pojo>
resultMape