欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MyBatis實踐之DAO與Mapper

 更新時間:2016年03月10日 14:18:05   作者:翡青  
MyBatis前身是iBatis,是一個基于Java的數(shù)據(jù)持久層/對象關系映射(ORM)框架.通過本文給大家介紹MyBatis實踐之DAO與Mapper的相關知識,需要的朋友參考下吧

MyBatis簡介

MyBatis前身是iBatis,是一個基于Java的數(shù)據(jù)持久層/對象關系映射(ORM)框架.

MyBatis是對JDBC的封裝,使開發(fā)人員只需關注SQL本身,而不需花費過多的精力去處理如注冊驅(qū)動、設置參數(shù)、創(chuàng)建Connection/Statement、解析結(jié)果集等JDBC過程性代碼.MyBatis基于XML/注解的方式配置Statement,執(zhí)行SQL,并將執(zhí)行結(jié)果映射成Java對象, 大大降低了數(shù)據(jù)庫開發(fā)的難度.

MyBatis is a first class persistence framework with support for custom SQL, stored procedures and advanced mappings. MyBatis eliminates almost all of the JDBC code and manual setting of parameters and retrieval of results. MyBatis can use simple XML or Annotations for configuration and map primitives, Map interfaces and Java POJOs (Plain Old Java Objects) to database records.
– MyBatis項目地址/在線文檔.

初識MyBatis

使用MyBatis需要在pom.xml中添加如下依賴:

<code class="hljs xml"><dependency>
<groupid>org.mybatis</groupid>
<artifactid>mybatis</artifactid>
<version>3.3.0</version>
</dependency>
<dependency>
<groupid>mysql</groupid>
<artifactid>mysql-connector-java</artifactid>
<version>5.1.36</version>
</dependency></code>

Select

配置mybatis/mybatis-configuration.xml

作為MyBatis的全局配置文件,其配置了MyBatis的運行環(huán)境信息(如數(shù)據(jù)源/mapper文件等).

<code class="hljs xml"><code class="hljs xml"><!--{cke_protected}{C}%3C!%2D%2D%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20%3F%2D%2D%3E-->
<configuration>
<environments default="development">
<environment id="development">
<!--{cke_protected}{C}%3C!%2D%2D%20%E9%85%8D%E7%BD%AEJDBC%E4%BA%8B%E5%8A%A1%E7%AE%A1%E7%90%86%2D%2D%3E-->
<transactionmanager type="JDBC">
<!--{cke_protected}{C}%3C!%2D%2D%20%E9%85%8D%E7%BD%AE%E6%95%B0%E6%8D%AE%E6%BA%90%2D%2D%3E-->
<datasource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver">
<property name="url" value="jdbc:mysql://host:port/db?characterEncoding=utf-8">
<property name="username" value="username">
<property name="password" value="password">
</property></property></property></property></datasource>
</transactionmanager></environment>
</environments>
<!--{cke_protected}{C}%3C!%2D%2D%20%E5%8A%A0%E8%BD%BDmapper%E6%98%A0%E5%B0%84%E6%96%87%E4%BB%B6%20%2D%2D%3E-->
<mappers>
<mapper resource="mybatis/mapper/UserDAO.xml">
</mapper></mappers>
</configuration></code></code>

書寫UserDAO(mapper映射)

最為MyBatis最核心的部分,配置了操作數(shù)據(jù)庫的SQL語句:

<code class="hljs xml"><code class="hljs xml"><code class="hljs xml"><!--{cke_protected}{C}%3C!%2D%2D%3Fxml%20version%3D%221.0%22%20encoding%3D%22UTF-8%22%20%3F%2D%2D%3E-->
<mapper namespace="namespace">
<select id="selectUserById" parametertype="java.lang.Integer" resulttype="com.fq.domain.User">
SELECT * FROM user WHERE id = #{id};
</select>
<select id="selectUserByName" parametertype="java.lang.String" resulttype="com.fq.domain.User">
SELECT * FROM user WHERE name LIKE '%${value}%';
</select>
</mapper></code></code></code>

屬性 描述

namespace 命名空間,用于隔離SQL語句

