基于Mybatis實(shí)現(xiàn)CRUD操作過程解析(xml方式)
1、環(huán)境搭建
1.1 表結(jié)構(gòu)
create table user ( id int primary key auto_increment, username varchar(20) not null, birthday date, sex char(1) default '男', address varchar(50) ); insert into user values (null, '孫悟空','1980-10-24','男','花果山水簾洞'); insert into user values (null, '白骨精','1992-11-12','女','白虎嶺白骨洞'); insert into user values (null, '豬八戒','1983-05-20','男','福臨山云棧洞'); insert into user values (null, '蜘蛛精','1995-03-22','女','盤絲洞');
1.2 創(chuàng)建項(xiàng)目
導(dǎo)入如下jar
- mybatis框架包
- 數(shù)據(jù)庫驅(qū)動(dòng)包
- log4j日志包
- junit單元測(cè)試包
1.3 準(zhǔn)備配置文件
在src下準(zhǔn)備配置文件:sqlMapConfig.xml
<?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> <!--配置數(shù)據(jù)庫連接參數(shù)--> <environments default="mybatis"> <environment id="mybatis"> <!--事務(wù)管理器--> <transactionManager type="JDBC"></transactionManager> <!--配置數(shù)據(jù)源--> <dataSource type="pooled"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql:///test"/> <property name="username" value="root"/> <property name="password" value="root"/> </dataSource> </environment> </environments> </configuration>
在 src 下準(zhǔn)備配置文件:log4j.properties
# Global logging configuration
log4j.rootLogger=DEBUG, stdout# Console output...
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n
2-增刪改查源碼
1.1 執(zhí)行結(jié)果
1.2 User類代碼
import java.sql.Date; /** 用戶實(shí)體類對(duì)象 */ public class User { private Integer id; private String username; private Date birthday; private String sex; private String address; public User() { } public User(Integer id, String username, Date birthday, String sex, String address) { this.id = id; this.username = username; this.birthday = birthday; this.sex = sex; this.address = address; } 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 Date getBirthday() { return birthday; } public void setBirthday(Date birthday) { this.birthday = birthday; } 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; } @Override public String toString() { return "User{" + "id=" + id + ", username='" + username + '\'' + ", birthday=" + birthday + ", sex='" + sex + '\'' + ", address='" + address + '\'' + '}'; } }
1.3 UserMapper接口代碼
package com.vg.dao; import com.vg.entity.User; import org.apache.ibatis.annotations.Param; import java.util.List; /** * 數(shù)據(jù)訪問層接口:對(duì)用戶進(jìn)行增刪改查操作 */ public interface UserMapper { /** * 添加用戶 */ int addUser(User user); /** * 根據(jù)id刪除用戶 */ void deleteUser(Integer id); /** * 通過id修改用戶信息 */ /** * 修改用戶信息 */ void updateUser(User user); /** * 查詢所有用戶 */ List<User> findAllUsers(); /** * 根據(jù)id查詢用戶 */ User findUserById(int id); /** * 根據(jù)用戶名模糊查詢用戶 */ List<User> findUsersByName(String username); /** * 根據(jù)姓名和性別查詢用戶數(shù)據(jù)(姓名使用模糊查詢) */ /** * 根據(jù)用戶名稱模糊查詢用戶 */ } }
1.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"> <!-- 映射的作用:一個(gè)映射文件就對(duì)應(yīng)一個(gè)接口,一個(gè)接口可以有多個(gè)映射文件,一般是一對(duì)一關(guān)系。 mapper標(biāo)簽的namespace屬性的作用:關(guān)聯(lián)接口,需要配置對(duì)應(yīng)接口的類全名字符串 --> <mapper namespace="com.vg.dao.UserMapper"> <!-- 完成接口映射配置文件UserMapper.xml的編寫:這個(gè)映射文件就相當(dāng)于UserMapper接口實(shí)現(xiàn)類配置 --> <!--select標(biāo)簽的作用:用來配置查詢要執(zhí)行的SQL語句 id屬性:關(guān)聯(lián)接口中的方法名 resultType屬性:設(shè)置方法返回的數(shù)據(jù)類型,如果是集合則配置集合元素的類型 --> <select id="findAllUsers" resultType="User"> select * from user </select> <select id="findUserById" parameterType="int" resultType="User"> select * from user where id = #{id}; </select> <select id="findUsersByName" parameterType="string" resultType="User"> select *from user where username like #{username} </select> <insert id="addUser" parameterType="user" > insert into user values(null,#{username},#{birthday},#{sex},#{address}); </insert> <update id="updateUser" parameterType="user"> update user set username = #{username}, birthday = #{birthday},sex = #{sex}, address = #{address} where id = #{id} </update> <delete id="deleteUser" parameterType="integer"> delete from user where id = #{id} </delete> </mapper>
1.5 在主配置文件中加載接口映射文件
<mappers> <!--mapper標(biāo)簽:一個(gè)該標(biāo)簽就配置一個(gè)接口映射文件 resource屬性:配置映射文件的路徑,路徑分隔符使用 / : com/vg/dao/UserMapper.xml url:用于配置互聯(lián)網(wǎng)上的映射文件的路徑,比如:http://www.baidu.com/xxx.xml --> <!--<mapper resource="com/vg/dao/UserMapper.xml"></mapper>--> <package name="com.vg.dao"/> </mappers>
1.6 測(cè)試類代碼
package com.vg.test; import com.vg.dao.UserMapper; import com.vg.entity.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.BeforeClass; import org.junit.Test; import java.io.IOException; import java.io.InputStream; import java.sql.Date; import java.util.List; /** * 測(cè)試類 */ public class TestUserMapper { private static SqlSessionFactory sqlSessionFactory =null; private SqlSession sqlSession =null; private UserMapper userMapper =null; // 該方法在所有測(cè)試方法執(zhí)行之前執(zhí)行1次 @BeforeClass public static void init() throws Exception { // 1. 通過Resources類,加載sqlMapConfig.xml,得到文件輸入流對(duì) InputStream in = Resources.getResourceAsStream("sqlMapConfig.xml"); // 2. 實(shí)例化會(huì)話工廠創(chuàng)建類SqlSessionFactoryBuilder對(duì)象 SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); // 3. 根據(jù)字節(jié)輸入流獲取SqlSessionFactory對(duì)象 sqlSessionFactory = builder.build(in); } // 該方法會(huì)在每個(gè)測(cè)試方法執(zhí)行之前執(zhí)行1次 @Before public void before(){ // 4. 獲取SqlSession對(duì)象,等價(jià)連接對(duì)象 // true:事務(wù)自動(dòng)提交,false:不自動(dòng)提交,默認(rèn)值 sqlSession = sqlSessionFactory.openSession(); // 5. 創(chuàng)建接口 實(shí)現(xiàn)類對(duì)象 userMapper = sqlSession.getMapper(UserMapper.class); } /** * 測(cè)試方法:通過用戶名模糊查詢用戶 */ @Test public void testAddUser() throws Exception{ // 1. 獲得接口代理對(duì)象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); // 2. 創(chuàng)建User對(duì)象 User u = new User(); u.setUsername("如來佛祖111"); u.setBirthday(Date.valueOf("1980-01-20")); u.setAddress("西天靈山"); u.setSex("男"); // 3. 保存用戶信息 int row = userMapper.addUser(u); System.out.println("row = " + row); // 4. 手動(dòng)提交事務(wù) sqlSession.commit(); } /** * 測(cè)試方法:通過用戶名模糊查詢用戶 */ @Test public void testFindUserByName() throws Exception{ List<User> userList = userMapper.findUsersByName("%精%"); for (User user : userList) { System.out.println(user); } } /** * 測(cè)試方法:查詢所有用戶 */ @Test public void testFindAllUsers() throws Exception{ List<User> userList = userMapper.findAllUsers(); for (User user : userList) { System.out.println(user); } } /** * 根據(jù)id查詢用戶 * @throws Exception */ @Test public void testFindUserById()throws Exception{ // 6. 調(diào)用接口的方法根據(jù)id查詢用戶 User user = userMapper.findUserById(1); System.out.println("user = " + user); } @Test public void testUpdateUser()throws Exception{ // 創(chuàng)建用戶對(duì)象 User user = new User( 6, "牛魔王", Date.valueOf("1998-02-20"), "妖", "牛魔洞"); // 更新用戶 userMapper.updateUser(user); // 提交事務(wù) sqlSession.commit(); } @Test public void testDeleteUser()throws Exception{ // 1. 獲得接口代理對(duì)象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); // 2. 根據(jù)id刪除用戶 userMapper.deleteUser(6); // 3. 提交事務(wù) sqlSession.commit(); } @After public void after() { // 7. 關(guān)閉會(huì)話,釋放資源。 sqlSession.close(); } }
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
聊聊@value注解和@ConfigurationProperties注解的使用
這篇文章主要介紹了@value注解和@ConfigurationProperties注解的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-09-09java split結(jié)果去除空字符串的方法實(shí)現(xiàn)
在Java開發(fā)中,我們經(jīng)常需要對(duì)字符串進(jìn)行分割操作,本文主要介紹了java split結(jié)果去除空字符串的方法實(shí)現(xiàn),具有一定的參考價(jià)值,感興趣的可以了解一下2023-10-10Java多線程中的CountDownLatch詳細(xì)解讀
這篇文章主要介紹了Java多線程中的CountDownLatch詳細(xì)解讀,一個(gè)同步輔助類,在完成一組正在其他線程中執(zhí)行的操作之前,它允許一個(gè)或多個(gè)線程一直等待,用給定的計(jì)數(shù) 初始化 CountDownLatch,需要的朋友可以參考下2023-11-11Java數(shù)組轉(zhuǎn)換為L(zhǎng)ist的四種方式
這篇文章主要介紹了Java開發(fā)技巧數(shù)組轉(zhuǎn)List的四種方式總結(jié),每種方式結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-09-09使用 Spring Boot 2.0 + WebFlux 實(shí)現(xiàn) RESTful API功能
什么是 Spring WebFlux, 它是一種異步的, 非阻塞的, 支持背壓(Back pressure)機(jī)制的Web 開發(fā)框架.下面通過本文給大家介紹使用 Spring Boot 2.0 + WebFlux 實(shí)現(xiàn) RESTful API功能,需要的朋友參考下吧2018-01-01