maven依賴java
<dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.13</version> </dependency> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.2.3</version> </dependency>
Mybatis 全局配置文件mysql
<?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> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.cj.jdbc.Driver"/> <property name="url" value="jdbc:mysql://192.168.31.136:3306/mybatis"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment> </environments> <mappers> <mapper resource="UserMapper.xml"/> </mappers> </configuration>
建立實體類和Mapper配置文件sql
public class User { private Long id; private String name; private Integer age; }
<?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.godfunc.UserMapper"> <select id="selectUser" resultType="com.godfunc.User"> select * from user where id = #{id} </select> </mapper>
測試數據庫
@Test public void func1() throws IOException { String resource = "mybatis-config.xml"; InputStream resourceAsStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); User user = sqlSession.selectOne("com.godfunc.UserMapper.selectUser", 1L); log.error("result: {}", user); } sqlSession.close();
建立 UserMapper.java
apache
public interface UserMapper { User selectUser(Long id); }
將 UserMapper.xml
的 namespace
改成 UserMapper.java
的全類名。編程
測試緩存
@Test public void func2() throws IOException { String resource = "mybatis-config.xml"; InputStream resourceAsStream = Resources.getResourceAsStream(resource); SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsStream); SqlSession sqlSession = sqlSessionFactory.openSession(); UserMapper userMapper = sqlSession.getMapper(UserMapper.class); User user = userMapper.selectUser(1L); log.error("type {}", userMapper.getClass()); log.error("result: {}", user); sqlSession.close(); }
此時咱們看到控制檯將 userMapper
的 type 打印出來了:mybatis
[main] ERROR com.godfunc.Demo1 - type class com.sun.proxy.$Proxy5
在這裏咱們能夠看到,myBatis
爲 userMapper
建立了一個代理對象(也就是 UserMapper
的實現類 ),此時咱們就知道了,Mybatis
的接口式編程,其實最終仍是爲接口建立了實現類,而後調用實現方法,對數據庫進行操做。app
INSERT
返回主鍵maven
在 UserMapper.java
中加上 insert
void insert(User user);
在 UserMapper.xml
中配置 sql
<insert id="insert" parameterType="com.godfunc.User" useGeneratedKeys="true" keyProperty="id"> INSERT INTO user(name, age) values(#{name}, #{age}) </insert>
note: 若是參數是一個對象,咱們是能夠直接經過屬性名就行取值的。
多個參數,Mybatis
會作特殊處理,會將多個參數封裝到一個 map
中。map
的 key 是從 param1...paramn
接口方法和 sql 配置
<update id="update"> update user set name = #{param1}, age = #{param2} where id = #{param3} </update>
void update(String name, Integer age, Long id);
這樣,咱們能夠經過取出 map
中的多個參數,進行數據的更新。
note: 若是參數是 List
獲取 Array
, 裝到 map
中 key 的名字是 list
和array
以 update
爲例(這裏用的是@Param註解)
void update(@Param("name") String name, @Param("age") Integer age, @Param("id") Long id);
在執行update
方法時,會進入 org.apache.ibatis.binding.MapperProxy
類中,執行 invoke
方法,從類的命名上咱們能夠清楚的知道, MapperProxy
是Mapper的動態代理類
Map
接口和配置文件以下
@MapKey("id") Map<Long, User> selectResultMap();
<select id="selectResultMap" resultType="com.godfunc.User"> select * from user </select>
11:23:24.543 [main] ERROR com.godfunc.Demo1 - result {1=User{id=1, name='里斯', age=2}, 3=User{id=3, name='天全', age=3}, 8=User{id=8, name='王大山', age=34}, 9=User{id=9, name='天全11', age=3}}
Mapper 配置文件中返回值類型依舊是 User
,在接口方法聲明上使用 @MapKey("id")
將 返回結果中的 id
做爲 Map
的 key
.
接口和配置文件以下
public class User { private Long id; private String name; private Integer age; private Job job; }
User selectUserWithJob(Long id);
<resultMap id="userMap" type="com.godfunc.User"> <result column="id" property="id"/> <result column="name" property="name"/> <result column="age" property="age"/> <result column="job_id" property="job.id"/> <result column="job_name" property="job.name"/> <result column="u_id" property="job.uid"/> </resultMap> <select id="selectUserWithJob" resultMap="userMap"> select u.*, b.id job_id, b.name job_name, b.u_id from user u left join job b on b.u_id = u.id where u.id = #{id} </select>
這裏是一個對一關聯,也能夠使用 association
標籤作,可是這裏直接使用了 .
的方式。
當咱們進行子查詢,想要傳遞多個參數時,能夠這樣作 column="{key1=column1,key2=column2}"
*
fetchType="eager|lazy"
設置子查詢當即加載|懶加載
bind
將一個表達式的值綁定到一個變量中(能夠用來作模糊查詢的%
拼接)
<select id="selectByUserName" resultType="com.godfunc.User"> <bind name="_name" value="'%'+name+'%'"/> select * from user where name like #{_name} </select>
Note: 若是隻有一個參數,也要加 @Param
註解,否則會報錯