parameterType 定義SQL輸入映射類型,MyBatis通過OGNL從輸入對象中獲取參數(shù)傳入SQL語句.

resultType 定義SQL輸出映射類型,MyBatis將SQL查詢結(jié)果的一行記錄映射為resultType指定的類型.

mapper映射文件名有UserDAO.xml/UserMapper.xml/User.xml等幾種形式, 其一般存放在與mybatis-configuration.xml同級的mapper目錄下,由于其主要作用為定義SQL語句與映射關系, 因此一般統(tǒng)稱為mapper映射文件.

定義PO類

PO類主要作用為SQL(輸入/輸出)映射,通常與數(shù)據(jù)庫表對應:

<code class="hljs xml"><code class="hljs xml"><code class="hljs xml"><code class="hljs java">/**
* @author jifang
* @since 15/12/31 下午2:27.
*/
public class User {
private Integer id;
private String name;
private String password;
public User() {
}
public User(Integer id, String name, String password) {
this.id = id;
this.name = name;
this.password = password;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", password='" + password + '\'' +
'}';
}
}</code></code></code></code>

UserDAO(Java對象)

獲得SqlSession,執(zhí)行SQL語句, 得到映射結(jié)果:

<code class="hljs xml"><code class="hljs xml"><code class="hljs xml"><code class="hljs java"><code class="hljs java">/**
* @author jifang
* @since 16/2/24 下午6:15.
*/
public class UserDAO {
private SqlSessionFactory factory;
@Before
public void setUp() throws IOException {
String resource = "mybatis/mybatis-configuration.xml";
factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream(resource));
}
@Test
public void selectUserById() {
try (SqlSession session = factory.openSession()) {
User user = session.selectOne("namespace.selectUserById", 1);
System.out.println(user);
}
}
@Test
public void selectUserByName() {
try (SqlSession session = factory.openSession()) {
List<user> users = session.selectList("namespace.selectUserByName", "student");
for (User user : users) {
System.out.println(user);
}
}
}
}</user></code></code></code></code></code>

Insert

mapper

