6、MySQL之常見的單表CRUD
阿新 • • 發佈:2020-07-24
- CRUD
- 增 (saveUser)
- 刪 (deleteUser)
- 改 (updateUser)
- 查 (findAllUser,FindUserById)
- like (findUserByName,findUserByName2)
- 聚合函式 (findTotal)
- 獲取儲存資料的id(saveUser)
- OGNL取值 (findUserByWorkCard)
準備工作
1、user實體類
public class User { private Integer id; private String username; private Date birthday; private String gender; private String address; //省略get、set和toString方法 }
2、WorkCard實體類
public class WorkCard {
private User user;
//省略get、set方法
}
3、資料庫
CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '使用者名稱稱', `birthday` datetime DEFAULT NULL COMMENT '生日', `gender` char(1) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '性別', `address` varchar(256) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '地址', PRIMARY KEY (`id`) USING BTREE )
表結構
介面
public interface UserMapper { /** * 查詢所有使用者 * @return */ List<User> findAllUser(); /** * 儲存使用者 */ void saveUser(User user); /** * 更新使用者 */ void updateUser(User user); /** * 刪除使用者 */ void deleteUser(Integer id); /** * 根據id查詢使用者 */ User findUserById(Integer id); /** * like模糊查詢,第一種 */ List<User> findUserByName(String username); /** * like模糊查詢,第二種 */ List<User> findUserByName2(String username); /** * 查詢總使用者數(聚合函式count) */ int findTotal(); /** * 根據WorkCard類中User屬性的username模糊查詢 * WorkCard是user的封裝類 * OGNL表示式取值 */ List<User> findUserByWorkCard(WorkCard workCard); }
對映檔案
<?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">
<!--namespace填寫的是Mapper介面的全限定名-->
<mapper namespace="com.example.mapper.UserMapper">
<!--查詢所有-->
<select id="findAllUser" resultType="com.example.pojo.User">
select * FROM user
</select>
<!--新增使用者-->
<insert id="saveUser" parameterType="com.example.pojo.User">
<!--配置插入操作後,獲取插入資料的id -->
<selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
SELECT last_insert_id();
</selectKey>
INSERT INTO user(username,birthday,gender,address) VALUES (#{username},#{birthday},#{gender},#{address})
</insert>
<!--更新使用者-->
<update id="updateUser" parameterType="com.example.pojo.User">
UPDATE user SET username = #{username}, birthday = #{birthday}, gender = #{gender}, address = #{address} WHERE id = #{id}
</update>
<!--刪除使用者-->
<delete id="deleteUser" parameterType="Integer">
<!--當引數只用一個並且引數是基本資料型別的包裝類是#{佔位符}佔位符可以隨便寫 -->
DELETE FROM user WHERE id = #{userid}
</delete>
<!--通過id查詢使用者-->
<select id="findUserById" parameterType="Integer" resultType="com.example.pojo.User">
select * FROM user where id = #{userId}
</select>
<!--通過名字模糊查詢使用者-->
<select id="findUserByName" parameterType="java.lang.String" resultType="com.example.pojo.User">
SELECT * FROM user WHERE username LIKE '%${username}%'
</select>
<!--通過名字模糊查詢使用者-->
<select id="findUserByName2" parameterType="java.lang.String" resultType="com.example.pojo.User">
SELECT * FROM user WHERE username LIKE #{username}
</select>
<!--查詢總使用者數,聚合函式count()-->
<select id="findTotal" resultType="int">
SELECT count(*) FROM user
</select>
<!--OGNL表示式
Object Graphic Navigation Language 物件 圖 導航 語言
它是通過物件的取值方法來獲取資料,在寫法上吧get給省略了
比如:獲取使用者名稱
通常的寫法:user.getUsername();
OGNL表示式寫法 user.username
-->
<select id="findUserByWorkCard" parameterType="com.example.pojo.WorkCard" resultType="com.example.pojo.User">
SELECT * FROM user WHERE username LIKE #{user.username}
</select>
</mapper>
public class UserMapperTest {
private UserMapper userMapper;
private SqlSession sqlSession;
private InputStream stream;
@Before
public void init() throws IOException {
stream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(stream);
sqlSession = sqlSessionFactory.openSession();
userMapper = sqlSession.getMapper(UserMapper.class);
}
@After
public void destory() throws IOException {
// 每次執行完都進行事務提交
sqlSession.commit();
sqlSession.close();
stream.close();
}
/**
* 查詢所有
*/
@Test
public void testFindAll(){
List<User> allUser = userMapper.findAllUser();
for (User user: allUser
) {
System.out.println(user);
}
}
/**
* 儲存使用者
*/
@Test
public void testSaveUser(){
User user = new User();
user.setUsername("小紅");
user.setGender("男");
user.setBirthday(new Date());
user.setAddress("汕頭市");
userMapper.saveUser(user);
System.out.println(user);
}
/**
* 更新使用者
*/
@Test
public void testUpdateUser(){
User user = new User();
user.setUsername("小紅");
user.setGender("女");
user.setBirthday(new Date());
user.setAddress("汕頭市");
user.setId(52);
userMapper.updateUser(user);
}
/**
* 刪除使用者
*/
@Test
public void testDeleteUser(){
userMapper.deleteUser(50);
}
/**
* 根據使用者id查詢使用者
*/
@Test
public void testFindUserById(){
User user = userMapper.findUserById(48);
System.out.println(user);
}
/**
* 根據使用者姓名模糊查詢使用者
*/
@Test
public void testFindUserByName(){
/**
* 第一種寫法在dao層的sql語句中新增'%${username}%',這種方式的缺點是不能預處理
*/
List<User> users = userMapper.findUserByName("小");
for (User user: users
) {
System.out.println(user);
}
}
/**
* 根據使用者姓名模糊查詢使用者
*/
@Test
public void testFindUserByName2(){
/**
* 第二種寫法是在傳參是就添加了%
*/
List<User> users = userMapper.findUserByName2("%" + "小" + "%");
for (User user: users
) {
System.out.println(user);
}
}
/**
* 測試聚合函式
*/
@Test
public void testFindTotal(){
int total = userMapper.findTotal();
System.out.println(total);
}
/**
* OGNL取值
*/
/**
* 根據使用者姓名模糊查詢使用者
*/
@Test
public void findUserByWorkCard(){
User user = new User();
user.setUsername("%" + "小" + "%");
WorkCard workCard = new WorkCard();
workCard.setUser(user);
List<User> users = userMapper.findUserByWorkCard(workCard);
for (User u: users
) {
System.out.println(u);
}
}
}