1. 程式人生 > >Mybatis_2.基於XML的增刪改查

Mybatis_2.基於XML的增刪改查

1.實體類User.java

    public class User {
         private int id;
         private String name;
         private int age;
         //getter、setter...
    }

2.對映檔案userMapper.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">
<mapper namespace="com.test.withXml.UserMapper">
	<!-- 自定義結果集 -->
	<resultMap type="com.test.bean.User" id="userMap">
		<id property="id" column="id" javaType="java.lang.Integer"/>
		<result property="name" column="name" javaType="java.lang.String"/>
		<result property="age" column="age" javaType="java.lang.Integer"/>		
	</resultMap>
	<!-- 增刪改查標籤的id屬性必須和介面中的方法名相同,
		id屬性值必須是唯一的,不能夠重複使用,
		parameterType屬性表示形參引數型別,
		resultType屬性表示查詢時返回的結果集型別 
	-->
	<!-- userGeneratedKeys(僅對insert有用),會告訴Mybatis使用JDBC的getGeneratedKeys方法來取出由MySQL內部生成的主鍵,
		預設值false。
		keyProperty(僅對insert有用)標記一個屬性,mybatis會通過getGeneratedKey或者通過insert語句的selectKey子元素設定值
		預設不設定。
	-->
	<insert id="addUser" useGeneratedKeys="true" keyProperty="id" parameterType="com.test.bean.User">
		insert into users (name,age) values (#{name},#{age})
	</insert>
	
	<delete id="deleteUser" parameterType="int">
		delete from users  where id = #{id}
	</delete>
	
	<update id="updateUser" parameterType="com.test.bean.User">
		update users set name=#{name},age=#{age} where id=#{id} 
	</update>
	
	<select id="queryUser" parameterType="int" resultType="com.test.bean.User" >
		select * from users where id = #{id}
	</select>
	
	<select id="queryAllUser" resultMap="userMap">
		select * from users
	</select>
	
	<select id="queryBuyName" parameterType="String" resultMap="userMap">
		select * from users where name like #{name}
	</select>	
	
</mapper>

3.全域性配置檔案mybatis.cfg.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="mysql.properties"></properties>
	<!-- 配置mybatis執行環境,development:開發模式,work:工作模式-->
	<environments default="development">
		<environment id="development">
			<!-- type=“jdbc”表示使用JDBC的提交和回滾來管理事務 -->
			<transactionManager type="JDBC" />
			<!-- mybatis提供了三種資料來源型別,POOLED,UNPOOLED,JNDI -->
			<!-- POOLED:表示支援JDBC資料來源的連線池 -->
			<!-- UNPOOLED:表示不支援JDBC資料來源的連線池 -->
			<!-- JNDI:表示支援外部資料來源連線池 -->
			<dataSource type="POOLED">
				<property name="driver" value="${jdbc.driver}" />
				<property name="url" value="${jdbc.url}" />
				<property name="username" value="${jdbc.username}" />
				<property name="password" value="${jdbc.password}" />
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<!-- 基於xml對映檔案的增刪改查,註冊對映檔案 -->
		<mapper resource="com/test/withXml/userMapper.xml"/>
	</mappers>
	<!-- 為實體類定義別名,簡化sql對映xml檔案中的引用 -->
	<!-- <typeAliases>
		<typeAlias type="com.test.bean.User" alias="_User"/>
	</typeAliases> -->
</configuration>

4.資料庫配置檔案mysql.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis1?useUincode=true&characterEncoding=UTF-8
jdbc.username=root
jdbc.password=root

5.測試類

/**
 * @author:滕鵬飛 
 * @version: 1.0
 * @Created on: 2018-9-2 下午8:32:54
 * 類說明:基於XML檔案
 */
public class Test {

	public static void main(String[] args) {
		//addUser();
		//delete();
		//update();
		//query();
		queryBuyName();
	}
	
	/**
	 * 新增資料
	 */
	public static void addUser(){
		SqlSession sqlSession = DBUtil.getSession();
		User user = new User("張三三", 21);
		sqlSession.insert("com.test.withXml.UserMapper.addUser",user);
		sqlSession.close();
	}
	
	/**
	 * 刪除資料
	 */
	public static void delete(){
		SqlSession sqlSession = DBUtil.getSession();
		sqlSession.delete("com.test.withXml.UserMapper.deleteUser","3");
		sqlSession.close();
	}
	
	/**
	 * 修改資料
	 */
	public static void update(){
		SqlSession sqlSession = DBUtil.getSession();
		User user = new User(5,"張三三", 21);
		sqlSession.update("com.test.withXml.UserMapper.updateUser", user);
		sqlSession.close();
	}
	
	/**
	 * 查詢資料
	 */
	public static void query(){
		SqlSession sqlSession = DBUtil.getSession();
		User user = sqlSession.selectOne("com.test.withXml.UserMapper.queryUser", 4);
		System.out.println(user);
	}
	
	/**
	 * 根據name進行模糊查詢
	 */
	public static void queryBuyName(){
		SqlSession sqlSession = DBUtil.getSession();
		List<User> user = sqlSession.selectList("com.test.withXml.UserMapper.queryBuyName", "%三%");
		System.out.println(user);
	}
}

注意:

1.若使用自定義結果集則使用結果集的屬性為resultMap,不是resultType,若使用全類名則使用resultType
2.入參:
  parameterType:可以是類,需要寫全類名,也可以是基本資料型別
  出參:
  自定義型別:resultMap
  指定型別:resultType
3.自動提交事務:
    1.sessionFactory.openSession(true);     
    2.session.commit();該方式增刪改都必須新增,查詢可以不用
4.若同時使用XML檔案對映SQL和對映檔案對應的介面,比如UserMapper.java和userMapper.xml,若在對映檔案中使用namespace屬性,則在配置檔案中就不需要在引入,否則需要同時引入介面類和對映檔案,namespace命名規範:對映檔案所在路徑+對映檔名。
5.表字段的名稱和類屬性的名稱不一致的情況
解決辦法一: 通過在查詢的sql語句中定義欄位名的別名,讓欄位名的別名和實體類的屬性名一致,這樣就可以表的欄位名和實體類的屬性名一一對應上了,這種方式是通過在sql語句中定義別名來解決欄位名和屬性名的對映關係的。
select t_id id, t_name name from teacher where t_id = #{id}     
解決辦法二: 通過<resultMap>來對映欄位名和實體類屬性名的一一對應關係。這種方式是使用MyBatis提供的解決方式來解決欄位名和屬性名的對映關係的。
<resultMap type="com.test.bean.User" id="userMap">
    <id property="id" column="id" javaType="java.lang.Integer"/>
    <result property="name" column="name" javaType="java.lang.String"/>
    <result property="age" column="age" javaType="java.lang.Integer"/>       
</resultMap>