<code class="hljs xml"><code class="hljs xml"><code class="hljs xml"><code class="hljs java"><code class="hljs java"><code class="hljs applescript"><insert id="insertUser" parametertype="com.fq.domain.User">
INSERT INTO user(name, password) VALUES(#{name}, #{password});
</insert></code></code></code></code></code></code>

UserDAO

<code class="hljs xml"><code class="hljs xml"><code class="hljs xml"><code class="hljs java"><code class="hljs java"><code class="hljs applescript"><code class="hljs java">@Test
public void insertUser() {
try (SqlSession session = factory.openSession()) {
User user = new User();
user.setName("new_name1");
user.setPassword("new_password");
session.insert("namespace.insertUser", user);
session.commit();
}
}</code></code></code></code></code></code></code>

自增主鍵返回

修改mapper文件,添加,可以將MySQL的自增主鍵(即剛剛插入數(shù)據(jù)時生成的ID)返回:

<code class="hljs xml"><code class="hljs xml"><code class="hljs xml"><code class="hljs java"><code class="hljs java"><code class="hljs applescript"><code class="hljs java"><code class="hljs xml"><insert id="insertUser" parametertype="com.fq.domain.User">
<selectkey keyproperty="id" order="AFTER" resulttype="java.lang.Integer">
SELECT LAST_INSERT_ID();
</selectkey>
INSERT INTO user(name, password) VALUES(#{name}, #{password});
</insert></code></code></code></code></code></code></code></code>

UserDAO

<code class="hljs xml"><code class="hljs xml"><code class="hljs xml"><code class="hljs java"><code class="hljs java"><code class="hljs applescript"><code class="hljs java"><code class="hljs xml"><code class="hljs cs">@Test
public void insertUser() {
try (SqlSession session = factory.openSession()) {
System.out.println(session);
User user = new User(null, "new_name", "new_password");
session.insert("namespace.insertUser", user);
// 需要在commit之后才能獲得自增主鍵
session.commit();
System.out.println(user.getId());
}
}</code></code></code></code></code></code></code></code></code>

該功能還可以通過的useGeneratedKeys/keyProperty兩個屬性合作完成, 詳見MyBatis文檔.

Update

mapper

<code class="hljs xml"><code class="hljs xml"><code class="hljs xml"><code class="hljs java"><code class="hljs java"><code class="hljs applescript"><code class="hljs java"><code class="hljs xml"><code class="hljs cs"><code class="hljs haml"><update id="updateUserById" parametertype="com.fq.domain.User">
UPDATE user SET name = #{name}, password = #{password} WHERE id = #{id};
</update></code></code></code></code></code></code></code></code></code></code>

UserDAO

<code class="hljs xml"><code class="hljs xml"><code class="hljs xml"><code class="hljs java"><code class="hljs java"><code class="hljs applescript"><code class="hljs java"><code class="hljs xml"><code class="hljs cs"><code class="hljs haml"><code class="hljs java">@Test
public void updateUserById() {
try (SqlSession session = factory.openSession(true)) {
session.update("namespace.updateUserById",
new User(1, "feiqing", "ICy5YqxZB1uWSwcVLSNLcA=="));
}
}</code></code></code></code></code></code></code></code></code></code></code>

Delete

mapper

<code class="hljs xml"><code class="hljs xml"><code class="hljs xml"><code class="hljs java"><code class="hljs java"><code class="hljs applescript"><code class="hljs java"><code class="hljs xml"><code class="hljs cs"><code class="hljs haml"><code class="hljs java"><code class="hljs livecodeserver"><delete id="deleteUserById" parametertype="java.lang.Integer">
DELETE FROM user WHERE id = #{id};
</delete></code></code></code></code></code></code></code></code></code></code></code></code>

UserDAO

<code class="hljs xml"><code class="hljs xml"><code class="hljs xml"><code class="hljs java"><code class="hljs java"><code class="hljs applescript"><code class="hljs java"><code class="hljs xml"><code class="hljs cs"><code class="hljs haml"><code class="hljs java"><code class="hljs livecodeserver"><code class="hljs java">@Test
public void deleteUserById() {
try (SqlSession session = factory.openSession(true)) {
session.delete("namespace.deleteUserById", 51615);
}
}</code></code></code></code></code></code></code></code></code></code></code></code></code>

小結(jié)

#{}/${}

#{}: 表示一個占位符號,實現(xiàn)向PreparedStatement占位符中設置值(#{}表示一個占位符?),自動進行Java類型到JDBC類型的轉(zhuǎn)換(因此#{}可以有效防止SQL注入).#{}可以接收簡單類型或PO屬性值,如果parameterType傳輸?shù)氖菃蝹€簡單類型值,#{}花括號中可以是value或其它名稱. ${}: 表示拼接SQL串,通過${}可將parameterType內(nèi)容拼接在SQL中而不進行JDBC類型轉(zhuǎn)換,${}可以接收簡單類型或PO屬性值,如果parameterType傳輸?shù)氖菃蝹€簡單類型值,${}花括號中只能是value.

雖然${}不能防止SQL注入,但有時${}會非常方便(如order by排序,需要將列名通過參數(shù)傳入SQL,則用ORDER BY ${column},使用#{}則無法實現(xiàn)此功能(詳見JDBC基礎關于PreparedStatement的討論).

SqlSession

提供操作數(shù)據(jù)庫的方法(如:selectOne/selectList).但SqlSession是線程不安全的,因此最好將其定義成局部變量使用.

MyBatis優(yōu)點(與JDBC相比)

SQL寫在Java代碼中導致不易維護, 而MyBatis將SQL寫在mapper中,XML與Java代碼分離. 向SQL語句傳參繁瑣(如:SQL的where條件不一,SQL數(shù)據(jù)類型與Java不同),MyBatis通過parameterType自動將Java對象映射至SQL語句. 結(jié)果集解析麻煩(SQL變化導致解析代碼變化,SQL數(shù)據(jù)類型與Java不同),MyBatis通過resultType自動將SQL執(zhí)行結(jié)果映射成Java對象.
附: 最好在pom.xml中添加一個日志系統(tǒng)實現(xiàn)(logback/log4j), 這樣會在調(diào)試程序時打印日志信息,便于查錯, 以logback為例:

pom.xml

<code class="hljs xml"><code class="hljs xml"><code class="hljs xml"><code class="hljs java"><code class="hljs java"><code class="hljs applescript"><code class="hljs java"><code class="hljs xml"><code class="hljs cs"><code class="hljs haml"><code class="hljs java"><code class="hljs livecodeserver"><code class="hljs java"><code class="hljs xml"><dependency>
<groupid>ch.qos.logback</groupid>
logback-classic</artifactid>
<version>1.1.2</version>
</dependency></code></code></code></code></code></code></code></code></code></code></code></code></code></code>

logback.xml

<code class="hljs xml"><code class="hljs xml"><code class="hljs xml"><code class="hljs java"><code class="hljs java"><code class="hljs applescript"><code class="hljs java"><code class="hljs xml"><code class="hljs cs"><code class="hljs haml"><code class="hljs java"><code class="hljs livecodeserver"><code class="hljs java"><code class="hljs xml"><code class="hljs xml"><configuration>


<property name="logRoot" value="/data/logs">
<property name="pattern" value="%d{HH:mm:ss.SSS} [%thread] %-5level %logger{0} - %msg%n">
<appender class="ch.qos.logback.core.ConsoleAppender" name="STDOUT">
<encoder>
<pattern>${pattern}</pattern>
</encoder>
</appender>
<appender class="ch.qos.logback.core.rolling.RollingFileAppender" name="FILE">
<rollingpolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
<filenamepattern>${logRoot}/common-server.%d{yyyy-MM-dd}.log</filenamepattern>
<maxhistory>7</maxhistory>
</rollingpolicy>
<encoder>
<pattern>${pattern}</pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="STDOUT">
<appender-ref ref="FILE">
</appender-ref></appender-ref></root>
</property></property></configuration></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code>

其他關于MyBatis日志的詳細信息可參考MyBatis文檔日志部分.

DAO開發(fā)

使用MyBatis開發(fā)DAO有兩個方法,原始DAO開發(fā)與Mapper映射DAO開發(fā).

原始DAO開發(fā)
原始DAO開發(fā)需要開發(fā)人員編寫DAO接口與DAO實現(xiàn),如根據(jù)ID查詢用戶信息:

mapper(同前)

<code class="hljs xml"><code class="hljs xml"><code class="hljs xml"><code class="hljs java"><code class="hljs java"><code class="hljs applescript"><code class="hljs java"><code class="hljs xml"><code class="hljs cs"><code class="hljs haml"><code class="hljs java"><code class="hljs livecodeserver"><code class="hljs java"><code class="hljs xml"><code class="hljs xml"><code class="hljs vbnet"><select id="selectUserById" parametertype="java.lang.Integer" resulttype="com.fq.domain.User">
SELECT * FROM user WHERE id = #{id};
</select></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code>

UserDAO接口

<code class="hljs xml"><code class="hljs xml"><code class="hljs xml"><code class="hljs java"><code class="hljs java"><code class="hljs applescript"><code class="hljs java"><code class="hljs xml"><code class="hljs cs"><code class="hljs haml"><code class="hljs java"><code class="hljs livecodeserver"><code class="hljs java"><code class="hljs xml"><code class="hljs xml"><code class="hljs vbnet"><code class="hljs java">/**
* @author jifang
* @since 16/2/22 上午10:20.
*/
public interface UserDAO {
User selectUserById(Integer id) throws Exception;
}</code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code>

UserDAO實現(xiàn)

<code class="hljs xml"><code class="hljs xml"><code class="hljs xml"><code class="hljs java"><code class="hljs java"><code class="hljs applescript"><code class="hljs java"><code class="hljs xml"><code class="hljs cs"><code class="hljs haml"><code class="hljs java"><code class="hljs livecodeserver"><code class="hljs java"><code class="hljs xml"><code class="hljs xml"><code class="hljs vbnet"><code class="hljs java"><code class="hljs java">public class UserDAOImpl implements UserDAO {
private SqlSessionFactory factory;
public UserDAOImpl(SqlSessionFactory factory) {
this.factory = factory;
}
@Override
public User selectUserById(Integer id) throws Exception {
SqlSession session = factory.openSession();
User user = session.selectOne("namespace.selectUserById", id);
session.close();
return user;
}
}</code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code>

Client

<code class="hljs xml"><code class="hljs xml"><code class="hljs xml"><code class="hljs java"><code class="hljs java"><code class="hljs applescript"><code class="hljs java"><code class="hljs xml"><code class="hljs cs"><code class="hljs haml"><code class="hljs java"><code class="hljs livecodeserver"><code class="hljs java"><code class="hljs xml"><code class="hljs xml"><code class="hljs vbnet"><code class="hljs java"><code class="hljs java"><code class="hljs cs">public class MyBatisClient {
@Test
public void originalClient() throws Exception {
UserDAO dao = new UserDAOImpl(new SqlSessionFactoryBuilder().
build(ClassLoader.getSystemResourceAsStream("mybatis/mybatis-configuration.xml")));
User user = dao.selectUserById(1);
System.out.println(user);
}
}</code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code>

原始DAO開發(fā)中存在的問題:

1) DAO實現(xiàn)方法體中存在很多過程性代碼.
2) 調(diào)用SqlSession的方法(select/insert/update)需要指定Statement的id,存在硬編碼,不利于代碼維護.

Mapper映射開發(fā)

mapper映射開發(fā)方法只需編寫DAO接口,MyBatis根據(jù)接口定義與mapper文件中的SQL語句動態(tài)創(chuàng)建接口實現(xiàn).

mapper

<code class="hljs xml"><code class="hljs xml"><code class="hljs xml"><code class="hljs java"><code class="hljs java"><code class="hljs applescript"><code class="hljs java"><code class="hljs xml"><code class="hljs cs"><code class="hljs haml"><code class="hljs java"><code class="hljs livecodeserver"><code class="hljs java"><code class="hljs xml"><code class="hljs xml"><code class="hljs vbnet"><code class="hljs java"><code class="hljs java"><code class="hljs cs"><code class="hljs xml"><!--?xml version="1.0" encoding="UTF-8" ?-->
<mapper namespace="com.fq.mybatis.UserDAO">
<select id="selectUserById" parametertype="java.lang.Integer" resulttype="com.fq.domain.User">
SELECT * FROM user WHERE id = #{id};
</select>
</mapper></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code>

注意: 此時namespace必須與UserDAO接口的全限定名相同.

UserDAO接口與前面相同, 但不再使用UserDAOImpl Client

<code class="hljs xml"><code class="hljs xml"><code class="hljs xml"><code class="hljs java"><code class="hljs java"><code class="hljs applescript"><code class="hljs java"><code class="hljs xml"><code class="hljs cs"><code class="hljs haml"><code class="hljs java"><code class="hljs livecodeserver"><code class="hljs java"><code class="hljs xml"><code class="hljs xml"><code class="hljs vbnet"><code class="hljs java"><code class="hljs java"><code class="hljs cs"><code class="hljs xml"><code class="hljs java">/**
* @author jifang
* @since 16/2/22 下午2:57.
*/
public class MyBatisClient {
private SqlSession session;
private SqlSessionFactory factory;
@Before
public void setUp() {
factory = new SqlSessionFactoryBuilder().
build(ClassLoader.getSystemResourceAsStream("mybatis/mybatis-configuration.xml"));
session = factory.openSession();
}
@Test
public void mapperClient() throws Exception {
UserDAO dao = session.getMapper(UserDAO.class);
User user = dao.selectUserById(1);
System.out.println(user);
}
@After
public void tearDown() {
session.close();
}
}</code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code>

mapper映射開發(fā)方法需要遵循以下規(guī)范:

mapper文件中的namespace與DAO接口的全限定名相同; mapper文件中的Statement的id與DAO接口方法名相同; mapper文件中的Statement的parameterType/resultType與DAO方法的入?yún)?回參類型相同.

