一、Mybatis(ibatis)是什麼
MyBatis 是支持普通SQL 查詢,存儲過程和高級映射的優秀持久層(dao)框架。MyBatis 消除了幾乎所有的JDBC 代碼和參數的手工設置以及對結果集的檢索。MyBatis 可以使用簡單的XML 或註解用於配置和原始映射,將接口和Java 的POJO(Plain Old Java Objects,普通的Java 對象)映射成數據庫中的記錄。
半orm(對象關係映射)框架:
把實體類和數據庫的記錄做映射
比如:數據庫
Id name age
1 zhangsan 18
映射爲對象:Student s = new Student(1,”zhangsan”,18);
或者把對象映射爲數據庫的一條記錄。
二、環境搭建
mybatis的配置文件
<?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>
<environments default="development">
<environment id="development">
<!-- 使用jdbc方式控制事務 -->
<transactionManager type="JDBC"/>
<!-- mybatis提供的連接池鏈接數據
未來:mybatis+spring+sprignmvc 這一步交給spring
-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mydb?unicode=true&characterEncoding=utf-8"/>
<property name="username" value="root"/>
<property name="password" value="111111"/>
</dataSource>
</environment>
</environments>
<!-- 指定映射文件 -->
<mappers>
<mapper resource="com/tf/domain/UsersMapper.xml"></mapper>
</mappers>
</configuration>
編寫映射文件 resultType:指定sql語句的結果集 (每一行對應的結果)
<?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.tf.domain.Users">
<!-- 根據selectById名查詢用戶 -->
<select id="selectById" parameterType="int" resultType="com.tf.domain.Users">
select * from users where id=#{id}
</select>
<!-- 全查 resultType:指定sql語句的結果集 (每一行對應的結果) -->
<select id="findAll" resultType="com.tf.domain.Users">
select * from users
</select>
<insert id="saveUsers" parameterType="com.tf.domain.Users">
insert into users(name,password,status,createDate)
values(#{name},#{password},#{status},#{createDate})
</insert>
<delete id="deleteUser" parameterType="int">
delete from user where id=#{id}
</delete>
<update id="updateUser" parameterType="com.tf.domain.Users">
update users set name=#{name},password=#{password},status=#{status},createDate=#{createDate}
where id=#{id}
</update>
</mapper>
實體類與數據庫的字段一致:
測試類:
public class Test {
public static void main(String[] args) {
//指定配置文件
String config="mybatisConfig.xml";
//2、讀取mybatis的映射文件
try {
Reader reader = Resources.getResourceAsReader(config);
//3、構建sqlSessionFacotry對象
SqlSessionFactory sqlSessionFactory =new SqlSessionFactoryBuilder().build(reader);
//通過sqlSessionFactory 獲取sqlSession
SqlSession sqlSession= sqlSessionFactory.openSession();
//5、通過sqlSession調用映射文件中的sql語句
//根據映射文件的id,查找
Users u = sqlSession.selectOne("selectById",1);
System.out.println(u);
System.out.println("-----------------------");
List<Users> list = sqlSession.selectList("findAll");
for (Users users : list) {
System.out.println(users);
}
System.out.println("-----------------------");
Users u1 = new Users();
u1.setName("美麗");
u1.setPassword("admin");
u1.setStatus(1);
u1.setCreateDate(Date.valueOf("2012-2-1"));
System.out.println( sqlSession.insert("saveUsers",u1)>0?"新增成功":"新增失敗");
System.out.println( sqlSession.delete("deleteUser",1)>0?"刪除成功":"刪除失敗");
System.out.println("-----------------------");
u1.setId(2);
System.out.println( sqlSession.update("updateUser",u1)>0?"修改成功":"修改失敗");
sqlSession.commit();
sqlSession.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
三、新增時返回主鍵
方法一: 使用selectKey節點配置
配置返回自增主鍵 把主鍵封裝到參數的id字段
keyProperty:實體類中主鍵的屬性名
keyColumn:數據庫中主鍵的列名
order:執行該語句的時機
resultType:該sql語句的返回值類型
<!-- 新增+返回自增主鍵 -->
<insert id="saveUsersAndRuturnId" parameterType="com.tf.domain.Users">
<selectKey keyProperty="id" keyColumn="id" order="AFTER" resultType="int">
select last_insert_id()
</selectKey>
insert into users(name,password,status,createDate)
values(#{name},#{password},#{status},#{createDate})
</insert>
測試:
System.out.println("新增前id "+u1.getId());
sqlSession.insert("saveUsersAndRuturnId" ,u1);
System.out.println("新增後id "+u1.getId());
方法二:useGeneratedKeys="true"
<insert id="saveUsersAndRuturnId" parameterType="com.tf.domain.Users" useGeneratedKeys="true" keyProperty="id" keyColumn="id">
insert into users(name,password,status,createDate)
values(#{name},#{password},#{status},#{createDate})
</insert>
四、主鍵返回值UUID
當主鍵id爲String時,可以使用UUID,來生成唯一的id
<insert id="saveUsersAndRuturnId" parameterType="com.tf.domain.Users1">
<selectKey keyColumn="id" keyProperty="id" resultType="String" order="BEFORE">
select UUID()
</selectKey>
insert into users1(id,name,password,status,createDate)
values(#{id},#{name},#{password},#{status},#{createDate})
</insert>