myBatis學習筆記

    最近辭職在家,找工做不是很順利,就順便看看技術吧,對hibernate用的較多,mybatis用的少,可是最近彷佛mybatis更流行一下,今天抽空看了一下,其實就是找官方的文檔,大牛的博客看看,而後本身組裝一下,而後作個筆記。html

     mybatis是一個SQL map框架,簡單來講,就是把SQL結果映射爲Java對象,這點對於喜歡SQL,注意性能的朋友來講,比較喜歡,學習曲線平坦。Hibernate相對來講要難一些,幾乎就至關於實現了一個數據庫,對數據庫的方方面面以及緩存、加載方面都作了封裝,直接將表的行和Java作了對應,操做起來很方便,並且也提供了不少默認方法,並且Spring還提供了Respository模式的方法,操做簡單的GUID很是方便,代碼不多,就可使用了。固然,若是複雜的操做,Hibernate用起來反而不方便,須要寫HQL或者SQL,SQL代碼仍是分佈在代碼之中,失去了面向對象的便利以及代碼的美感。可能基於這個緣由,mybatis流行起來,程序員能夠獲得徹底操縱的知足感,這點很重要。順便說一句,工做流引擎JBPM和Activiti其實是同源的,只是在JBpm4以後,產生了分歧,創始人認爲開發人員的便利性最重要,但團隊不一樣意,創始人只好另起爐竈,開發了Activiti,我的認爲,程序員以爲不方便,可是性能很高或者說學術水平很高的東西,其實很難流行,除非有一個方便的封裝。java

     一、環境mysql

          Windows 10程序員

           JDK 1.8.101web

           NetBeans 8.2spring

           STS 4.6sql

           Mysql 5.6,數據庫名爲study數據庫

     二、應用程序模式(main()執行)apache

         1)建表SQL          緩存