Mapper映射

mapper映射文件(如UserDAO.xml)主要作用是定義SQL語句(每個SQL是一個Statement),是MyBatis的核心.

MyBatis官方推薦使用mapper映射的方法來開發(fā)DAO,因此我們以后就不再過多介紹原始DAO的開發(fā).

輸入映射

多個形參

傳遞簡單類型前面示例已經(jīng)使用過,在此就不再贅述.當需要傳遞多個形參時,不再需要設置parameterType參數(shù):

mapper

<code class="hljs xml"><code class="hljs xml"><code class="hljs xml"><code class="hljs java"><code class="hljs java"><code class="hljs applescript"><code class="hljs java"><code class="hljs xml"><code class="hljs cs"><code class="hljs haml"><code class="hljs java"><code class="hljs livecodeserver"><code class="hljs java"><code class="hljs xml"><code class="hljs xml"><code class="hljs vbnet"><code class="hljs java"><code class="hljs java"><code class="hljs cs"><code class="hljs xml"><code class="hljs java"><code class="hljs haml"><update id="updateUserById">
UPDATE user SET name = #{1}, password = #{2} WHERE id = #{0};
</update></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code>

UserDAO

<code class="hljs xml"><code class="hljs xml"><code class="hljs xml"><code class="hljs java"><code class="hljs java"><code class="hljs applescript"><code class="hljs java"><code class="hljs xml"><code class="hljs cs"><code class="hljs haml"><code class="hljs java"><code class="hljs livecodeserver"><code class="hljs java"><code class="hljs xml"><code class="hljs xml"><code class="hljs vbnet"><code class="hljs java"><code class="hljs java"><code class="hljs cs"><code class="hljs xml"><code class="hljs java"><code class="hljs haml"><code class="hljs lasso">void updateUserById(Integer id, String name, String password) throws Exception;</code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code>

