MyBatis的單表的crud
創(chuàng)建maven項目次酌,并分別添加依賴,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">
<!--
? ? 該配置文件中包含一個configuration節(jié)點
? ? ? ? 里面有配置信息 分別是環(huán)境和映射
? ? ? ? 其中環(huán)境里有datasource,里面有我們熟悉的連接數(shù)據(jù)庫的四個字符串
-->
<configuration>
? ? <environments default="development">
? ? ? ? <environment id="development">
? ? ? ? ? ? <transactionManager type="JDBC"/>
? ? ? ? ? ? <dataSource type="POOLED">
? ? ? ? ? ? ? ? <property name="driver" value="com.mysql.jdbc.Driver"/>
? ? ? ? ? ? ? ? <property name="url" value="jdbc:mysql://localhost:3306/hello"/>
? ? ? ? ? ? ? ? <property name="username" value="root"/>
? ? ? ? ? ? ? ? <property name="password" value="123456"/>
? ? ? ? ? ? </dataSource>
? ? ? ? </environment>
? ? </environments>
? ? <mappers>
? ? ? ? <mapper resource="com/qfedu/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
123456789
User.java
package com.qfedu.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.qfedu.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">
<!--
? ? 每個mapper文件都將有一個自己的映射的namespace蜕煌,
? ? 每個方法對應(yīng)自己的sql語句派阱,每個sql語句對應(yīng)有一個id
? ? 整個項目中所有的namespace.id必須是唯一的
-->
<mapper namespace="com.qfedu.pojo.UserMapper">
? ? <select id="selectUser" resultType="com.qfedu.pojo.User">
? ? ? select * from user
? ? </select>
? ? <select id="selectUserCount" resultType="int">
? ? ? ? select count(1) from user;
? ? </select>
? ? <select id="selectUsersByPage1" resultType="com.qfedu.pojo.User">
? ? ? ? select * from user limit 3
? ? </select>
? ? <select id="selectUsersByPage2" resultType="com.qfedu.pojo.User">
? ? ? ? select * from user limit #{pageSize}
? ? </select>
? ? <select id="selectUsersByPage3" resultType="com.qfedu.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.qfedu.test;
import com.qfedu.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對象
? ? ? ? *? 2.? 使用SqlSessionFactory對象的openSession()方法來得到一個SqlSession對象,用該對象即可完成對象的所有的crud操作
? ? ? ? *? 3.? 使用SqlSession對象來完成crud操作
? ? ? ? *? 4.? 關(guān)閉資源
? ? ? ? *
? ? ? ? */
? ? ? ? /**
? ? ? ? * session的crud方法("namespace.id");整個項目中的namespace.id必須唯一
? ? ? ? */
? ? ? ? List<User> users = session.selectList("com.qfedu.pojo.UserMapper.selectUser");
? ? ? ? for (User u : users) {
? ? ? ? ? ? System.out.println(u);
? ? ? ? }
? ? }
? ? @Test
? ? public void testGetAllUsersCount(){
? ? ? ? /**
? ? ? ? *? 1.? 使用mybatis的配置文件以及SqlSessionFactoryBuilder建造者模式創(chuàng)建SqlSessionFactory對象
? ? ? ? *? 2.? 使用SqlSessionFactory對象的openSession()方法來得到一個SqlSession對象斜纪,用該對象即可完成對象的所有的crud操作
? ? ? ? *? 3.? 使用SqlSession對象來完成crud操作
? ? ? ? *? 4.? 關(guān)閉資源
? ? ? ? *
? ? ? ? */
? ? ? ? /**
? ? ? ? * session的crud方法("namespace.id");整個項目中的namespace.id必須唯一
? ? ? ? */
? ? ? ? Integer count = session.selectOne("com.qfedu.pojo.UserMapper.selectUserCount");
? ? ? ? System.out.println(count);
? ? }
? ? @Test
? ? public void testGetUsersByPage1(){
? ? ? ? List<User> users = session.selectList("com.qfedu.pojo.UserMapper.selectUsersByPage1");
? ? ? ? for (User u : users) {
? ? ? ? ? ? System.out.println(u);
? ? ? ? }
? ? }
? ? @Test
? ? public void testGetUsersByPage2(){
? ? ? ? List<User> users = session.selectList("com.qfedu.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.qfedu.pojo.UserMapper.selectUsersByPage3", map);
? ? ? ? for (User u : users) {
? ? ? ? ? ? System.out.println(u);
? ? ? ? }
? ? }
? ? @Test
? ? public? void testSaveUser(){
? ? ? ? User u = new User();
? ? ? ? u.setUsername("lisi");
? ? ? ? u.setPassword("888888");
? ? ? ? u.setAddr("wuhan");
? ? ? ? u.setAge(20);
? ? ? ? int result = session.insert("com.qfedu.pojo.UserMapper.saveUser", u);
? ? ? ? System.out.println(result);
? ? }
? ? @Test
? ? public void testDelete(){
? ? ? ? Integer result = session.delete("com.qfedu.pojo.UserMapper.deleteUserByUid", 9);
? ? ? ? System.out.println(result);
? ? }
? ? @Test
? ? public void testUpdate(){
? ? ? ? User user = new User();
? ? ? ? user.setUid(8);
? ? ? ? user.setUsername("888");
? ? ? ? user.setPassword("lisixin");
//? ? ? ? user.setAge(20);
//? ? ? ? user.setAddr("nanjing");
? ? ? ? int result = session.update("com.qfedu.pojo.UserMapper.updateUser", user);
? ? ? ? session.commit();? ? ? //
? ? ? ? System.out.println(result);
? ? }
}
本案例要注意一些問題:
1. UserMapper的映射文件:
? 1. namespace和id在整個項目中贫母,必須要保證唯一
? 2. namespace+id找到的是唯一的sql語句,標(biāo)簽可能不對應(yīng)盒刚,但是不影響執(zhí)行結(jié)果腺劣,但是還是需要規(guī)范各個標(biāo)簽
2. TestUser.java
? 1. 創(chuàng)建SqlSession對象的時候,SqlSessionFactory對象的openSession()方法不包含參數(shù)因块,則使用事務(wù)手動提交橘原,做完增刪改操作后,需要調(diào)用SqlSession對象的commit()方法完成事務(wù)的提交涡上。如果openSession()方法包含有一個true趾断,代表自動提交生效,我們做完增刪改操作時候吩愧,就完成了對應(yīng)的增刪改功能芋酌。openSession()方法默認(rèn)的提交方式為手動提交
? 2. 該類活用了junit的生命周期方法,每個測試方法執(zhí)行之前都會調(diào)用標(biāo)注有@Before注解的setUp()方法完成環(huán)境的準(zhǔn)備工作雁佳,每個方法完成之后都自動的執(zhí)行標(biāo)注有@After注解的tearDown()方法完成資源的釋放工作
? 3. SqlSession是mybatis中的核心對象脐帝,使用該對象即可完成對于所有操作的crud功能,里面有對應(yīng)的方法糖权,selectList()堵腹,查詢列表(集合),selectOne()查詢單個對象星澳,insert()秸滴,delete,update()分別對應(yīng)增刪改功能募判。這三個方法的返回值均為受影響的行數(shù)
? 4. 每次使用完SqlSession對象之后荡含,使用close()方法將SqlSession對象關(guān)閉,不建議關(guān)閉SqlSessionFactory對象
? 5. 關(guān)于傳遞參數(shù)
? ? ? 1. 傳遞單個值届垫,sql語句里面的占位符可以任意寫
? ? ? 2. 多個值释液,可以使用Map來傳值,map中的key要與sql語句中的占位符一致
? ? ? 3. 對象傳值装处,sql語句中的字段值與對象的屬性名一致
? ? ? 4. 零散值的傳遞误债,可以使用兩種方式arg0, arg1妄迁,...或者param1寝蹈,param2...