mybatis框架(2)---mapper代理方法
阿新 • • 發佈:2019-02-18
mapper代理方法
在我們在寫MVC設計的時候,都會寫dao層和daoimp實現層,但假如我們使用mapper代理的方法,我們就可以不用先daoimp實現類
當然這得需要遵守一些相應的規則:
(1)Usermapper.java介面必須和Usermapper.xml名稱相同,且要在同一目錄下:
(2)mapper.xml中namespace等於mapper介面的地址
(3)Usermapper.java介面中國的方法名和Usermapper.xml中statement的id一致
<!-- 7綜合查詢 --> <select id="findUserCount" parameterType="com.study.model.User" resultType="int"> select count(*) from user where user.sex=#{userCustomer.sex} and user.username like '%${userCustomer.username}%' </select>
(4)SqlMapConfig.xml中載入mapper.xml
<mappers> <!-- 這裡是之前載入所寫的 --> <!-- <mapper resource="sqlmap/User.xml" /> --> <!-- 通過mapper介面 載入單個對映檔案 必須遵循一些規範: 需要將mapper介面和mapper.xml對映檔案 檔名必須一致 並且在同一個目錄下 --> <mapper class="com.study.mapper.UserMapper" /> </mappers>
(5)通過mapper代理方法進行增刪改查
a.編寫user物件
public class User {
private int id;
private String username;// 使用者姓名
private String sex;// 性別
private Date birthday;// 生日
private String address;// 地址
/*
*提供set和get方法和tostring方法
*
*/
}
b.配置SqlMapConfig.xml
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <properties resource="db.properties"></properties> <!-- 定義 別名 --> <typeAliases> <!-- 單個別名的定義 alias:別名,type:別名對映的型別 --> <!-- <typeAlias type="com.study.model.User" alias="user"/> --> <!-- 批量別名定義 指定包路徑,自動掃描包下邊的pojo,定義別名,別名預設為類名(首字母小寫或大寫) --> <package name="com.study.model"/> </typeAliases> <!-- 和spring整合後 environments配置將廢除--> <environments default="development"> <environment id="development"> <!-- 使用jdbc事務管理--> <transactionManager type="JDBC" /> <!-- 資料庫連線池--> <dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource> </environment> </environments> <!--載入mapper對映 如果將和spring整合後,可以使用整合包中提供的mapper掃描器,此處的mappers不用配置了。 --> <mappers> <mapper class="com.study.mapper.UserMapper" /> </mappers> </configuration>
在這裡有兩個新的知識點:
1: <properties resource="db.properties"></properties>
之前在連線資料庫填寫配置檔案直接把屬性(連線資料庫使用者名稱,密碼等)寫在裡面,而這裡是寫在外面的db.properties中,這樣更好的體現程式碼的靈活性
2:<typeAliases>標籤,之前我們配置mapper.xml檔案中的parameterType和resultType的屬性如果是物件一定要寫類的全名稱,而通過<typeAliases>標籤的配置我們只需要寫類的名字就好了
c.配置db.properties
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc\:mysql\://localhost\:3306/study
jdbc.username=root
jdbc.password=root
也就是這樣的
d.配置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">
<!-- namespace的屬性對應所在的UserMapper介面全名稱 -->
<mapper namespace="com.study.mapper.UserMapper">
<!-- 發現這裡的resultType屬性我們可以不用寫類的全名稱com.study.model.User,因為在-->
<!--SqlMapConfig.xml屬性中我們配置了<typeAliases>標籤 -->
<!-- 根據id查詢使用者資訊 -->
<select id="findUserById" parameterType="int" resultType="user">
SELECT * FROM USER WHERE id= #{id}
</select>
<!-- 根據使用者名稱稱查詢使用者資訊,可能返回多條-->
<select id="findUserByName" parameterType="java.lang.String" resultType="user">
select * from user where username like '%${value}%'
</select>
<!-- 新增使用者-->
<insert id="insertUser" parameterType="user">
INSERT INTO USER(username,birthday,sex,address) VALUES(#{username},#{birthday},#{sex},#{address})
</insert>
</mapper>
f.配置UserMapper.java物件
public interface UserMapper {
//根據使用者id查詢使用者資訊
public User findUserById(int id) throws Exception;
//根據使用者名稱稱 查詢使用者資訊
public List<User> findUserByName(String username) throws Exception;//插入使用者
public void insertUser(User user)throws Exception;
//刪除使用者
public void deleteUser(int id) throws Exception;
//修改使用者
public void updateUser(User user) throws Exception;
}
e.編寫UserMapperTest類進行 增刪改查
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
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.Before;
import org.junit.Test;
import com.study.mapper.UserMapper;
import com.study.model.User;
public class UserMapperTest {
// 會話工廠
private SqlSessionFactory sqlSessionFactory;
// 建立工廠
@Before
public void init() throws IOException {
String resource = "SqlMapConfig.xml";
InputStream inputStream = Resources.getResourceAsStream(resource);
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
//通過使用者id查詢物件
@Test
public void testFindUserById() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
// 建立代理物件,這裡就相當於有事先類了
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = userMapper.findUserById(1);
System.out.println(user);
}
//根據使用者相信模糊查詢
@Test
public void testFindUserByUsername() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
List<User> list = userMapper.findUserByName("小明");
System.out.println(list);
}
//新增使用者
@Test
public void testInsertUser() throws Exception {
SqlSession sqlSession = sqlSessionFactory.openSession();
UserMapper userMapper = sqlSession.getMapper(UserMapper.class);
User user = new User();
user.setUsername("小小洪");
//我這裡只添加了使用者名稱,其它資訊沒有新增,預設為null
//Preparing: INSERT INTO USER(username,birthday,sex,address) VALUES(?,?,?,?)
//Parameters: 小小洪(String), null, null, null
userMapper.insertUser(user);
sqlSession.commit();
sqlSession.close();
}
}
/*
*刪除和修改我這裡先不寫了,大家理解就好
*/
本文就講到這,謝謝大家,歡迎大家指點謝謝!