傳入PO

MyBatis使用OGNL表達式解析對象屬性值:

mapper

<code class="hljs xml"><code class="hljs xml"><code class="hljs xml"><code class="hljs java"><code class="hljs java"><code class="hljs applescript"><code class="hljs java"><code class="hljs xml"><code class="hljs cs"><code class="hljs haml"><code class="hljs java"><code class="hljs livecodeserver"><code class="hljs java"><code class="hljs xml"><code class="hljs xml"><code class="hljs vbnet"><code class="hljs java"><code class="hljs java"><code class="hljs cs"><code class="hljs xml"><code class="hljs java"><code class="hljs haml"><code class="hljs lasso"><code class="hljs vbnet"><select id="selectUserByNamePassword" parametertype="com.fq.domain.User" resulttype="com.fq.domain.User">
SELECT *
FROM user
WHERE name = #{name} AND password = #{password};
</select></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code>

UserDAO

<code class="hljs xml"><code class="hljs xml"><code class="hljs xml"><code class="hljs java"><code class="hljs java"><code class="hljs applescript"><code class="hljs java"><code class="hljs xml"><code class="hljs cs"><code class="hljs haml"><code class="hljs java"><code class="hljs livecodeserver"><code class="hljs java"><code class="hljs xml"><code class="hljs xml"><code class="hljs vbnet"><code class="hljs java"><code class="hljs java"><code class="hljs cs"><code class="hljs xml"><code class="hljs java"><code class="hljs haml"><code class="hljs lasso"><code class="hljs vbnet"><code class="hljs java">User selectUserByNamePassword(User user) throws Exception;</code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code>

