mybatis呢是一個orm數據庫框架,非常適合新人學,門檻相對較低
本人呢曾經是先做的hibernate,後接觸的mybatis,接觸mabatis前我比較抵觸,為啥呢,
當時喜歡hibernate的POJO,直接注解實體映射數據庫表對象,要增刪改造直接get(id),save(entity),delete(entity),update(entity),顯得非常方便;
而且又支持hql的查詢
但是,久而久之,很多數據庫性能方面的問題會暴露出來,你必須直接優化sql語句,那麼hibernate的弊端就出現了
雖然mybatis需要手寫sql語句,其實也挺不錯,字段映射就OK了,多寫寫sql也是有好處滴
那有的人會問了,什麼時候用hibernate,什麼時候用mybatis呢?
回答曰:看項目呗,如果項目挺大,那就是mybatis,如果項目相對較小,是個後台管理系統,對數據的查詢量不是特別多,那就用hibernate呗
或者干脆每個項目都用mybatis都行啊~!
除此之外,也有部分企業使用的自己開發的orm框架,連數據源都是自己的,那這樣當然最好
好吧,廢話有點多,咱寫代碼的還是直接貼碼吧:
(頭幾篇博文不會使用maven,後面的ssm整合會使用maven來進行管理)
工程結構:

asm-3.3.1.jar
cglib-2.2.2.jar
commons-logging-1.1.1.jar
javassist-3.17.1-GA.jar
log4j-1.2.17.jar
log4j-api-2.0-beta9.jar
log4j-core-2.0-beta9.jar
mybatis-3.2.3.jar
mysql-connector-java-5.1.7-bin.jar
slf4j-api-1.7.5.jar
slf4j-log4j12-1.7.5.jar
SqlMapConfig.xml,這個可以理解為連接mybatis和數據庫的媒介,以及一些mybatis配置都在這個文件裡
1 <?xml version="1.0" encoding="UTF-8" ?> 2 <!DOCTYPE configuration 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-config.dtd"> 5 <configuration> 6 <!-- 和spring整合後 environments配置將廢除--> 7 <environments default="development"> 8 <environment id="development"> 9 <transactionManager type="JDBC" /> 10 <dataSource type="POOLED"> 11 <property name="driver" value="com.mysql.jdbc.Driver" /> 12 <property name="url" value="jdbc:mysql://localhost:3306/mybatis?characterEncoding=utf-8" /> 13 <property name="username" value="root" /> 14 <property name="password" value="root" /> 15 </dataSource> 16 </environment> 17 </environments> 18 19 <!-- 配置mapper映射文件 --> 20 <mappers> 21 <mapper resource="sqlmap/User.xml"/> 22 </mappers> 23 </configuration>
User.xml 這個文件就是正對user實體進行的相關查詢,命名同User.java
1 <?xml version="1.0" encoding="UTF-8" ?>
2 <!DOCTYPE mapper
3 PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
5 <!-- namespace命名空間特殊作用: 如果使用mapper動態代理方法,這裡就需要配置mapper接口地址-->
6
7 <mapper namespace="test">
8 <!-- 根據用戶id查詢一條記錄(返回單條記錄) -->
9 <!--
10 select標簽表示sql查詢,內容會封裝到Mapped Statement中。
11 可以將這個select標簽稱為一個Statement
12 id:Statement的id,用於標識select中定義的 sql,id是在同一個命名空間中不允許重復
13 #{}:表示一個占位符,避免sql注入
14 parameterType:表示輸入參數的類型
15 resultType:表示輸出 結果集單條記錄映射的java對象類型,select查詢的字段名和resultType中屬性名一致,才能映射成功。
16 #{value}:value表示parameter輸入參數的變量,如果輸入參數是簡單類型,使用#{}占位符,變量名可以使用value或其它的名稱
17
18 -->
19 <select id="findUserById" parameterType="int" resultType="com.mybatis001.bean.User">
20
21 SELECT * FROM USER WHERE id = #{id}
22
23 </select>
24
25
26 <!-- 查詢用戶列表(返回list集合) -->
27 <!--
28 不管結果集查詢一條還是多條,resultType指定結果集單條記錄映射的java對象類型
29 ${}:表示sql拼接,相當於sql字符串拼接,無法避免sql注入
30 ${value}:value表示parameter輸入參數的變量,如果輸入參數是簡單類型,使用${}拼接符,變量名必須使用value
31 ${value}直接 將value獲取到拼接在sql中,value值不加任何修飾
32 -->
33 <select id="findUserList" parameterType="java.lang.String" resultType="com.mybatis001.bean.User" >
34 select * from user where name like '%${value}%'
35 </select>
36
37
38 <!-- 添加用戶
39 parameterType:如果parameterType指定 是pojo,在#{}中指定 pojo的屬性名獲取該pojo的屬性值
40 -->
41 <insert id="insertUser" parameterType="com.mybatis001.bean.User">
42
43 <!--
44 keyProperty:將主鍵設置到pojo中哪個屬性中
45 order:selectKey中sql執行的時機
46 resultType:selectKey中sql執行的結果類型
47 LAST_INSERT_ID:是insert後獲取自增主鍵值
48 -->
49 <!-- 這樣的寫法,在執行後,會再user這個entity中設置id的值 -->
50 <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer">
51 select LAST_INSERT_ID()
52 </selectKey>
53
54 insert into user(name,age,sex) values(#{name},#{age},#{sex})
55 </insert>
56
57 <!-- 根據主鍵刪除用戶 -->
58
59 <delete id="deleteUser" parameterType="int">
60 delete from user where id=#{id}
61 </delete>
62
63 <!-- 根據主鍵用戶更新
64 更新傳入輸入參數見容:id和更新的信息
65 -->
66 <update id="updateUser" parameterType="com.mybatis001.bean.User">
67 update user set name=#{name},age=#{age},sex=#{sex} where id=#{id}
68 </update>
69
70
71 </mapper>
User.java
1 package com.mybatis001.bean;
2
3 public class User {
4
5 private int id;
6 private String name;
7 private int age;
8 private String sex;
9
10 public User() {
11 super();
12 }
13
14 public User(String name, int age, String sex) {
15 super();
16 this.name = name;
17 this.age = age;
18 this.sex = sex;
19 }
20
21 public int getId() {
22 return id;
23 }
24 public void setId(int id) {
25 this.id = id;
26 }
27 public String getName() {
28 return name;
29 }
30 public void setName(String name) {
31 this.name = name;
32 }
33 public int getAge() {
34 return age;
35 }
36 public void setAge(int age) {
37 this.age = age;
38 }
39 public String getSex() {
40 return sex;
41 }
42 public void setSex(String sex) {
43 this.sex = sex;
44 }
45
46 @Override
47 public String toString() {
48 return "User [id=" + id + ", name=" + name + ", age=" + age + ", sex="
49 + sex + "]";
50 }
51
52 }
UserDao.java
1 package com.mybatis001.dao;
2
3 import java.util.List;
4
5 import com.mybatis001.bean.User;
6
7 public interface UserDao {
8
9 public User findUserById(int id) throws Exception;
10
11 public List<User> findUserList(String name) throws Exception;
12
13 public Integer insertUser(User user) throws Exception;
14
15 public void deleteUser(int id) throws Exception;
16
17 public void updateUser(User user) throws Exception;
18
19 }
UserDaoImpl.java
1 package com.mybatis001.dao.impl;
2
3 import java.util.List;
4
5 import org.apache.ibatis.session.SqlSession;
6 import org.apache.ibatis.session.SqlSessionFactory;
7
8 import com.mybatis001.bean.User;
9 import com.mybatis001.dao.UserDao;
10
11 public class UserDaoImpl implements UserDao {
12
13 // 注入SqlSessionFactory
14 private SqlSessionFactory sqlSessionFactory;
15
16 public UserDaoImpl(SqlSessionFactory sqlSessionFactory) {
17 this.sqlSessionFactory = sqlSessionFactory;
18 }
19
20 @Override
21 public User findUserById(int id) throws Exception {
22
23 // 根據SqlSessionFactory創建SqlSession
24
25 SqlSession sqlSession = sqlSessionFactory.openSession();
26
27 // 通過sqlSession查詢用戶信息(發起數據庫操作)
28 // 第一個參數statement:指定mapper映射文件中statement的id,指定 時需要前邊加上statement所屬的命名空間
29 // 第二個參數parameter,指定 輸入參數
30 // selectOne返回的是單條記錄,如果select返回多條記錄(list集合),使用selectOne會報錯
31 // 根據映射文件中的resultType指定輸出類型
32 User user = sqlSession.selectOne("test.findUserById", id);
33 return user;
34 }
35
36 @Override
37 public List<User> findUserList(String name) throws Exception {
38 SqlSession sqlSession = sqlSessionFactory.openSession();
39 List<User> userList = sqlSession.selectList("test.findUserList", name);
40 return userList;
41 }
42
43 @Override
44 public Integer insertUser(User user) throws Exception {
45 SqlSession sqlSession = sqlSessionFactory.openSession();
46 int lastUserId = sqlSession.insert("test.insertUser", user);
47
48 sqlSession.commit();
49 sqlSession.close();
50 return lastUserId;
51 }
52
53 @Override
54 public void deleteUser(int id) throws Exception {
55 SqlSession sqlSession = sqlSessionFactory.openSession();
56 sqlSession.delete("test.deleteUser", id);
57 sqlSession.commit();
58 sqlSession.close();
59 }
60
61 @Override
62 public void updateUser(User user) throws Exception {
63 SqlSession sqlSession = sqlSessionFactory.openSession();
64 sqlSession.update("test.updateUser", user);
65 sqlSession.commit();
66 sqlSession.close();
67 }
68
69 }
測試:
1 package com.test.mybatis001;
2
3
4 import java.io.InputStream;
5 import java.util.List;
6
7 import org.apache.ibatis.io.Resources;
8 import org.apache.ibatis.session.SqlSessionFactory;
9 import org.apache.ibatis.session.SqlSessionFactoryBuilder;
10 import org.junit.Before;
11 import org.junit.Test;
12
13 import com.mybatis001.bean.User;
14 import com.mybatis001.dao.UserDao;
15 import com.mybatis001.dao.impl.UserDaoImpl;
16
17 public class UserDaoImplTest {
18
19 // 會話工廠
20 private SqlSessionFactory sqlSessionFactory;
21
22 @Before
23 public void setUp() throws Exception {
24 // 加載配置文件
25 String resource = "SqlMapConfig.xml";
26 InputStream inputStream = Resources.getResourceAsStream(resource);
27
28 // 根據mytais的配置創建SqlSessionFactory
29 sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
30 }
31
32 @Test
33 public void testFindUserById() throws Exception {
34 UserDao userDao = new UserDaoImpl(sqlSessionFactory);
35 User user = userDao.findUserById(1001);
36 // System.out.println(user.toString());
37
38 List<User> userList = userDao.findUserList("lee");
39
40 if (!userList.isEmpty()) {
41 for (User u : userList) {
42 System.out.println(u.toString());
43 }
44 }
45 }
46
47 @Test
48 public void insertUser() throws Exception {
49 UserDao userDao = new UserDaoImpl(sqlSessionFactory);
50
51 User u1 = new User("nathan.lee.salvatore", 18, "男");
52 User u2 = new User("nathan", 22, "男");
53 User u3 = new User("leechenxiang", 20, "男");
54 User u4 = new User("李晨翔", 19, "男");
55
56 userDao.insertUser(u1);
57 userDao.insertUser(u2);
58 userDao.insertUser(u3);
59 userDao.insertUser(u4);
60 }
61
62 @Test
63 public void deleteUser() throws Exception {
64 UserDao userDao = new UserDaoImpl(sqlSessionFactory);
65 userDao.deleteUser(1013);
66 }
67
68 @Test
69 public void updateUser() throws Exception {
70 UserDao userDao = new UserDaoImpl(sqlSessionFactory);
71 User user = new User("李斯涵", 1, "女");
72 user.setId(1001);
73 userDao.updateUser(user);
74 }
75 }
最後附上github地址:https://github.com/leechenxiang/mybatis001