MyBatis的單表的crud
創(chuàng)建maven項(xiàng)目,并分別添加依賴,junit,mysql,mybatis(3.4.6)
在resouces下創(chuàng)建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">
<!--
該配置文件中包含一個(gè)configuration節(jié)點(diǎn)
里面有配置信息 分別是環(huán)境和映射
其中環(huán)境里有datasource,里面有我們熟悉的連接數(shù)據(jù)庫(kù)的四個(gè)字符串
-->
<configuration>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="org.mariadb.jdbc.Driver"/>
<property name="url" value="jdbc:mariadb://localhost:3306/mydb"/>
<property name="username" value="root"/>
<property name="password" value="wangzhi"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="com/qianfeng/pojo/UserMapper.xml"/>
</mappers>
</configuration>
db.sql
CREATE TABLE `user` (
`uid` int(11) NOT NULL AUTO_INCREMENT,
`username` varchar(20) NOT NULL,
`password` varchar(20) NOT NULL,
`age` int(11) DEFAULT NULL,
`addr` varchar(50) DEFAULT NULL,
PRIMARY KEY (`uid`),
UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB AUTO_INCREMENT=17 DEFAULT CHARSET=latin1
User.java
package com.qianfeng.pojo;
public class User {
private int uid;
private String username;
private String password;
private int age;
private String addr;
@Override
public String toString() {
return "User{" +
"uid=" + uid +
", username='" + username + '\'' +
", password='" + password + '\'' +
", age=" + age +
", addr='" + addr + '\'' +
'}';
}
public int getUid() {
return uid;
}
public void setUid(int uid) {
this.uid = uid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getAddr() {
return addr;
}
public void setAddr(String addr) {
this.addr = addr;
}
}
在com.qianfeng.pojo的包下創(chuàng)建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">
<!--
每個(gè)mapper文件都將有一個(gè)自己的映射的namespace,
每個(gè)方法對(duì)應(yīng)自己的sql語(yǔ)句,每個(gè)sql語(yǔ)句對(duì)應(yīng)有一個(gè)id
整個(gè)項(xiàng)目中所有的namespace.id必須是唯一的
-->
<mapper namespace="com.qianfeng.pojo.UserMapper">
<select id="selectUser" resultType="com.qianfeng.pojo.User">
select * from user
</select>
<select id="selectUserCount" resultType="int">
select count(1) from user;
</select>
<select id="selectUsersByPage1" resultType="com.qianfeng.pojo.User">
select * from user limit 3
</select>
<select id="selectUsersByPage2" resultType="com.qianfeng.pojo.User">
select * from user limit #{pageSize}
</select>
<select id="selectUsersByPage3" resultType="com.qianfeng.pojo.User">
select * from user limit #{startIndex}, #{pageSize}
</select>
<delete id="saveUser">
insert into user values(null, #{username}, #{password}, #{age}, #{addr});
</delete>
<delete id="deleteUserByUid">
delete from user where uid = #{uid}
</delete>
<update id="updateUser">
update user set username= #{username}, password=#{password}, age = #{age}, addr = #{addr} where uid = #{uid};
</update>
</mapper>
TestUser.java
package com.qianfeng.test;
import com.qianfeng.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.After;
import org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.sql.Connection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class TestUser {
private SqlSessionFactory sf = null;
private SqlSession session = null;
@Before
public void setUp(){
try {
sf = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis.xml"));
session = sf.openSession();
} catch (IOException e) {
e.printStackTrace();
}
}
@After
public void tearDown(){
if(session != null){
session.close();
session = null;
}
}
@Test
public void testGetAllUsers(){
/**
* 1. 使用mybatis的配置文件以及SqlSessionFactoryBuilder建造者模式創(chuàng)建SqlSessionFactory對(duì)象
* 2. 使用SqlSessionFactory對(duì)象的openSession()方法來(lái)得到一個(gè)SqlSession對(duì)象,用該對(duì)象即可完成對(duì)象的所有的crud操作
* 3. 使用SqlSession對(duì)象來(lái)完成crud操作
* 4. 關(guān)閉資源
*
*/
/**
* session的crud方法("namespace.id");整個(gè)項(xiàng)目中的namespace.id必須唯一
*/
List<User> users = session.selectList("com.qianfeng.pojo.UserMapper.selectUser");
for (User u : users) {
System.out.println(u);
}
}
@Test
public void testGetAllUsersCount(){
/**
* 1. 使用mybatis的配置文件以及SqlSessionFactoryBuilder建造者模式創(chuàng)建SqlSessionFactory對(duì)象
* 2. 使用SqlSessionFactory對(duì)象的openSession()方法來(lái)得到一個(gè)SqlSession對(duì)象,用該對(duì)象即可完成對(duì)象的所有的crud操作
* 3. 使用SqlSession對(duì)象來(lái)完成crud操作
* 4. 關(guān)閉資源
*
*/
/**
* session的crud方法("namespace.id");整個(gè)項(xiàng)目中的namespace.id必須唯一
*/
Integer count = session.selectOne("com.qianfeng.pojo.UserMapper.selectUserCount");
System.out.println(count);
}
@Test
public void testGetUsersByPage1(){
List<User> users = session.selectList("com.qianfeng.pojo.UserMapper.selectUsersByPage1");
for (User u : users) {
System.out.println(u);
}
}
@Test
public void testGetUsersByPage2(){
List<User> users = session.selectList("com.qianfeng.pojo.UserMapper.selectUsersByPage2", 9);
for (User u : users) {
System.out.println(u);
}
}
@Test
public void testGetUsersByPage3(){
Map<String, Integer> map = new HashMap<>();
map.put("startIndex", 10);
map.put("pageSize", 5);
List<User> users = session.selectList("com.qianfeng.pojo.UserMapper.selectUsersByPage3", map);
for (User u : users) {
System.out.println(u);
}
}
@Test
public void testSaveUser(){
User u = new User();
u.setUsername("wz");
u.setPassword("123456");
u.setAddr("nanjing");
u.setAge(22);
int result = session.insert("com.qianfeng.pojo.UserMapper.saveUser", u);
System.out.println(result);
}
@Test
public void testDelete(){
Integer result = session.delete("com.qianfeng.pojo.UserMapper.deleteUserByUid", 9);
System.out.println(result);
}
@Test
public void testUpdate(){
User user = new User();
user.setUid(8);
user.setUsername("888");
user.setPassword("wz");
int result = session.update("com.qianfeng.pojo.UserMapper.updateUser", user);
session.commit();
System.out.println(result);
}
}
本案例要注意一些問(wèn)題:
- UserMapper的映射文件:
- namespace和id在整個(gè)項(xiàng)目中,必須要保證唯一
- namespace+id找到的是唯一的sql語(yǔ)句,標(biāo)簽可能不對(duì)應(yīng),但是不影響執(zhí)行結(jié)果,但是還是需要規(guī)范各個(gè)標(biāo)簽
- TestUser.java
- 創(chuàng)建SqlSession對(duì)象的時(shí)候,SqlSessionFactory對(duì)象的openSession()方法不包含參數(shù),則使用事務(wù)手動(dòng)提交,做完增刪改操作后,需要調(diào)用SqlSession對(duì)象的commit()方法完成事務(wù)的提交。如果openSession()方法包含有一個(gè)true,代表自動(dòng)提交生效,我們做完增刪改操作時(shí)候,就完成了對(duì)應(yīng)的增刪改功能。openSession()方法默認(rèn)的提交方式為手動(dòng)提交
- 該類活用了junit的生命周期方法,每個(gè)測(cè)試方法執(zhí)行之前都會(huì)調(diào)用標(biāo)注有@Before注解的setUp()方法完成環(huán)境的準(zhǔn)備工作,每個(gè)方法完成之后都自動(dòng)的執(zhí)行標(biāo)注有@After注解的tearDown()方法完成資源的釋放工作
- SqlSession是mybatis中的核心對(duì)象,使用該對(duì)象即可完成對(duì)于所有操作的crud功能,里面有對(duì)應(yīng)的方法,selectList(),查詢列表(集合),selectOne()查詢單個(gè)對(duì)象,insert(),delete,update()分別對(duì)應(yīng)增刪改功能。這三個(gè)方法的返回值均為受影響的行數(shù)
- 每次使用完SqlSession對(duì)象之后,使用close()方法將SqlSession對(duì)象關(guān)閉,不建議關(guān)閉SqlSessionFactory對(duì)象
- 關(guān)于傳遞參數(shù)
- 傳遞單個(gè)值,sql語(yǔ)句里面的占位符可以任意寫
- 多個(gè)值,可以使用Map來(lái)傳值,map中的key要與sql語(yǔ)句中的占位符一致
- 對(duì)象傳值,sql語(yǔ)句中的字段值與對(duì)象的屬性名一致
- 零散值的傳遞,可以使用兩種方式arg0, arg1,...或者param1,param2...