mapper

<code class="hljs xml"><code class="hljs xml"><code class="hljs xml"><code class="hljs java"><code class="hljs java"><code class="hljs applescript"><code class="hljs java"><code class="hljs xml"><code class="hljs cs"><code class="hljs haml"><code class="hljs java"><code class="hljs livecodeserver"><code class="hljs java"><code class="hljs xml"><code class="hljs xml"><code class="hljs vbnet"><code class="hljs java"><code class="hljs java"><code class="hljs cs"><code class="hljs xml"><code class="hljs java"><code class="hljs haml"><code class="hljs lasso"><code class="hljs vbnet"><code class="hljs java"><code class="hljs vbnet"><select id="selectUserByMap" parametertype="java.util.Map" resulttype="com.fq.domain.User">
SELECT *
FROM user
WHERE name = #{name} AND password = #{password};
</select></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code>

#{}花括號內(nèi)對應Map的key.

UserDAO

<code class="hljs xml"><code class="hljs xml"><code class="hljs xml"><code class="hljs java"><code class="hljs java"><code class="hljs applescript"><code class="hljs java"><code class="hljs xml"><code class="hljs cs"><code class="hljs haml"><code class="hljs java"><code class="hljs livecodeserver"><code class="hljs java"><code class="hljs xml"><code class="hljs xml"><code class="hljs vbnet"><code class="hljs java"><code class="hljs java"><code class="hljs cs"><code class="hljs xml"><code class="hljs java"><code class="hljs haml"><code class="hljs lasso"><code class="hljs vbnet"><code class="hljs java"><code class="hljs vbnet"><code class="hljs vhdl">User selectUserByMap(Map<string, object=""> map) throws Exception;</string,></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code>

