學習過的持久層框架:DBUtils , Hibernatejava
Mybatis就是相似於hibernate的orm持久層框架。mysql
爲何學Mybatis?sql
MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由apache software foundation 遷移到了google code,而且更名爲MyBatis 。2013年11月遷移到Github。數據庫
Mybatis是面向sql的持久層框架,他封裝了jdbc訪問數據庫的過程,咱們開發,只需專一於sql語句自己的拼裝,其它複雜的過程所有能夠交給mybatis去完成。apache
根據用戶ID查詢用戶信息編程
根據用戶名查找用戶列表緩存
添加用戶mybatis
修改用戶架構
刪除用戶app
<!-- id:statementId
resultType:查詢結果集的數據類型
parameterType:查詢的入參
-->
<select id="getUserById" parameterType="int" resultType="com.itheima.mybatis.pojo.User" >
SELECT * FROM USER WHERE id = #{id1}
</select>
@Test
public void testGetUserByid() throws IOException {
// 建立SqlSessionFactoryBuilder對象
SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder();
// 查找配置文件建立輸入流
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
// 加載配置文件,建立SqlSessionFactory對象
SqlSessionFactory sqlSessionFactory = sfb.build(inputStream);
// 建立SqlSession對象
SqlSession sqlSession = sqlSessionFactory.openSession();
// 執行查詢,參數一:要查詢的statementId ,參數二:sql語句入參
User user = sqlSession.selectOne("user.getUserById", 1);
// 輸出查詢結果
System.out.println(user);
// 釋放資源
sqlSession.close();
}
/**
* SqlSessionFactory工具類
*
* @author Steven
*
*/
public class SqlSessionFactoryUtils {
/**
* 單例SqlSessionFactory
*/
private static SqlSessionFactory sqlSessionFactory;
static {
// 建立SqlSessionFactoryBuilder對象
SqlSessionFactoryBuilder sfb = new SqlSessionFactoryBuilder();
try {
// 查找配置文件建立輸入流
InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml");
// 加載配置文件,建立SqlSessionFactory對象
sqlSessionFactory = sfb.build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 獲取單例SqlSessionFactory
* @return
*/
public static SqlSessionFactory getSqlSessionFactory() {
return sqlSessionFactory;
}
}
<!-- resultType:若是要返回數據集合,只需設定爲每個元素的數據類型 -->
<select id="getUserByName" parameterType="string" resultType="com.itheima.mybatis.pojo.User">
<!-- SELECT * FROM USER WHERE username LIKE #{name} -->
SELECT * FROM USER WHERE username LIKE '%${value}%'
</select>
@Test
public void getUserByName() {
SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
//List<User> users = sqlSession.selectList("user.getUserByName", "%張%");
List<User> users = sqlSession.selectList("user.getUserByName", "張");
for (User user : users) {
System.out.println(user);
}
// 釋放資源
sqlSession.close();
}
<insert id="insertUser" parameterType="com.itheima.mybatis.pojo.User">
INSERT INTO USER
(`username`,
`birthday`,
`sex`,
`address`)
VALUES (#{username},
#{birthday},
#{sex},
#{address});
</insert>
@Test
public void testInsertUser() throws IOException {
// 建立SqlSession對象
SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
User user = new User();
user.setUsername("張飛");
user.setAddress("深圳市黑馬");
user.setBirthday(new Date());
user.setSex("1");
// 執行插入
sqlSession.insert("user.insertUser", user);
// 提交事務
sqlSession.commit();
// 釋放資源
sqlSession.close();
}
<!-- useGeneratedKeys:標識插入使用自增id
keyProperty:與useGeneratedKeys配套使用,用於綁定主鍵接收的pojo屬性
-->
<insert id="insertUserKey" parameterType="com.itheima.mybatis.pojo.User" useGeneratedKeys="true" keyProperty="id">
<!-- selectKey:用於配置主鍵返回
keyProperty:要綁定的pojo屬性
resultType:屬性數據類型
order:指定何時執行,AFTER以後
-->
<!-- <selectKey keyProperty="id" resultType="int" order="AFTER">
SELECT LAST_INSERT_ID()
</selectKey> -->
INSERT INTO USER
(`username`,
`birthday`,
`sex`,
`address`,
`uuid2`)
VALUES (#{username},
#{birthday},
#{sex},
#{address},
#{uuid2});
</insert>
注:在使用uuid以前數據庫user表要先加上uuid2字段、user的pojo也要加上相應屬性
<!-- useGeneratedKeys:標識插入使用自增id
keyProperty:與useGeneratedKeys配套使用,用於綁定主鍵接收的pojo屬性
-->
<insert id="insertUserUUID" parameterType="com.itheima.mybatis.pojo.User">
<!-- selectKey:用於配置主鍵返回
keyProperty:要綁定的pojo屬性
resultType:屬性數據類型
order:指定何時執行,BEFORE以前
-->
<selectKey keyProperty="uuid2" resultType="string" order="BEFORE">
SELECT UUID()
</selectKey>
INSERT INTO USER
(`username`,
`birthday`,
`sex`,
`address`,
`uuid2`)
VALUES (#{username},
#{birthday},
#{sex},
#{address},
#{uuid2});
</insert>
<update id="updateUser" parameterType="com.itheima.mybatis.pojo.User">
UPDATE USER SET username = #{username} WHERE id = #{id}
</update>
<delete id="deleteUser" parameterType="int">
DELETE FROM `user` WHERE `id` = #{id1}
</delete>
根據用戶ID查詢用戶信息
根據用戶名查找用戶列表
添加用戶
public interface UserDao {
/**根據用戶ID查詢用戶信息
* @param id
* @return
*/
User getUserById(Integer id);
/**
* 根據用戶名查找用戶列表
* @param name
* @return
*/
List<User> getUserByUserName(String name);
/**
* 添加用戶
* @param user
*/
void insertUser(User user);
}
public class UserDaoImpl implements UserDao {
@Override
public User getUserById(Integer id) {
SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
User user = sqlSession.selectOne("user.getUserById", id);
sqlSession.close();
return user;
}
@Override
public List<User> getUserByUserName(String name) {
SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
List<User> list = sqlSession.selectList("user.getUserByName", name);
sqlSession.close();
return list;
}
@Override
public void insertUser(User user) {
SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
sqlSession.insert("user.insertUser", user);
sqlSession.commit();
sqlSession.close();
}
}
public class UserDaoTest {
@Test
public void testGetUserById() {
UserDao userDao = new UserDaoImpl();
User user = userDao.getUserById(30);
System.out.println(user);
}
@Test
public void testGetUserByUserName() {
UserDao userDao = new UserDaoImpl();
List<User> list = userDao.getUserByUserName("張");
for (User user : list) {
System.out.println(user);
}
}
@Test
public void testInsertUser() {
UserDao userDao = new UserDaoImpl();
User user = new User();
user.setUsername("張飛3");
user.setAddress("深圳市黑馬");
user.setBirthday(new Date());
user.setSex("1");
userDao.insertUser(user);
}
}
public class UserMapperTest {
@Test
public void testGetUserById() {
// 加載配置獲得SqlSession
SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
// 獲取代理對象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 查詢數據
User user = userMapper.getUserById(30);
System.out.println(user);
// 關閉資源
sqlSession.close();
}
@Test
public void testGetUserByUserName() {
SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
// 獲取代理對象
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
// 查詢數據
List<User> list = userMapper.getUserByName("張");
for (User user : list) {
System.out.println(user);
}
// 關閉資源
sqlSession.close();
}
@Test
public void testInsertUser() {
SqlSession sqlSession = SqlSessionFactoryUtils.getSqlSessionFactory().openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = new User();
user.setUsername("張飛飛");
user.setAddress("深圳市黑馬");
user.setBirthday(new Date());
user.setSex("1");
userMapper.insertUser(user);
// 提交事務
sqlSession.commit();
// 關閉資源
sqlSession.close();
}
}
<!-- 加載規則,首先加載標籤內部屬性,再加載外部文件,名稱相同時,會替換相同名稱的內容 -->
<properties resource="jdbc.properties">
<property name="jdbc.username" value="root1"/>
<property name="jdbc.password" value="root"/>
</properties>
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8
jdbc.username=root
jdbc.password=root
mybatis默認支持java基本數據類型的別名識別詳細參考教案。
自定義別名
<typeAliases>
<!-- 單個別名定義 -->
<!-- <typeAlias type="com.itheima.mybatis.pojo.User" alias="user"/> -->
<!-- 別名包掃描器(推薦使用此方式),整個包下的類都被定義別名,別名爲類名,不區分大小寫-->
<package name="com.itheima.mybatis.pojo"/>
</typeAliases>
<mappers>
<!-- 第一種方式,加載 resource-->
<mapper resource="mapper/user.xml"/>
<!-- <mapper resource="mapper/UserMapper.xml"/> -->
<!-- 第二種方式,class掃描器要求:
一、映射文件與接口同一目錄下
二、映射文件名必需與接口文件名稱一致
-->
<!-- <mapper class="com.itheima.mybatis.mapper.UserMapper"/> -->
<!-- 第三種方式,包掃描器要求(推薦使用此方式):
一、映射文件與接口同一目錄下
二、映射文件名必需與接口文件名稱一致
-->
<package name="com.itheima.mybatis.mapper"/>
</mappers>