1. 程式人生 > >Mybatis 第二天

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的屬性值。
建立一個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