1. 有了hibernate為什么要使用mybatis
Hibernate: 是一個(gè)標(biāo)準(zhǔn)的 ORM 框架(對(duì)象關(guān)系映射)。學(xué)習(xí)成本較高充石,不需要編寫sql語句颈畸,SQL語句自動(dòng)生成咐旧。對(duì)于sql語句的優(yōu)化蝶涩,修改比較困難理朋。
應(yīng)用場(chǎng)景:
適合用于sql語句簡(jiǎn)單的絮识,效率要求不是特別高的項(xiàng)目。
Mybatis: 專注于sql語句嗽上,對(duì)象映射和輸入輸出次舌,都由框架幫你完成,所以屬于半 ORM系統(tǒng)兽愤,
適用場(chǎng)景:
sql語句邏輯復(fù)雜彼念,效率要求特別高的應(yīng)用。
2. mybatis結(jié)構(gòu)圖
Snip20180910_14.png
3. helloMybatis
3.1下載mybatis包
https://github.com/mybatis/mybatis-3/releases
然后導(dǎo)包
3.2書寫pojo的User
User
/**
*
*/
private static final long serialVersionUID = 1L;
private Integer id;
private String username;// 用戶姓名
private String sex;// 性別
private String address;// 地址
@Override
public String toString() {
return "User{" +
"id=" + id +
", username='" + username + '\'' +
", sex='" + sex + '\'' +
", address='" + address + '\'' +
'}';
}
public static long getSerialVersionUID() {
return serialVersionUID;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
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;
}
}
3.3 書寫mapper接口烹看,接口方法需要遵循四個(gè)原則
public interface UserMapper {
//遵循四個(gè)原則
//1.接口 方法名 == User.xml 中 id 名
//2.返回值類型 與 Mapper.xml文件中返回值類型要一致
//3.方法的入?yún)㈩愋?與Mapper.xml中入?yún)⒌念愋鸵恢? //4.命名空間 綁定此接口
public User findUserById(Integer id);
public User findUserByUsername(String username);
public Integer insertUser(User user);
public void updateUser(User user);
public void deleteUserById(int i);
}
3.4 書寫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="mapper.UserMapper">
<!-- 通過ID查詢一個(gè)用戶 -->
<select id="findUserById" parameterType="Integer" resultType="pojo.User">
select * from user where id = #{v};
</select>
<!-- //根據(jù)用戶名稱模糊查詢用戶列表
#{} select * from user where id = 国拇? 占位符 ? == '五'
${} select * from user where username like '%五%' 字符串拼接
-->
<select id="findUserByUsername" parameterType="String" resultType="pojo.User">
select * from user WHERE username LIKE "%"#{v}"%";
</select>
<insert id="insertUser" parameterType="pojo.User">
// 返回插入數(shù)據(jù)的id
<selectKey keyProperty="id" resultType="Integer" order="AFTER">
SELECT LAST_INSERT_ID();
</selectKey>
INSERT INTO user (username, address, sex) VALUES (#{username}, #{address}, #{sex});
</insert>
<update id="updateUser" parameterType="pojo.User">
UPDATE user
SET username = #{username}, address = #{address}, sex = #{sex} WHERE id = #{id};
</update>
<delete id="deleteUserById" parameterType="Integer">
DELETE FROM user WHERE id = #{id}
</delete>
</mapper>
3.5 測(cè)試UserMapperTest
public class UserMapperTest {
@Test
public void findUserById() throws IOException {
//加載核心配置文件
String resource = "sqlMapConfig.xml";
InputStream in = Resources.getResourceAsStream(resource);
//創(chuàng)建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//創(chuàng)建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.findUserById(1);
System.out.println(user);
}
@Test
public void testFindUserByUsername() throws IOException {
//加載核心配置文件
String resource = "sqlMapConfig.xml";
InputStream in = Resources.getResourceAsStream(resource);
//創(chuàng)建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//創(chuàng)建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
System.out.println(userMapper.findUserByUsername("張污"));
}
@Test
public void insertUser() throws IOException {
//加載核心配置文件
String resource = "sqlMapConfig.xml";
InputStream in = Resources.getResourceAsStream(resource);
//創(chuàng)建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//創(chuàng)建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = new User();
user.setUsername("阿珍");
user.setAddress("北京");
user.setSex("男");
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
userMapper.insertUser(user);
sqlSession.commit();
// 用戶保存好之后洛史,獲取到用戶的id進(jìn)行其他的后續(xù)操作
System.out.println(user.getId());
}
@Test
public void updateUserById() throws IOException {
//加載核心配置文件
String resource = "sqlMapConfig.xml";
InputStream in = Resources.getResourceAsStream(resource);
//創(chuàng)建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//創(chuàng)建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
User user = new User();
user.setId(1);
user.setUsername("張三");
user.setAddress("北京33");
user.setSex("男33");
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
userMapper.updateUser(user);
sqlSession.commit();
}
@Test
public void deleteUserById() throws IOException {
//加載核心配置文件
String resource = "sqlMapConfig.xml";
InputStream in = Resources.getResourceAsStream(resource);
//創(chuàng)建SqlSessionFactory
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
//創(chuàng)建SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
userMapper.deleteUserById(3);
sqlSession.commit();
}
}
4.問題
4.1 關(guān)于模糊查詢時(shí)惯殊,中文查不到結(jié)果的問題
要將數(shù)據(jù)庫設(shè)置成UTF-8的編碼
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://123.206.7.239/xiaobang?characterEncoding=UTF-8" />