一.properties
這些屬性都是可外部配置且可動態替換的,既可以在典型的 Java 屬性文件中配置,亦可通過 properties 元素的子元素來傳遞。例如
1)
<?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> <properties resource="db.properties"/> <typeAliases> <package name="com.shsxt.po"></package> </typeAliases> <environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <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> <package name="com.shsxt.mapper"/> <!--<mapper resource="com.shsxt.mapper.UserMapper"></mapper>--> </mappers> </configuration>
這種方法是將數據源的屬性放在db.properties中,然后在mybatis中讀取property的value值,需要在<configuration>中配置一個properties的屬性,<properties resource="db.properties"/>
db.properties的內容如下:
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis02?useSSL=false
username=root
password=123456
2)直接將屬性的value值寫死在mybaties.xml
<environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/mybatis?useSSL=false"/> <property name="username" value="root"/> <property name="password" value="123456"/> </dataSource> </environment>
二,typeAliases
有三種方式配置typeAliases,第一種方式是手動配置別名,第二種方式是通過注解,第三種方式是通過掃描包(推薦使用該方式)
在configuration標簽中添加如下標簽,
<typeAliases>
<typeAlias type="com.shsxt.po.User alise="user"/>
</typeAliases>
通過包掃描的方式配置別名
<typeAliases>
<package name="com.shsxt.po" >
<typeAliases>
3,注解的方式配置別名
暫時不用
三,typeHandles類型處理器
無論是 MyBatis 在預處理語句(PreparedStatement)中設置一個參數時,還是從結果集中取出一個值時, 都會用類型處理器將獲取的值以合適的方式轉換成 Java類型。
下表描述了一些默認的類型處理器。
四,環境配置
MyBatis 可以配置成適應多種環境,這種機制有助於將 SQL 映射應用於多種數據庫之中, 現實情況下有多種理由需要這么做。例如,開發、測試和生產環境需要有不同的配置;或者共享相同 Schema 的多個生產數據庫, 想使用相同的 SQL 映射。許多類似的用例。不過要記住:盡管可以配置多個環境,每個 不過要記住:盡管可以配置多個環境,每個SqlSessionFactory 實例只能選 實例只能選擇其一。所以,如果你想連接兩個數據庫,就需要創建兩個 SqlSessionFactory 實例,每個數據庫對應一個。而如果是三個數據庫,就需要三個實例,依此類推,記起來很簡單:
<environments default="development"> <environment id="development"> <transactionManager type="JDBC"/> <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> <environment id="test"> <transactionManager type="JDBC"/> <dataSource type="POOLED"> <property name="driver" value="${driver2}"/> <property name="url" value="${url2}"/> <property name="username" value="${username2}"/> <property name="password" value="${password2}"/> </dataSource> </environment> </environments>
db.properties文件
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/mybatis02?useSSL=false
username=root
password=123456
driver2=com.mysql.jdbc.Driver
url2=jdbc:mysql://localhost:3306/mybatis?useSSL=false
username2=root
password2=123456
五,DataSource數據源
dataSource 元素使用標准的 JDBC 數據源接口來配置 JDBC 連接對象的資源。數據源類型有三種:UNPOOLED,POOLED,JNDI。
UNPOOLED是沒有數據庫連接池的,沒執行一次操作,打開一次數據庫,關閉一次數據庫.效率較為低下
POOLED是存在數據庫連接池的,沒有操作數據庫從數據庫連接池中拿取連接
JNDI這個數據源的實現是為了能在如 EJB 或應用服務器這類容器中使用,容器可以集中或在外部配置數據源,然后放置一個 JNDI 上下文的引用。
六 mapper映射器(4種配置)
第一種 配置文件路徑(相對項目的相對路徑)
<mappers> <mapper resource="com/shsxt/mapper/UserMapper.xml"></mapper> </mappers>
第二種 配置文件的絕對路徑(不推薦使用,隨着項目的變更,路徑也要改變,比較麻煩)
<mappers> <mapper url="file:///F:/IDEA/mybatis02/src/main/resources/mybatis.xml"/> </mappers>
第三種 注解形式配置(用的相對較少)
<mappers> <mapper class="com.shsxt.mapper.UserMapper"/> </mappers>
配置注解的時候,在接口的方法要加上注解,映射文件中可以不用配置sql語句
第四種 映射包下所有接口(較為常用)
<mappers> <package name="com.shsxt.mapper"/> </mapper>
七,封裝Dao
將UserMapper的接口實現,將接口里方法重寫並且實現封裝
import com.shsxt.mapper.UserMapper; import com.shsxt.po.User; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import java.util.List; import java.util.Map; public class UserMapperImpl implements UserMapper { private SqlSessionFactory sqlSessionFactory; public UserMapperImpl(SqlSessionFactory sqlSessionFactory) { this.sqlSessionFactory = sqlSessionFactory; } @Override public User queryById(Integer id) { SqlSession session=null; User user=null; try { session=sqlSessionFactory.openSession(); user=session.selectOne("com.shsxt.mapper.UserMapper.queryById" ,id); }catch (Exception e){ e.printStackTrace(); }finally { if(session!=null){ session.close(); } } return user; }
八,增刪改查,在UserMapper.xml的文件中配置
UserMapper.xm的文件配置內容如下
<?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.shsxt.mapper.UserMapper"> <sql id="sql">username,realname,password</sql> <resultMap id="usermap" type="user"> <id column="id" property="id"/> <result column="username" property="user_name"/> <result column="realname" property="realname"/> <result column="password" property="password"/> </resultMap> <select id="queryById" parameterType="int" resultMap="usermap"> select * from user where id=#{id} </select> <select id="queryAll" resultType="int"> select count(*) from user </select> <select id="queryUname" resultType="String" > select username from user where id =#{id} </select> <select id="queryByName" parameterType="user" resultType="user"> select username from user where username like concat('%',#{username},'%') </select> <select id="queryIdByMap" parameterType="int" resultType="map"> select * from user where id=#{id} </select> <select id="queryUserByMap" parameterType="map" resultType="user"> select * from user where id=#{id} and username=#{username} </select> <insert id="insertByUser" parameterType="user"> insert into user (username,realname,password) values (#{username},#{realname},#{password}) </insert> <insert id="insertByUserHasKey" parameterType="user"> <selectKey keyProperty="id" order="AFTER" resultType="int"> select LAST_INSERT_ID() as id </selectKey> insert into user (username,realname,password) values (#{username},#{realname},#{password}) </insert> <insert id="insertByUserHasKey02" parameterType="user" useGeneratedKeys="true" keyProperty="id"> insert into user (username,realname,password) values (#{username},#{realname},#{password}) </insert> <insert id="insertByUserBatch" parameterType="list" > insert into user (username,realname,password) values <foreach collection="list" item="item" separator=","> (#{item.username},#{item.realname},#{item.password}) </foreach> </insert> <update id="updateUser" parameterType="user"> update user set username=#{username}, realname=#{realname},password=#{password} where id=#{id} </update> <update id="updataUserBatch" > update user set password='88888888' where id in ( <foreach collection="array" item="item" separator="," index="index"> #{item} </foreach> ) </update> <delete id="deleteUser" parameterType="int"> delete from user where id=#{id} </delete> <delete id="deleteUserBatch" parameterType="list"> delete from user where id in ( <foreach collection="list" item="item" separator="," index="index"> #{item} </foreach> ) </delete> </mapper>
實現類UserMapperImpl的配置如下:
package com.shsxt.mapper.Impl; import com.shsxt.mapper.UserMapper; import com.shsxt.po.User; import org.apache.ibatis.session.SqlSession; import org.apache.ibatis.session.SqlSessionFactory; import java.util.List; import java.util.Map; public class UserMapperImpl implements UserMapper { private SqlSessionFactory sqlSessionFactory; public UserMapperImpl(SqlSessionFactory sqlSessionFactory) { this.sqlSessionFactory = sqlSessionFactory; } @Override public User queryById(Integer id) { SqlSession session=null; User user=null; try { session=sqlSessionFactory.openSession(); user=session.selectOne("com.shsxt.mapper.UserMapper.queryById" ,id); }catch (Exception e){ e.printStackTrace(); }finally { if(session!=null){ session.close(); } } return user; } @Override public Integer queryAll() { SqlSession session=null; Integer a=null; try { session=sqlSessionFactory.openSession(); a=session.selectOne("com.shsxt.mapper.UserMapper.queryAll" ); }catch (Exception e){ e.printStackTrace(); }finally { if(session!=null){ session.close(); } } return a; } @Override public String queryUname(Integer id) { SqlSession session=null; String abc=null; try { session=sqlSessionFactory.openSession(); abc=session.selectOne("com.shsxt.mapper.UserMapper.queryUname", id); }catch (Exception e){ e.printStackTrace(); }finally { if(session!=null){ session.close(); } } return abc; } @Override public List<User> queryByName(User user) { SqlSession session=null; List<User> list=null; try { session=sqlSessionFactory.openSession(); list=session.selectList("com.shsxt.mapper.UserMapper.queryByName", user); }catch (Exception e){ e.printStackTrace(); }finally { if(session!=null){ session.close(); } } return list; } @Override public Map queryIdByMap(Integer id) { SqlSession sqlsession=null; Map map=null; try{ sqlsession=sqlSessionFactory.openSession(); map=sqlsession.selectOne("com.shsxt.mapper.UserMapper.queryIdByMap",id); }catch (Exception e){ e.printStackTrace(); }finally { if(sqlsession!=null){ sqlsession.close(); } } return map; } @Override public Integer insertByUser(User user) { SqlSession session=null; Integer a=null; try { session=sqlSessionFactory.openSession(); a=session.insert("com.shsxt.mapper.UserMapper.insertByUser",user); }catch (Exception e){ e.printStackTrace(); }finally { if(session!=null){ session.close(); } } return a; } @Override public Integer insertByUserHasKey(User user) { SqlSession session=null; Integer a=null; try { session=sqlSessionFactory.openSession(); a=session.insert("com.shsxt.mapper.UserMapper.insertByUserHasKey",user); }catch (Exception e){ e.printStackTrace(); }finally { if(session!=null){ session.commit(); session.close(); } } return a; } @Override public Integer insertByUserHasKey02(User user) { SqlSession session=null; Integer a=null; try { session=sqlSessionFactory.openSession(); a=session.insert("com.shsxt.mapper.UserMapper.insertByUserHasKey02",user); }catch (Exception e){ e.printStackTrace(); }finally { if(session!=null){ session.commit(); session.close(); } } return a; } @Override public Integer insertByUserBatch(List<User> list) { SqlSession session=null; Integer a=null; try { session=sqlSessionFactory.openSession(); a=session.insert("com.shsxt.mapper.UserMapper.insertByUserBatch",list); }catch (Exception e){ e.printStackTrace(); }finally { if(session!=null){ session.commit(); session.close(); } } return a; } @Override public User queryUserByMap(Map map) { SqlSession session=null; User user=null; try { session=sqlSessionFactory.openSession(); user=session.selectOne("com.shsxt.mapper.UserMapper.queryUserByMap",map); }catch (Exception e){ e.printStackTrace(); }finally { if(session!=null){ session.commit(); session.close(); } } return user; } @Override public Integer updateUser(User user) { SqlSession session=null; Integer a =null; try { session=sqlSessionFactory.openSession(); a=session.update("com.shsxt.mapper.UserMapper.updateUser",user); }catch (Exception e){ e.printStackTrace(); }finally { if(session!=null){ session.commit(); session.close(); } } return a; } @Override public Integer updataUserBatch(Integer[] ids) { SqlSession session=null; Integer aa=null; try { session=sqlSessionFactory.openSession(); aa=session.update("com.shsxt.mapper.UserMapper.updataUserBatch",ids); }catch (Exception e){ e.printStackTrace(); }finally { if(session!=null){ session.commit(); session.close(); } } return aa; } @Override public Integer deleteUser(Integer id) { SqlSession session=null; Integer aa=null; try { session=sqlSessionFactory.openSession(); aa=session.delete("com.shsxt.mapper.UserMapper.deleteUser",id); }catch (Exception e){ e.printStackTrace(); }finally { if(session!=null){ session.commit(); session.close(); } } return aa; } @Override public Integer deleteUserBatch(List<Integer> ids) { SqlSession session=null; Integer aa=null; try { session=sqlSessionFactory.openSession(); aa=session.update("com.shsxt.mapper.UserMapper.deleteUserBatch",ids); }catch (Exception e){ e.printStackTrace(); }finally { if(session!=null){ session.commit(); session.close(); } } return aa; } }
測試單元的代碼如下:
package com.shsxt; import com.shsxt.mapper.Impl.UserMapperImpl; import com.shsxt.mapper.UserMapper; import com.shsxt.po.User; import org.apache.ibatis.io.Resources; import org.apache.ibatis.session.SqlSessionFactory; import org.apache.ibatis.session.SqlSessionFactoryBuilder; import org.junit.Before; import org.junit.Test; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class Test_mybatis02 { SqlSessionFactory sqlSessionFactory; @Before public void ready() throws IOException { InputStream inputStream= Resources.getResourceAsStream("mybatis.xml"); sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); } /* * queryById*/ @Test public void test01(){ UserMapper userMapper=new UserMapperImpl(sqlSessionFactory); User user= userMapper.queryById(1); System.out.println(user); } @Test public void test02(){ UserMapper userMapper=new UserMapperImpl(sqlSessionFactory); Integer a = userMapper.queryAll(); System.out.println("總數量是:"+a); } @Test public void test03(){ UserMapper userMapper=new UserMapperImpl(sqlSessionFactory); String aa = userMapper.queryUname(1); System.out.println("id為1的uname是:"+aa); } @Test public void test04(){ UserMapper userMapper=new UserMapperImpl(sqlSessionFactory); User user=new User(); user.setUser_name("hello"); List<User> lists = userMapper.queryByName(user); for (User per_user :lists) { System.out.println(per_user); } } @Test public void test05(){ UserMapper userMapper=new UserMapperImpl(sqlSessionFactory); Map map= userMapper.queryIdByMap(1); System.out.println(((Map) map).toString()); } @Test public void test06(){ UserMapper userMapper=new UserMapperImpl(sqlSessionFactory); User user=new User(); user.setUser_name("ahah"); user.setRealname("papapa"); user.setPassword("89533"); Integer aavv=userMapper.insertByUser(user); System.out.println(aavv); } @Test public void test07(){ UserMapper userMapper=new UserMapperImpl(sqlSessionFactory); User user=new User(); user.setUser_name("ahah"); user.setRealname("papapa"); user.setPassword("89533"); Integer aavv=userMapper.insertByUserHasKey(user); System.out.println("受影響的行數: "+aavv); System.out.println("返回的id是: "+user.getId()); } @Test public void Test08(){ UserMapper userMapper=new UserMapperImpl(sqlSessionFactory); User user=new User(); user.setUser_name("ahah"); user.setRealname("papapa"); user.setPassword("89533"); Integer aavv=userMapper.insertByUserHasKey02(user); System.out.println("受影響的行數: "+aavv); System.out.println("返回的id是: "+user.getId()); } @Test public void Test09(){ UserMapper userMapper=new UserMapperImpl(sqlSessionFactory); List<User> list=new ArrayList<>(); for (int i = 0; i <10 ; i++) { User user=new User(); user.setUser_name("haha"+i); user.setPassword("123456"+i); user.setRealname("hehe"+i); list.add(user); } Integer aavv=userMapper.insertByUserBatch(list); System.out.println("受影響的行數: "+aavv); } @Test public void Test10(){ UserMapper userMapper=new UserMapperImpl(sqlSessionFactory); Map map=new HashMap(); map.put("id",1); map.put("username","hello"); User user=userMapper.queryUserByMap(map); System.out.println(user); } @Test public void Test11(){ UserMapper userMapper=new UserMapperImpl(sqlSessionFactory); User user=new User(); user.setRealname("laodu"); user.setPassword("888888"); user.setUser_name("liudaye"); user.setId(1); Integer a= userMapper.updateUser(user); System.out.println(a); } @Test public void Test12(){ UserMapper userMapper=new UserMapperImpl(sqlSessionFactory); Integer[] aa=new Integer[10]; for (int i = 0; i < 10; i++) { aa[i]=i+10; } Integer a= userMapper.updataUserBatch(aa); System.out.println(a); } @Test public void Test13(){ UserMapper userMapper=new UserMapperImpl(sqlSessionFactory); Integer a= userMapper.deleteUser(22); System.out.println(a); } @Test public void Test14(){ UserMapper userMapper=new UserMapperImpl(sqlSessionFactory); List<Integer> list=new ArrayList<>(); for (int i = 10; i < 20; i++) { list.add(i); } Integer a= userMapper.deleteUserBatch(list); System.out.println(a); } }
九,sql片段和動態sql
ql 元素用來定義一個可以復用的 SQL 語句段,供其它語句調用,例如
<sql id="User_columns">userId, userName, password</sql>
<!--用 include 引用-->
<select id="findUserById" resultMap="RM_User" >
<include refid="User_columns"/> from user where userId =#{userId}
</select>
Batis 的強大特性之一便是它的動態 SQL。如果你有使用 JDBC 或其他類似框架的經驗,你就能體會到根據不同條件拼接 SQL 語句有多么痛苦。拼接的時候要確保不能忘了必要的空格,還要注意省掉列名列表最后的逗號。
利用動態 SQL 這一特性,可以徹底擺脫這種痛苦。它借助 ognl(類似於 jsp 里面的 el 表達式)表達式來完成動態 sql 的拼接使得非常簡便。
1,條件判斷 使用 if 標簽就是加一個 test 屬性作為判斷, 如果有多個條件組合判斷的話用 and, or連接
<select id="queryByName" parameterType="string" resultType="user" resultMap="usermap"> select * from user where 1=1 <if test="null!=username and ''!=username"> and username like concat('%',#{username},'%') </if> </select>
測試方法
import com.shsxt.mapper.UserMapper; import com.shsxt.po.User; 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 java.io.InputStream; import java.util.List; public class mybaties03_Test { private UserMapper userMapper; @Before public void before() throws Exception{ InputStream inputStream = Resources.getResourceAsStream("mybatis.xml"); SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(); userMapper =sqlSession.getMapper(UserMapper.class); } @Test public void test02(){ List<User> list=userMapper.queryByName("li"); for (User user:list) { System.out.println(user); } } }
2,choose,when,otherwise
我們不想用到所有的條件語句,而只想從中擇其一二。針對這種情況,MyBatis 提供了 choose 元素,它有點像 Java 中的 switch 語句
<select id="queryByParams" parameterType="string" resultMap="usermap" resultType="user"> select id, <choose> <when test="realname!=null and realname!='' "> username </when> <otherwise> password </otherwise> </choose> from user </select>
測試方法
import com.shsxt.mapper.UserMapper; import com.shsxt.po.User; 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 java.io.InputStream; import java.util.List; public class mybaties03_Test { private UserMapper userMapper; @Before public void before() throws Exception{ InputStream inputStream = Resources.getResourceAsStream("mybatis.xml"); SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(); userMapper =sqlSession.getMapper(UserMapper.class); } @Test public void test03(){ List<User> list=userMapper.queryByParams("hello"); for (User user:list) { System.out.println(user); } } }
10,mapper 接口代理方式的 crud 開發
對於 mapper 接口方式開發,需要遵循 mybatis 開發規范,mybatis 框架可以自
動生成 mapper 接口對象。
完成賬戶表 crud 操作
開發規則:
1. mapper.xml 中 namespace 等於接口類全限定名
2. mapper.java 接口中的方法名必須與 mapper.xml 中 statement id 一致
3. mapper.java 輸入參數類型必須與 mapper.xml 中 statement 的
parameterType 參數類型一致
4.mapper.java 中方法的返回值類型必須與 mapper.xml 中對應 statement 返回
值類型一致。
接口名 與映射文件名稱 一致(非集成環境)
映射文件與接口處於同一個包中(非集成環境
InputStream inputStream = Resources.getResourceAsStream("mybatis.xml"); SqlSessionFactory sqlSessionFactory=new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(); userMapper =sqlSession.getMapper(UserMapper.class);
說白了就是我們不需要手動創建實現類了,mybatis的框架會幫我們通過動態代理來創建實現類,我們只需要用接口去接收創建好的實現的對象就可以了.