1 CREATE TABLE `info_user` ( 2     `id` INT(11) NOT NULL AUTO_INCREMENT, 3     `user_name` VARCHAR(50) NULL DEFAULT NULL, 4     `password` VARCHAR(50) NULL DEFAULT NULL, 5     `comment` VARCHAR(500) NULL DEFAULT NULL, 6     PRIMARY KEY (`id`), 7     UNIQUE INDEX `user_name` (`user_name`) 8 ) 9 ;

         2)mybatis的配置文件和Hibernate差很少,都是一個主配置文件,關聯着若干mapper文件,文件以下

           mybatis-config.xml  (位於目錄com/shiyq/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>
  <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/study?characterEncoding=UTF-8"/>
        <property name="username" value="root"/>
        <property name="password" value="123456"/>
      </dataSource>
    </environment>
  </environments>
  <mappers>
    <mapper resource="com/shiyq/mybatis/mapper/UserDaoMapper.xml"/>
  </mappers>
</configuration>

  UserDaoMapper.xml (位於目錄com/shiyq/mybatis/mapper/)

 

<?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.shiyq.mybatis.config.UserDao">
    <select id="countAll" resultType="int">
        select count(*) c from info_user;
    </select>
    
    <select id="selectAll" resultType="com.shiyq.mybatis.config.User">
        select * from info_user order by user_name asc
    </select>
    
    <insert id="insert" parameterType="com.shiyq.mybatis.config.User">
        insert into info_user(user_name,password,comment) values(#{user_name},#{password},#{comment})
    </insert>
    
    <update id="update" parameterType="com.shiyq.mybatis.config.User">
        update info_user set user_name=#{user_name},password=#{password},comment=#{comment} where user_name=#{user_name}
    </update>
    
    <delete id="delete" parameterType="String">
        delete from info_user where user_name=#{user_name}
    </delete>
    
    <select id="findByUserName" parameterType="String" resultType="com.shiyq.mybatis.config.User">
        select * from info_user where user_name=#{user_name}
    </select>
</mapper>

 

  能夠看出mybatis-config.xml記錄了數據庫鏈接方式,以及mapper文件的列表。

      mapper文件也很是簡單,須要注意幾個關鍵的地方:

  •       mapper標籤的namespace指定的是這個mapper對應的java類
  •       select,update,insert,delete表明了操做類型,其下的id表明了java類的方法名稱。parameterType表明了參數類型,resultType表明結果類型,類型能夠是基本類型,如int,long,也能夠是java類型如String,com.shiyq.batis.config.user  

      另外須要注意,在netbeans中,這兩個配置文件要放在target/classes下面,由於默認狀況下src下面的文件不會拷貝到classes下,因此會出現找不到配置文件的錯誤。

      3)Java代碼

         

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.shiyq.mybatis.config;

/**
 *
 * @author shiyq
 */
public class User {
    
    private int id;
    private String user_name;
    private String password;
    private String comment;

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUser_name() {
        return user_name;
    }

    public void setUser_name(String user_name) {
        this.user_name = user_name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getComment() {
        return comment;
    }

    public void setComment(String comment) {
        this.comment = comment;
    }  
    
}

  

/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */
package com.shiyq.mybatis.config; import java.util.List; /** * * @author shiyq */
public interface UserDao { public int insert(User user); public int update(User user); public int delete(String user_name); public List<User> selectAll(); public int countAll(); public User findByUserName(String user_name); }

      能夠看出User是做爲返回類型,而UserDao是mapper文件對應的接口文件,能夠看出其返回值、參數類型、方法名稱是一致的。

      4)運行

           到此,基本的配置就完成了,咱們能夠進行增刪改查了,咱們寫個測試類,看一下

/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */
package com.shiyq.mybatis; import com.shiyq.mybatis.config.User; import com.shiyq.mybatis.config.UserDao; import java.io.Reader; import java.util.Iterator; 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; /** * * @author shiyq */
public class MybatisMain { public static void main(String args[])throws Exception { String user_name = "shiyq"+String.valueOf(Math.random()*100000).substring(0,3); String resource = "com/shiyq/mybatis/mybatis-config.xml"; Reader reader = Resources.getResourceAsReader(resource); SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder(); SqlSessionFactory factory = builder.build(reader); try (SqlSession session = factory.openSession()) { UserDao userDao = session.getMapper(UserDao.class); User user = new User(); user.setUser_name(user_name); user.setPassword("stone123"); user.setComment("備註"); userDao.insert(user); System.out.println("記錄條數:"+userDao.countAll()); List<User> users = userDao.selectAll(); Iterator<User> iter = users.iterator(); while(iter.hasNext()){ User u = iter.next(); System.out.println("用戶名:"+u.getUser_name()+", 密碼:"+u.getPassword()); } user.setComment("comment"); userDao.update(user); //User u = userDao.findByUserName(user_name);
            User u = session.selectOne("com.shiyq.mybatis.config.UserDao.findByUserName",user_name); System.out.println("comment is "+u.getComment()); //userDao.delete(user_name);
            System.out.println("記錄條數:"+userDao.countAll()); session.commit(); } } }

     運行結果以下:

記錄條數:1
用戶名:shiyq509, 密碼:stone123
comment is comment
記錄條數:1

 三、SpringBoot集成mybatis

       SpringBoot是相對較新的Spring開發方式,大大減小了配置文件,在開發和部署上的便利性都有很大的提高。

       採用STS做爲開發工具,File->New->Spring Starter Project,以下圖

     後面是要預先導入的包,選擇SQL下的Mysql、JDBC、MyBatis,而後肯定,生成項目便可。

     若是已經有Spring Boot項目,能夠在pom.xml增長以下內容

		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>1.1.1</version>
		</dependency>

  spring boot的配置文件是src/main/resources/application.properties,個人配置文件以下

server.port=8080
server.context-path=/study

#log
logging.file=park/log.log
logging.level.org.cqgy=DEBUG

#jdbc
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost/study?characterEncoding=utf-8
spring.datasource.username=root
spring.datasource.password=123456

spring.datasource.max-idle=10
spring.datasource.max-wait=10000
spring.datasource.min-idle=5
spring.datasource.initial-size=5
spring.datasource.validation-query=SELECT 1
spring.datasource.test-on-borrow=false
spring.datasource.test-while-idle=true
spring.datasource.time-between-eviction-runs-millis=18800
spring.datasource.jdbc-interceptors=ConnectionState;SlowQueryReport(threshold=0)

spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=false
spring.jackson.serialization.indent-output=true

server.error.whitelabel.enabled=true

mybatis.config-location=classpath:mybatis/mybatis-config.xml 

  默認狀況下,只須要配置黑體字的部分便可,須要注意的是在web程序的狀況下,須要在路徑上增長"classpath:",不然還會出現找不到配置文件的現象。

      Spring boot狀況下,mybatis會使用默認的datasource,自動建立SqlSessionFactory,SqlSession,自動裝載Mapper的Java類。

      這裏仍是使用上面的文件,只不過位置有變化,以下

mybatis-config.xml  src/main/resources/mybatis
UserDaoMapper.xml  src/main/resources/mybatis/mapper
User.java  src/main/java/com/shiyq/mybatis/domain
UserDao.java src/main/java/com/shiyq/mybatis/dao

     mybatis-config.xml中的映射部分修改以下

<mappers>
    <mapper resource="mybatis/mapper/UserDaoMapper.xml"/>
  </mappers>

  而後寫一個Controller做爲測試

package com.shiyq.web;

import java.io.IOException;
import java.io.PrintWriter;
import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

import com.shiyq.mybatis.dao.UserDao;
import com.shiyq.mybatis.domain.User;

@Controller
public class UserList {

	@Autowired
	UserDao userDao;

	@RequestMapping("/user/list")
	public String userList(HttpServletRequest request, HttpServletResponse response) throws IOException {
		response.setHeader("Content-type", "text/html;charset=UTF-8");
		response.setCharacterEncoding("UTF-8");
		PrintWriter pt = response.getWriter();
		
		User user1 = new User();
		String user_name = "shiyq"+String.valueOf(Math.random()*100000).substring(0,3);
		user1.setUser_name(user_name);
		user1.setPassword("密碼");
		user1.setComment("註釋,"+user_name);
		userDao.insert(user1);
		List<User> users = userDao.selectAll();
		int i = 0;
		pt.println("<pre>");
		int count = this.userDao.countAll();

		pt.println(count);
		for (User user : users) {
			System.out.println("用戶名:" + user.getUser_name() + ", 密碼:" + user.getPassword());
			pt.print(++i+", ");
			pt.println("用戶名:" + user.getUser_name() + ", 密碼:" + user.getPassword()+", 註釋:"+user.getComment());
		}
		pt.println("</pre>");
		return null;

	}
}

  運行http://localhost:8080/study/user/list,結果以下

1
1, 用戶名:shiyq204, 密碼:密碼, 註釋:註釋,shiyq204
相關文章
相關標籤/搜索