輸出映射

輸出簡單類型

mapper

<code class="hljs xml"><code class="hljs xml"><code class="hljs xml"><code class="hljs java"><code class="hljs java"><code class="hljs applescript"><code class="hljs java"><code class="hljs xml"><code class="hljs cs"><code class="hljs haml"><code class="hljs java"><code class="hljs livecodeserver"><code class="hljs java"><code class="hljs xml"><code class="hljs xml"><code class="hljs vbnet"><code class="hljs java"><code class="hljs java"><code class="hljs cs"><code class="hljs xml"><code class="hljs java"><code class="hljs haml"><code class="hljs lasso"><code class="hljs vbnet"><code class="hljs java"><code class="hljs vbnet"><code class="hljs vhdl"><code class="hljs vbnet"><select id="selectUserCount" parametertype="java.lang.String" resulttype="java.lang.Integer">
SELECT count(*)
FROM user
WHERE name LIKE '%${value}%';
</select></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code>

UserDAO

<code class="hljs xml"><code class="hljs xml"><code class="hljs xml"><code class="hljs java"><code class="hljs java"><code class="hljs applescript"><code class="hljs java"><code class="hljs xml"><code class="hljs cs"><code class="hljs haml"><code class="hljs java"><code class="hljs livecodeserver"><code class="hljs java"><code class="hljs xml"><code class="hljs xml"><code class="hljs vbnet"><code class="hljs java"><code class="hljs java"><code class="hljs cs"><code class="hljs xml"><code class="hljs java"><code class="hljs haml"><code class="hljs lasso"><code class="hljs vbnet"><code class="hljs java"><code class="hljs vbnet"><code class="hljs vhdl"><code class="hljs vbnet"><code class="hljs mathematica">Integer selectUserCount(String name) throws Exception;</code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code></code>

返回簡單類型必須保證查詢結(jié)果只有一行記錄,最終將第一個字段的值轉(zhuǎn)換為輸出類型.

輸出PO對象/列表

前面已經(jīng)演示過輸出兩種類型(selectUserById/selectUserByName雖然當時使用的是原始DAO開發(fā)方法, 但mapper定義形式大同小異),因此在這兒只做簡單總結(jié):

輸出單個PO對象和輸出PO列表在mapper中定義的resultType是一樣的; 輸出單個PO對象要保證SQL查詢結(jié)果為單條數(shù)據(jù),其內(nèi)部使用selectOne方法調(diào)用; 輸出PO列表表示查詢結(jié)果可能為多條,其內(nèi)部使用selectList方法調(diào)用,接口返回值可用List/Set承載.

輸出Map

輸出PO對象完全可以改用Map輸出,字段名作key,字段值作value.

mapper

<code class="hljs vbnet"><select id="selectUserLikeName" resulttype="java.util.Map">
SELECT *
FROM user
WHERE name LIKE '%${value}%';
</select></code>

UserDAO

<code class="hljs vbnet"><code class="hljs mathematica">List<map<string, object="">> selectUserLikeName(String name) throws Exception;</map<string,></code></code>

resultMap

