1. 映射文件
- 映射文件命名:User.xml
- mapper代理開發(fā)映射文件名:XXXMapper.xml (UserMapper.xml狈涮、ItemsMapper.xml)
- 在映射文件中配置sql語句瓷胧。
2. 映射文件具體配置
- 我們需要將查詢得到的結(jié)果映射為一個對象,創(chuàng)建一個包(com.chinglee.mybatis.pojo)里面存放所有的對象類型蹄衷。
- 在pojo包中創(chuàng)建User類對應(yīng)User表
package com.chinglee.mybatis.pojo;
import java.util.Date;
/**
* Created by Administrator on 2017/10/18 0018.
*/
public class User {
private int id;
private String username;
private Date birthday;
private String sex;
private String address;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
}
- 在sqlmap中創(chuàng)建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進(jìn)行分類化管理暑刃,理解sql隔離
注:使用mapper代理方法開發(fā)慎颗,namespace有特殊作用
-->
<mapper namespace="user">
<!--映射文件中配置很多的sql語句-->
<!--需求:通過id查詢用戶表的記錄-->
<!--通過select執(zhí)行數(shù)據(jù)庫查詢
id:標(biāo)識映射文件的sql
parameterType:指定輸入?yún)?shù)類型悲酷,這里輸入的id是int型
#{}表示占位符
#{id}其中的id表示接收輸入的參數(shù),參數(shù)名稱就是id
resultType:指定查詢結(jié)果映射的java對象類型疮胖,這里是單條對象
-->
<select id="findUserById" parameterType="int" resultType="com.chinglee.mybatis.pojo.User">
SELECT * FROM user WHERE id=#{id}
</select>
</mapper>
- 在SqlMapConfig.xml中加載映射文件
<!--加載映射文件-->
<mappers>
<mapper resource="sqlmap/User.xml"/>
</mappers>
3. 根據(jù)id查詢用戶代碼實現(xiàn)
package com.chinglee.mybatis.first;
import com.chinglee.mybatis.pojo.User;
import org.apache.ibatis.io.Resources;
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.IOException;
import java.io.InputStream;
/**
* Created by Administrator on 2017/10/19 0019.
*/
public class MybatisFirst {
//根據(jù)id查詢用戶信息摄职,得到一條記錄結(jié)果
@Test
public void findUerByIdTest() throws IOException {
//mybatis配置文件
String resource="SqlMapConfig.xml";
InputStream inputStream=Resources.getResourceAsStream(resource);
//創(chuàng)建會話工廠
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//通過會化工廠得到sqlSession
SqlSession sqlSession=sqlSessionFactory.openSession();
//通過sqlSession操作數(shù)據(jù)庫
//第一個參數(shù):映射文件中statement的id,等于namespace+"."+statement的id
//第二個參數(shù):指定和映射文件中所匹配的parameterType類型的參數(shù)
//sqlSession.selectOne()結(jié)果就是與映射文件中所匹配的resultType類型的對象
User user=sqlSession.selectOne("user.findUserById",1);
System.out.println(user);
//釋放資源
sqlSession.close();
}
}
4. 根據(jù)用戶名模糊查詢
- 在User.xml中添加查詢
<!--根據(jù)用戶名查詢信息
resultType:指定的單條記錄所映射的java對象類型
${}:表示拼接sql串获列,將接收到的參數(shù)不加任何修飾拼接在sql中谷市。
使用${}拼接sql,引起sql注入
${value}:接受輸入?yún)?shù)的內(nèi)容击孩,如果傳入類型是簡單類型迫悠,${}中只能使用value
-->
<select id="findUserByName" parameterType="java.lang.String" resultType="com.chinglee.mybatis.pojo.User">
SELECT * FROM user WHERE username LIKE '%${value}%'
</select>
- 在MybatatisFirst.java類中添加方法
//根據(jù)用戶名稱模糊查詢用戶列表
@Test
public void findUserByNameTest() throws IOException {
//獲取mybatis配置文件
String resource="SqlMapConfig.xml";
InputStream inputStream=Resources.getResourceAsStream(resource);
//創(chuàng)建會話工廠
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//通過會話工廠得到會話sqlsession
SqlSession sqlSession=sqlSessionFactory.openSession();
List<User> list=sqlSession.selectList("user.findUserByName","小明");
System.out.println(list);
sqlSession.close();
}
5. 添加用戶
- 自增主鍵返回
User.xml添加statement
<!--
parameterType:指定輸入?yún)?shù)類型是pojo
#{}中指定pojo的屬性名,接收到pojo對象的屬性值巩梢,mybatis通過OGNL獲取對象的屬性值
-->
<insert id="insertUser" parameterType="com.chinglee.mybatis.pojo.User">
<!--
將插入數(shù)據(jù)的主鍵返回创泄,返回到user對象中
SELECT LAST_INSERT_ID():得到剛insert進(jìn)去記錄的主鍵值,
只適用于自增主鍵
keyProperty:將查詢到主鍵值設(shè)置到parameterType指定的對象的
哪個屬性
order: SELECT LAST_INSERT_ID()相對于INSERT INTO user的執(zhí)行順序
指定結(jié)果類型 resultType="java.lang.Integer"
-->
<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>
在MybatisFirst類中加入addUserTest方法
//添加用戶信息
@Test
public void addUserTest() throws IOException {
//獲取mybatis配置文件
String resource="SqlMapConfig.xml";
InputStream inputStream=Resources.getResourceAsStream(resource);
//創(chuàng)建會話工廠
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
//通過會話工廠得到會話sqlsession
SqlSession sqlSession=sqlSessionFactory.openSession();
//插入用戶對象
User user=new User();
user.setUsername("王小軍");
user.setBirthday(new Date());
user.setSex("1");
user.setAddress("河南鄭州");
sqlSession.insert("user.insertUser",user);
//提交事務(wù)
sqlSession.commit();
System.out.println(user.getId());
//關(guān)閉會話
sqlSession.close();
}
- 非自增主鍵返回(使用uuid)
使用mysql的uuid()函數(shù)生成主鍵括蝠,需要修改id字段類型為String鞠抑,長度設(shè)置為35
<!--非自增主鍵
使用musql的uuid生成主鍵
執(zhí)行過程:
首先通過uuid()得到主鍵,將主鍵設(shè)置到user對象的id屬性中
其次在insert執(zhí)行時忌警,從user對象中取出id屬性值
<selectKey keyProperty="id" order="BEFORE" resultType="java.lang.String">
SELECT uuid()
</selectKey>
INSERT INTO user(id,username,birthday,sex,address) VALUE (#{id},#{username},#{birthday},#{sex},#{address})
-->
6. 刪除用戶
- 映射文件User.xml
<!--delete刪除用戶搁拙,根據(jù)id刪除用戶,需要輸入id值-->
<delete id="deleteUser" parameterType="java.lang.Integer">
DELETE FROM user WHERE id=#{id};
</delete>
- 測試類MybatisFirst.java
@Test
public void deleteUserTest() throws IOException {
String resource="SqlMapConfig.xml";
InputStream inputStream=Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession=sqlSessionFactory.openSession();
sqlSession.delete("user.deleteUser",28);
//提交事務(wù)
sqlSession.commit();
//關(guān)閉會話
sqlSession.close();
}
7. 更新用戶
- 映射文件User.xml
<!--更新用戶法绵,傳入id箕速,傳入用戶的更新信息,parameterType指定user對象朋譬,注意id必須存在
#{id}表示更新user的id值
-->
<update id="updateUser" parameterType="com.chinglee.mybatis.pojo.User">
UPDATE user SET username=#{username},birthday=#{birthday},sex=#{sex},address=#{address}WHERE id=#{id}
</update>
- java類
@Test
public void updateUserTest() throws IOException {
String resouce="SqlMapConfig.xml";
InputStream inputStream=Resources.getResourceAsStream(resouce);
SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession=sqlSessionFactory.openSession();
User user=new User();
user.setId(29);
user.setUsername("王大軍");
user.setBirthday(new Date());
user.setSex("1");
user.setAddress("河南鄭州");
sqlSession.update("user.updateUser", user );
//提交事務(wù)
sqlSession.commit();
//關(guān)閉會話
sqlSession.close();
}
8. 入門總結(jié)
parameterType:指定輸入?yún)?shù)類型
resultType:指定查詢結(jié)果映射的java對象類型
-
.#{}表示一個占位符盐茎,接收輸入?yún)?shù),類型可以是簡單類型徙赢,pojo字柠、hashmap。
- 如果接收簡單類型狡赐,#{}中可以寫成value或其他名稱窑业。
- .#{}接收pojo對象值,通過UGNL讀取對象中的屬性值阴汇。
-
${}表示一個拼接符號数冬,會引用sql注入节槐,所以不建議使用${}搀庶。
- ${}接收輸入?yún)?shù)拐纱,類型可以是簡單類型,pojo哥倔,hashmap秸架。
- 如果接收簡單類型,${}中只能寫成value
selectOne表示查詢出的一條記錄咆蒿。如果使用selectone可以實現(xiàn)东抹,使用selectList也可以實現(xiàn)。
selectList查詢一個列表(多條記錄)進(jìn)行映射