本文只用於個人複習mybatis使用:
1 簡單理解Mybatis
先看一下官方的定義:
- Mybatis 是一個優秀的基於 java 的持久層框架,它內部封裝了 jdbc,使開發者只需要關注 sql 語句本身,而不需要花費精力去處理加載驅動、創建連接、創建 statement 等繁雜的過程。
(也就是說,我們寫代碼時只需要關注sql語句和它的返回結果就行,其他的什麼數據庫連接,prepareStatement(sql)、executeUpdate()統統不用管) - 遵循ORM(Object Relational Mapping)對象關係映射。簡單地說,就是把數據庫表和實體類及實體類的屬性對應起來,讓我們可以通過操作實體類來操作數據庫表。
(可以理解爲我在java中定義了實體類,數據庫也有這個實體類對應的表,我就可以直接通過實體類來多表進行增刪查改操作)
2 Mybatis配置
2.1 添加Mybatis依賴
在pom.xml找到 <dependencies> </dependencies>標籤,在裏面加入下面的子標籤:
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.5.4</version>
</dependency>
<!-- 數據庫驅動 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.8</version>
<scope>runtime</scope>
</dependency>
<!-- 日誌 -->
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- JUnit 5 -->
<dependency>
<groupId>org.junit.platform</groupId>
<artifactId>junit-platform-launcher</artifactId>
<version>1.3.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId> <!-- 提供assertEquals等斷言方法、@Test等測試註解 -->
<artifactId>junit-jupiter-engine</artifactId>
<version>5.3.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId> <!-- 提供@ParameterizedTest、@ValueSource、@CsvSource等 -->
<artifactId>junit-jupiter-params</artifactId>
<version>5.3.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
<version>5.3.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.testng</groupId>
<artifactId>testng</artifactId>
<version>7.1.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
2.2 在resources文件下創建一個mybatis_config.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">
<!-- mybatis主配置文件 -->
<configuration>
<!-- 全局變量 -->
<properties>
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/db_mybatis"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
</properties>
<!-- 配置環境 -->
<environments default="mysql_config">
<!-- 配置mysql環境 -->
<environment id="mysql_config">
<!-- 配置事務類型 -->
<transactionManager type="JDBC"></transactionManager>
<!-- 配置數據源(連接池) -->
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
<!-- 指定映射配置文件的位置 -->
<mappers>
<mapper resource="com/cimo/DAO/IUserDao.xml"></mapper>
</mappers>
</configuration>
3 將User數據導入數據庫
-- 創建數據庫
CREATE DATABASE IF NOT EXISTS db_mybatis CHARACTER SET utf8;
-- 創建數據表
DROP TABLE IF EXISTS `user`;
CREATE TABLE `user` (
`id` int(11) NOT NULL auto_increment,
`username` varchar(32) NOT NULL COMMENT '用戶名稱',
`birthday` datetime default NULL COMMENT '生日',
`sex` char(1) default NULL COMMENT '性別',
`address` varchar(256) default NULL COMMENT '地址',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
-- 添加記錄
insert into `user`(`id`,`username`,`birthday`,`sex`,`address`)
values
(41,'老王','2018-02-27 17:47:08','男','北京'),
(42,'小二王','2018-03-02 15:09:37','女','北京'),
(43,'小二王','2018-03-04 11:34:34','女','北京'),
(45,'傳智','2018-03-04 12:04:06','男','北京'),
(46,'老王','2018-03-07 17:37:26','男','北京'),
(48,'小馬寶莉','2018-03-08 11:44:00','女','北京');
4 創建java實體類:User.class
User.class
package com.cimo.Entity;
import java.io.Serializable;
import java.util.Date;
public class User implements Serializable {
private Integer id;
private String username;
private Date birthday;
private String sex;
private String 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 + '\'' +
'}';
}
}
5 編寫IUserDao定義CRUD操作,以及使用if、where、foreach標籤
package com.cimo.DAO;
import com.cimo.Entity.*;
import com.cimo.Entity.queryVo;
import java.util.List;
import java.util.Queue;
/***
*
* @author 譚海山
*/
public interface IUserDao {
/**
* 查詢所有用戶
* @return
*/
List<User> findAll();
/**
* 保存用戶
* @param user
*/
void saveUser(User user);
/**
* 更新用戶
*/
void updataUser(User user);
/**
* 根據ID刪除用戶
*/
void delUser(Integer userId);
/**
* 根據ID查詢
*/
User findByid(Integer userid);
/**
*根據模糊查詢用戶定義信息
*/
List<User> findByName(String username);
/**
* 查詢總用戶數
*/
int findTotal();
/**
* 根據queryVo中的條件查詢用戶
* @return
*/
List<User> findUserByVo(queryVo vo);
/**
* 根據傳入參數查詢 使用if標籤
* @param user 查詢的條件,可能是用戶名,可能是地址,可能都有,可能都沒有
* @return
*/
List<User> findUserByCondition_if(User user);
/**
* 根據傳入參數查詢 使用where標籤
* @param user
* @return
*/
List<User> findUserByCondition_where(User user);
/**
* 根據queryVo中提供的id集合,查詢用戶信息
* @param vo
* @return
*/
List<User> findUserInIds(queryVo vo);
}
6 編寫IUserDao.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="com.cimo.DAO.IUserDao">
<!-- 查詢所有 -->
<select id="findAll" resultType="com.cimo.Entity.User">
select * from user ;
</select>
<!-- 保存用戶 -->
<insert id="saveUser" parameterType="com.cimo.Entity.User">
<selectKey keyProperty="id" keyColumn="id" resultType="int" order="AFTER">
select last_insert_id();
</selectKey>
insert into user(username,address,sex,birthday) value (#{username},#{address},#{sex},#{birthday});
</insert>
<!-- 更新用戶 -->
<update id="updataUser" parameterType="com.cimo.Entity.User">
update user set username=#{username},address=#{address},sex=#{sex},birthday=#{birthday} where id=#{id};
</update>
<!-- 刪除用戶 -->
<delete id="delUser" parameterType="Integer">
delete from user where id = #{id};
</delete>
<!-- 根據id查詢用戶信息 -->
<select id="findByid" parameterType="integer" resultType="com.cimo.Entity.User">
select * from user where id=#{id};
</select>
<!-- 根據username模糊查詢 -->
<select id="findByName" parameterType="String" resultType="com.cimo.Entity.User">
select * from user where username like #{name}
</select>
<!-- 查詢總用戶數 -->
<select id="findTotal" resultType="int">
select count(id) from user
</select>
<!-- OGNL : 根據queryVo的條件查詢用戶 -->
<select id="findUserByVo" parameterType="com.cimo.Entity.queryVo" resultType="com.cimo.Entity.User">
select * from user where username like #{user.username}
</select>
<!-- 根據條件查詢 if -->
<select id="findUserByCondition_if" parameterType="com.cimo.Entity.User" resultType="com.cimo.Entity.User">
select * from user where 1=1
<if test="username != null">
and username = #{username}
</if>
<if test="sex != null">
and sex = #{sex}
</if>
</select>
<!-- 根據條件查詢 where -->
<select id="findUserByCondition_where" parameterType="com.cimo.Entity.User" resultType="com.cimo.Entity.User">
select * from user
<where>
<if test="username != null">
and username = #{username}
</if>
<if test="sex != null">
and sex = #{sex}
</if>
</where>
</select>
<!-- 根據queryVo中的Id集合實現查詢用戶列表 -->
<select id="findUserInIds" parameterType="com.cimo.Entity.queryVo" resultType="com.cimo.Entity.User">
select * from user
<where>
<if test="ids != null and ids.size()>0">
<!-- 遍歷ids集合,將遍歷中的每一個元素填充到括號中,並且用,號分割,從而達到id in (1,2,3,...)的效果 -->
<foreach collection="ids" open="and id in (" close=")" item="id" separator=",">
#{id}
</foreach>
</if>
</where>
</select>
</mapper>
7 編寫mybatisTest.class測試類(使用Junit測試)
import com.cimo.DAO.IUserDao;
import com.cimo.Entity.*;
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.io.InputStream;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @author cimo
*
* 測試mybatis的crud操作
*/
public class mybatisTest {
private InputStream in;
private SqlSession sqlSession;
private IUserDao userDao;
@Before //用於在測試方法執行之前執行
public void init()throws Exception{
//1.讀取配置文件,生成字節輸入流
in = Resources.getResourceAsStream("mybatis_config.xml");
//2.獲取SqlSessionFactory
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//3.獲取SqlSession對象、true自動提交事務
sqlSession = factory.openSession(true);
//4.獲取dao的代理對象
userDao = sqlSession.getMapper(IUserDao.class);
}
@After //用於在測試方法執行之後執行
public void destroy()throws Exception{
//提交事務
//sqlSession.commit();
//6.釋放資源
sqlSession.close();
in.close();
}
@Test
public void testFindAll() {
List<User> users = userDao.findAll();
for (User user : users){
System.out.println(user);
}
}
@Test
public void testSaveUser(){
User user = new User();
user.setUsername("殷偉偉2");
user.setAddress("廣西南寧市");
user.setSex("男");
user.setBirthday(new Date());
System.out.println("保存操作之前:");
System.out.println(user);
//保存
userDao.saveUser(user);
System.out.println("保存操作之後:");
System.out.println(user);
}
@Test
public void testUpdata(){
User user = new User();
user.setId(50);
user.setUsername("殷飛龍");
user.setAddress("南寧");
user.setSex("女");
user.setBirthday(new Date());
//修改
userDao.updataUser(user);
}
@Test
public void testDel(){
//刪除
userDao.delUser(45);
}
@Test
public void testfindByid(){
//通過id查找
User user = userDao.findByid(50);
System.out.println(user);
}
@Test
public void testfindByName(){
//通過username查找
List<User> user = userDao.findByName("%王%");
for ( User u : user){
System.out.println(u);
}
}
@Test
public void testfindTotal(){
//查詢總用戶數
System.out.println(userDao.findTotal());
}
/**
* 測試使用queryVo做爲查詢條件
*/
@Test
public void testfindByVo(){
queryVo vo = new queryVo();
User user = new User();
user.setUsername("%王%");
vo.setUser(user);
List<User> users = userDao.findUserByVo(vo);
for(User u : users){
System.out.println(u);
}
}
/**
* 測試使用條件查詢if
*/
@Test
public void testfindUserByCondition_if(){
User user = new User();
user.setUsername("老王");
user.setSex("女");
List<User> users = userDao.findUserByCondition_if(user);
for(User u : users){
System.out.println(u);
}
}
/**
* 測試使用條件查詢 where
*/
@Test
public void testfindUserByCondition_where(){
User user = new User();
user.setUsername("老王");
user.setSex("女");
List<User> users = userDao.findUserByCondition_where(user);
for(User u : users){
System.out.println(u);
}
}
/**
*測試foreach標籤的使用
*/
@Test
public void testfindUserInIds(){
queryVo queryVo = new queryVo();
List<Integer> list = new ArrayList<Integer>();
list.add(41);
list.add(42);
list.add(46);
queryVo.setIds(list);
List<User> users = userDao.findUserInIds(queryVo);
for(User u : users){
System.out.println(u);
}
}
}
8 思路終結:
- 在pom.xml中引入依賴
- 創建mybatis_config.xml配置文件
- 創建數據庫
- 編寫User實體類,儘量與數據庫中的字段名保持一致(不一致可以用resultMap映射)
- 編寫IUserDao接口
- 編寫IUserDao.xml配置文件,注意namespace、resultType都應該爲全限定類名
- 在mybatis_config中指定mapper映射文件
- 編寫測試類
- 其他:不喜歡用註解方式,這樣感覺還是把sql語句寫在java文件裏了。
學習視頻:
Mybatis教程IDEA版-4天-2018黑馬SSM
學習資料:
Mybatis教程-實戰看這一篇就夠了