resultType可將查詢結(jié)果映射為PO,但前提是PO屬性名與SQL字段名必須一致,如不一致,則可通過resultMap作對應映射:

mapper

<code class="hljs vbnet"><code class="hljs mathematica"><code class="hljs applescript"><resultmap id="userMap" type="com.fq.domain.User">
<id column="user_id" property="id">
<result column="user_name" property="name">
<result column="user_password" property="password">
</result></result></id></resultmap>
<select id="selectUserByName" parametertype="java.lang.String" resultmap="userMap">
SELECT
id user_id,
name user_name,
password user_password
FROM user
WHERE name = #{name};
</select></code></code></code>

UserDAO接口同前.

相關文章

  • Java 駝峰命名法詳解(必看篇)

    Java 駝峰命名法詳解(必看篇)

    下面小編就為大家?guī)硪黄狫ava 駝峰命名法詳解(必看篇)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • java反射耗時測試案例解析

    java反射耗時測試案例解析

    這篇文章主要介紹了java反射耗時測試案例解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2019-10-10
  • Tomcat Cannot assign requested address: JVM_Bind 非端口占用沖突

    Tomcat Cannot assign requested address: JVM_Bind 非端口占用沖突

    這篇文章主要介紹了 Tomcat Cannot assign requested address: JVM_Bind 非端口占用沖突的相關資料,需要的朋友可以參考下
    2017-01-01
  • java快速解析路徑中的參數(shù)(&與=拼接的參數(shù))

    java快速解析路徑中的參數(shù)(&與=拼接的參數(shù))

    這篇文章主要介紹了java快速解析路徑中的參數(shù)(&與=拼接的參數(shù)),本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友參考下吧
    2024-02-02
  • 一篇文章總結(jié)Java虛擬機內(nèi)存區(qū)域模型

    一篇文章總結(jié)Java虛擬機內(nèi)存區(qū)域模型

    這篇文章主要介紹了一篇文章總結(jié)Java虛擬機內(nèi)存區(qū)域模型,本篇文章主要來總結(jié)一下Java虛擬機內(nèi)存的各個區(qū)域,以及這些區(qū)域的作用、服務對象以及其中可能產(chǎn)生的問題,作為大家的面試寶典。,需要的朋友可以參考下
    2019-06-06
  • Java ZooKeeper分布式鎖實現(xiàn)圖解

    Java ZooKeeper分布式鎖實現(xiàn)圖解

    ZooKeeper是一個分布式的,開放源碼的分布式應用程序協(xié)調(diào)服務,是Google的Chubby一個開源的實現(xiàn),是Hadoop和Hbase的重要組件。它是一個為分布式應用提供一致性服務的軟件,提供的功能包括:配置維護、域名服務、分布式同步、組服務等
    2022-03-03
  • SpringBoot?Seata?死鎖問題排查記錄

    SpringBoot?Seata?死鎖問題排查記錄

    這篇文章主要介紹了SpringBoot?Seata?死鎖問題排查,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-12-12
  • java對象初始化順序驗證示例

    java對象初始化順序驗證示例

    以下這段小程序?qū)φ{(diào)用對象構(gòu)造函數(shù)時,父類構(gòu)造函數(shù)、成員變量初始化函數(shù),以及非靜態(tài)初始化塊調(diào)用順序進行驗證,不考慮靜態(tài)成員及靜態(tài)初始化塊
    2014-02-02
  • Java中的main函數(shù)的詳細介紹

    Java中的main函數(shù)的詳細介紹

    這篇文章主要介紹了Java中的main函數(shù)的詳細介紹的相關資料,main()函數(shù)在java程序中必出現(xiàn)的函數(shù),這里就講解下使用方法,需要的朋友可以參考下
    2017-09-09
  • Spring Boot Maven 打包可執(zhí)行Jar文件的實現(xiàn)方法

    Spring Boot Maven 打包可執(zhí)行Jar文件的實現(xiàn)方法

    這篇文章主要介紹了Spring Boot Maven 打包可執(zhí)行Jar文件的實現(xiàn)方法,需要的朋友可以參考下
    2018-02-02

最新評論