<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                [mybatis依賴jar包](https://pan.baidu.com/s/1WOkB-Uj4UuX4JsJWMsD55Q) *** ### 創建數據庫 ``` -- ---------------------------- -- Table structure for user -- ---------------------------- DROP TABLE IF EXISTS `user`; CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(32) NOT NULL COMMENT '用戶名稱', `birthday` date DEFAULT NULL COMMENT '生日', `sex` char(1) DEFAULT NULL COMMENT '性別', `address` varchar(256) DEFAULT NULL COMMENT '地址', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=27 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of user -- ---------------------------- INSERT INTO `user` VALUES ('1', '王五', null, '2', null); INSERT INTO `user` VALUES ('10', '張三', '2014-07-10', '1', '北京市'); INSERT INTO `user` VALUES ('16', '張小明', null, '1', '河南鄭州'); INSERT INTO `user` VALUES ('22', '陳小明', null, '1', '河南鄭州'); INSERT INTO `user` VALUES ('24', '張三豐', null, '1', '河南鄭州'); INSERT INTO `user` VALUES ('25', '陳小明', null, '1', '河南鄭州'); ``` ## Mybatis框架原理(掌握) ### 1、Mybatis 是什么? Mybatis 是一個持久層的[架構](),是 apache 下的頂級項目。 Mybatis 原先是托管在 googlecode 下,再后來是托管在 Github 上。 Mybatis 讓程序員將主要的精力放在 sql 上,通過 Mybatis 提供的映射方式,自由靈活生成(半自動,大部分需要程序員編寫 sql )滿足需要 sql 語句。 Mybatis 可以將向 preparedStatement 中的輸入參數自動進行**輸入映射**,將查詢結果集靈活的映射成 java 對象。(**輸出映射**) ### 2、Mybatis 框架 ![image.png](https://upload-images.jianshu.io/upload_images/468490-62f6533055625a20.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) 注解: > * SqlMapConfig.xml (Mybatis的全局配置文件,名稱不定)配置了數據源、事務等 Mybatis 運行環境 > > > * Mapper.xml 映射文件(配置 sql 語句) > > > * SqlSessionFactory (會話工廠)根據配置文件配置工廠、創建 SqlSession > > > * SqlSession (會話)面向用戶的接口、操作數據庫(發出 sql 增刪改查) > > > * Executor (執行器)是一個接口(基本執行器、緩存執行器)、SqlSession 內部通過執行器操作數據庫 > > > * Mapped Statement (底層封裝對象)對操作數據庫存儲封裝,包括 sql 語句、輸入參數、輸出結果類型 > ## Mybatis入門程序 ### 1、需求 實現以下功能: > * 根據用戶id查詢一個用戶信息 > * 根據用戶名稱模糊查詢用戶信息列表 > * 添加用戶 > * 更新用戶 > * 刪除用戶 ### 2、環境 java 環境 :jdk1.8.0_77 開發工具 : IDEA 2016.1 數據庫 : MySQL 5.7 Mybatis 運行環境( jar 包) MySQL 驅動包 其他依賴包 ### 3、 log4j.properties 在classpath下創建log4j.properties如下: ``` # Global logging configuration #在開發環境日志級別要設置為DEBUG、生產環境要設置為INFO或者ERROR log4j.rootLogger=DEBUG, stdout # Console output... log4j.appender.stdout=org.apache.log4j.ConsoleAppender log4j.appender.stdout.layout=org.apache.log4j.PatternLayout log4j.appender.stdout.layout.ConversionPattern=%5p [%t] - %m%n ``` Mybatis默認使用log4j作為輸出日志信息。 ### 4、工程結構 ![image.png](https://upload-images.jianshu.io/upload_images/468490-4c8dbd1949ea12ac.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240) ### db.properties ``` jdbc.driver=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql:///mybatis jdbc.username=root jdbc.password=root ``` ### 5、SqlMapConfig.xml 配置 Mybatis 的運行環境、數據源、事務等 ``` <?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"></properties> <environments default="development"> <environment id="development"> <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> <mappers> <package name="com.mapper"></package> </mappers> </configuration> ``` ### 6、創建domain類 domain 類作為 mybatis 進行 sql 映射使用,po 類通常與數據庫表對應,User.java 如下: ``` package com.company.domain; import java.util.Date; /** * Created by Administrator on 2017/10/21. */ public class User { private int id; private String username; private Date birthday; private String sex; private String address; public int getId() { return id; } public void setId(int 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; } } ``` ### Mybatis 的 mapper 接口 思路 程序員需要編寫mapper接口(相當于Dao接口,增刪改查操作) 程序員需要編寫 mapper.xml 映射文件,需遵循一些開發規范,mybatis 可以自動生成 mapper 接口類代理對象。 開發規范: 1.在 mapper.xml 中 namespace 等于 mapper 接口地址(所在包名的全路徑) <mapper namespace="com.mapper.UserMapper"></mapper> 2.在 xxxmapper.java 接口中的方法名要與 xxxMapper.xml 中 statement 的 id 一致。 3.在 xxxmapper.java 接口中的輸入參數類型要與 xxxMapper.xml 中 statement 的 parameterType 指定的參數類型一致。 4.在 xxxmapper.java 接口中的返回值類型要與 xxxMapper.xml 中 statement 的 resultType 指定的類型一致。 5.接口文件名要與xml映射文件名一致(UserMapper.java和UserMapper.xml) ### 7、根據用戶 id(主鍵)查詢用戶信息 定義Mapper接口 ``` public interface UserMapper { public User findUserById(int id); } ``` 定義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"> <mapper namespace="com.mapper.UserMapper"> <select id="findUserById" parameterType="int" resultType="com.domain.User"> select * from user where id = #{1} </select> </mapper> ``` 主方法測試 ``` public static void main(String[] args) throws IOException { //創建sqlSessionFactory //Mybatis 配置文件 String resource = "SqlMapConfig.xml"; //得到配置文件流 InputStream inputStream = Resources.getResourceAsStream(resource); //創建會話工廠,傳入Mybatis的配置文件信息 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream); SqlSession sqlSession = sqlSessionFactory.openSession(); //創建usermapper對象,mybatis自動生成代理對象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //調用UserMapper的方法 User user = userMapper.findUserById(1); System.out.println(user.getUsername()); } ``` parameterType:指定輸入參數類型,mybatis 從輸入對象中獲取參數值拼接在 sql 中。 resultType:指定輸出結果類型,mybatis 將 sql 查詢結果的一行記錄數據映射為 resultType 指定類型的對象。 ### Sqlsession 的使用范圍 SqlSession 中封裝了對數據庫的操作,如:查詢、插入、更新、刪除等。 通過 SqlSessionFactory 創建 SqlSession,而 SqlSessionFactory 是通過 SqlSessionFactoryBuilder 進行創建。 ### 1、SqlSessionFactoryBuilder SqlSessionFactoryBuilder 用于創建 SqlSessionFacoty,SqlSessionFacoty 一旦創建完成就不需要SqlSessionFactoryBuilder 了,因為 SqlSession 是通過 SqlSessionFactory 生產,所以可以將SqlSessionFactoryBuilder 當成一個工具類使用,最佳使用范圍是方法范圍即方法體內局部變量。 ### 2、SqlSessionFactory SqlSessionFactory 是一個接口,接口中定義了 openSession 的不同重載方法,SqlSessionFactory 的最佳使用范圍是整個應用運行期間,一旦創建后可以重復使用,通常以單例模式管理 SqlSessionFactory。 ### 3、SqlSession SqlSession 是一個面向用戶的接口, sqlSession 中定義了數據庫操作,默認使用 DefaultSqlSession 實現類。 ### 單例模式的SqlSessionFactory ``` public class SqlSessionFactoryUtil { //首先創建靜態成員變量sqlSessionFactory,靜態變量被所有的對象所共享。 public static SqlSessionFactory sqlSessionFactory = null; public static SqlSessionFactory getSqlSessionFactory() { //如果sqlSessionFactory沒有被創建就讀取全局配置文件,假如已經被創建過了,就使用已經存在的sqlsessionfactory。 //這樣就有了單例模式的效果 if(sqlSessionFactory==null){ String resource = "SqlMapConfig.xml"; try { Reader reader = Resources.getResourceAsReader(resource); sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } return sqlSessionFactory; } } ``` 主方法測試變為: ``` public static void main(String[] args) throws IOException { //創建sqlSessionFactory SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtil.getSqlSessionFactory(); SqlSession sqlSession = sqlSessionFactory.openSession(); //創建usermapper對象,mybatis自動生成代理對象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //調用UserMapper的方法 User user = userMapper.findUserById(1); System.out.println(user.getUsername()); } ``` ### 自定義別名: 在 SqlMapConfig.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"> <configuration> <properties resource="db.properties"></properties> <typeAliases> <!-- 批量別名定義,掃描整個包下的類,別名為類名(首字母大寫或小寫都可以) --> <package name="com.domain"/> </typeAliases> <environments default="development"> <environment id="development"> <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> <mappers> <package name="com.mapper"></package> </mappers> </configuration> ``` ### 查找全部用戶 UserMapper.java ``` public interface UserMapper { public User findUserById(int id); public List<User> findAllUsers(); //添加用戶信息 public int addUser(User user); //刪除用戶信息 public int deleteUser(int id); public int updateUserById(User user); } ``` 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"> <mapper namespace="com.mapper.UserMapper"> <select id="findUserById" parameterType="int" resultType="User"> select * from user where id = #{1} </select> <select id="findAllUsers" resultType="User"> select * from user </select> </mapper> ``` 主方法測試 ``` public static void main(String[] args) throws IOException { //創建sqlSessionFactory SqlSessionFactory sqlSessionFactory = SqlSessionFactoryUtil.getSqlSessionFactory(); SqlSession sqlSession = sqlSessionFactory.openSession(); //創建usermapper對象,mybatis自動生成代理對象 UserMapper userMapper = sqlSession.getMapper(UserMapper.class); //調用UserMapper的方法 // User user = userMapper.findUserById(1); // System.out.println(user.getUsername()); List<User> userList = userMapper.findAllUsers(); for(User user : userList) { System.out.println(user.getUsername()); } } ``` >雖然 findAllUsers()的返回值類型是List<User>,xml文件中resultType="User"即可。 ### 新增用戶 ``` <insert id="addUser" parameterType="User" > <selectKey keyProperty="id" order="AFTER" resultType="int"> select LAST_INSERT_ID() </selectKey> insert into user(username, birthday, sex, address) values(#{username}, #{birthday}, #{sex}, #{address}) </insert> ``` 主函數 ``` User user = new User(); SimpleDateFormat sdf = new SimpleDateFormat ("yyyy-MM-dd"); user.setUsername("田志"); user.setSex("男"); user.setBirthday(sdf.parse("2016-11-29")); user.setAddress("江西南昌"); userMapper.addUser(user); System.out.println(user.getId()); sqlSession.commit(); ``` >增刪改操作需要 sqlSession.commit(); ### 自增主鍵返回 MySQL 自增主鍵:執行 insert 提交之前自動生成一個自增主鍵,通過 MySQL 函數獲取到剛插入記錄的自增主鍵: LAST_INSERT_ID() ,是在 insert 函數之后調用。 ### 刪除用戶 ``` <delete id="deleteUser" parameterType="int"> delete from user where user.id = #{id} </delete> ``` ``` userMapper.deleteUser(1); sqlSession.commit(); ``` ### 更新用戶 ``` <update id="updateUserById" parameterType="User"> update user set username = #{username}, birthday = #{birthday}, sex = #{sex}, address = #{address} where user.id = #{id} </update> ``` ``` SimpleDateFormat sdf = new SimpleDateFormat ("yyyy-MM-dd"); User user = new User(); //根據id更新用戶信息 user.setId(24); user.setUsername("張四風2"); user.setBirthday(sdf.parse("2015-01-12")); user.setSex("女"); user.setAddress("上海黃埔"); userMapper.updateUserById(user); //提交事務 sqlSession.commit(); ``` ### 模糊查找用戶 ``` <select id="findUserList" parameterType="User" resultType="User"> select * from user where user.sex = #{sex} and user.username like #{username} </select> ``` ``` User user = new User(); user.setSex("1"); user.setUsername("%張%"); //調用UserMapper的方法 List<User> list = userMapper.findUserList(user); for(User u : list) { System.out.println(u.getUsername()); } ``` ### 查找user表記錄數 ``` <select id="findUserCount" resultType="int"> select count(*) from user </select> ``` ``` int count = userMapper.findUserCount(); System.out.println(count); ``` ### 動態 SQL 通過mybatis提供的各種標簽方法實現動態拼接sql。 ``` <select id="findUserList2" parameterType="User" resultType="User"> select * from user <!--where可以自動的去掉條件中的第一個and--> <where> <if test="sex != null and sex != ''"> and user.sex = #{sex} </if> <if test="username != null"> and user.username like #{username} </if> </where> </select> ``` 測試代碼:因為設置了動態的sql,如果不設置某個值,那么條件就不會拼接在sql上 所以我們就注釋掉設置username的語句 ``` User user = new User(); // user.setSex("1"); user.setUsername("%張%"); //調用UserMapper的方法 List<User> list = userMapper.findUserList2(user); for(User u : list) { System.out.println(u.getUsername()); } ``` ### Sql 片段 通過上面的其實看到在 where sql語句中有很多重復代碼,我們可以將其抽取出來,組成一個sql片段,其他的statement就可以引用這個sql片段,利于系統的開發。 這里我們就拿上邊sql 中的where定義一個sq片段如下: ``` <sql id="query_user_where"> <if test="sex != null and sex != ''"> and user.sex = #{sex} </if> <if test="username != null"> and user.username like #{username} </if> </sql> ``` 那么我們該怎樣引用這個sql片段呢?如下: ``` select * from user <where> <!--refid: 指定sql片段的id,如果是寫在其他的mapper文件中,則需要在前面加上namespace--> <include refid="query_user_where"/> </where> ``` ### 多表連接 再創建一個訂單信息表 ``` CREATE TABLE `orders` ( `id` int(11) NOT NULL AUTO_INCREMENT, `user_id` int(11) NOT NULL COMMENT '下單用戶id', `number` varchar(32) NOT NULL COMMENT '訂單號', `createtime` datetime NOT NULL COMMENT '創建訂單時間', `note` varchar(100) DEFAULT NULL COMMENT '備注', PRIMARY KEY (`id`), KEY `FK_orders_1` (`user_id`), CONSTRAINT `FK_orders_id` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION ) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8; -- ---------------------------- -- Records of orders -- ---------------------------- INSERT INTO `orders` VALUES ('3', '1', '1000010', '2015-02-04 13:22:35', null); INSERT INTO `orders` VALUES ('4', '1', '1000011', '2015-02-03 13:22:41', null); INSERT INTO `orders` VALUES ('5', '10', '1000012', '2015-02-12 16:13:23', null); ``` ``` public List<Map<String,Object>> getAllOrderInfo(); ``` ``` <select id="getAllOrderInfo" resultType="map"> select orders.number,user.username from orders join user on orders.user_id = user.id </select> ``` ``` List<Map<String,Object>> mapList = userMapper.getAllOrderInfo(); for(Map<String,Object> map : mapList) { System.out.println("---------------"); for(Map.Entry<String,Object> entry : map.entrySet()) { System.out.println(entry.getKey()+" "+entry.getValue()); } } ``` ### 代碼 [案例代碼](https://github.com/songboriceboy/grasp_mybatis_oneday)
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看