mybatis參考網址:http://www.mybatis.org/mybati...html
Github源碼地址:https://github.com/mybatis/my...java
MyBatis 是一款優秀的持久層框架,它支持定製化SQL、存儲過程以及高級映射。MyBatis 避免了幾乎全部的 JDBC代碼和手動設置參數以及獲取結果集,它可使用簡單的XML或註解來配置和映射SQL信息,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數據庫中的記錄。mysql
對象-關係映射(OBJECT/RELATIONALMAPPING,簡稱ORM),是隨着面向對象的軟件開發方法發展而產生的。用來把對象模型表示的對象映射到基於SQL 的關係模型數據庫結構中去。這樣,咱們在具體的操做實體對象的時候,就不須要再去和複雜的 SQL 語句打交道,只需簡單的操做實體對象的屬性和方法 。ORM 技術是在對象和關係之間提供了一條橋樑,前臺的對象型數據和數據庫中的關係型的數據經過這個橋樑來相互轉化。git
對比項 | Mybatis | Hibernate |
---|---|---|
市場佔有率 | 高 | 高 |
適合的行業 | 互聯網 電商 項目 | 傳統的(ERP CRM OA) |
性能 | 高 | 低 |
Sql靈活性 | 高 | 低 |
學習門檻 | 低 | 高 |
Sql配置文件 | 全局配置文件、映射文件 | 全局配置文件、映射文件 |
ORM | 半自動化 | 徹底的自動化 |
數據庫無關性 | 低 | 高 |
一、根據用戶id查詢一個用戶信息github
二、根據用戶名稱模糊查詢用戶信息列表sql
三、添加用戶數據庫
<dependencies> <!-- mybatis依賴 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> <!-- mysql依賴 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.35</version> </dependency> <!-- 單元測試 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> </dependencies>
<?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="${db.driver}" /> <property name="url" value="${db.url}" /> <property name="username" value="${db.username}" /> <property name="password" value="${db.password}" /> </dataSource> </environment> </environments> <mappers> <mapper resource="UserMapper.xml" /> </mappers> </configuration>
<?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="test"> </mapper>
public class User { private int id; private String username; private Date birthday; private String sex; private String address; // getter\setter方法 }
<!-- 根據id獲取用戶信息 --> <select id="findUserById" parameterType="int" resultType="com.kkb.mybatis.po.User"> select * from user where id = #{id} </select> <!-- 根據名稱模糊查詢用戶列表 --> <select id="findUserByUsername" parameterType="java.lang.String" resultType="com.kkb.mybatis.po.User"> select * from user where username like '%${value}%' </select>
配置說明:apache
- parameterType:定義輸入參數的Java類型, - resultType:定義結果映射類型。 - #{}:至關於JDBC中的?佔位符 - #{id}表示使用preparedstatement設置佔位符號並將輸入變量id傳到sql。 - ${value}:取出參數名爲value的值。將${value}佔位符替換。 注意:若是是取簡單數量類型的參數,括號中的參數名稱必須爲value
public interface UserDao { public User findUserById(int id) throws Exception; public List<User> findUsersByName(String name) throws Exception; }
public class UserDaoImpl implements UserDao { //注入SqlSessionFactory public UserDaoImpl(SqlSessionFactory sqlSessionFactory){ this. sqlSessionFactory = sqlSessionFactory; } private SqlSessionFactory sqlSessionFactory; @Override public User findUserById(int id) throws Exception { SqlSession session = sqlSessionFactory.openSession(); User user = null; try { //經過sqlsession調用selectOne方法獲取一條結果集 //參數1:指定定義的statement的id,參數2:指定向statement中傳遞的參數 user = session.selectOne("test.findUserById", id); System.out.println(user); } finally{ session.close(); } return user; } @Override public List<User> findUsersByName(String name) throws Exception { SqlSession session = sqlSessionFactory.openSession(); List<User> users = null; try { users = session.selectList("test.findUsersByName", name); System.out.println(users); } finally{ session.close(); } return users; } }
public class MybatisTest { private SqlSessionFactory sqlSessionFactory; @Before public void init() throws Exception { SqlSessionFactoryBuilder sessionFactoryBuilder = new SqlSessionFactoryBuilder(); InputStream inputStream = Resources.getResourceAsStream("SqlMapConfig.xml"); sqlSessionFactory = sessionFactoryBuilder.build(inputStream); } @Test public void testFindUserById() { UserDao userDao = new UserDaoImpl(sqlSessionFactory); User user = userDao.findUserById(22); System.out.println(user); } @Test public void testFindUsersByName() { UserDao userDao = new UserDaoImpl(sqlSessionFactory); List<User> users = userDao.findUsersByName("老郭"); System.out.println(users); } }
#{} :至關於JDBC SQL語句中的佔位符? (PreparedStatement) ${} : 至關於JDBC SQL語句中的鏈接符合 + (Statement)
#{} : 進行輸入映射的時候,會對參數進行類型解析(若是是String類型,那麼SQL語句會自動加上’’) ${} :進行輸入映射的時候,將參數原樣輸出到SQL語句中
#{} : 若是進行簡單類型(String、Date、8種基本類型的包裝類)的輸入映射時,#{}中參數名稱能夠任意 ${} : 若是進行簡單類型(String、Date、8種基本類型的包裝類)的輸入映射時,${}中參數名稱必須是value
${} :存在SQL注入問題 ,使用OR 1=1 關鍵字將查詢條件忽略
#{}:是經過反射獲取數據的---StaticSqlSource session
${}:是經過OGNL表達式會隨着對象的嵌套而相應的發生層級變化 --DynamicSqlSourcemybatis
<!-- 添加用戶 --> <insert id="insertUser" parameterType="com.kkb.mybatis.po.User"> insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address}) </insert>
public interface UserDao { public void insertUser(User user) throws Exception; }
public class UserDaoImpl implements UserDao { //注入SqlSessionFactory public UserDaoImpl(SqlSessionFactory sqlSessionFactory){ this. sqlSessionFactory = sqlSessionFactory; } private SqlSessionFactory sqlSessionFactory; @Override Public void insertUser(User user) throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); try { sqlSession.insert("test.insertUser", user); sqlSession.commit(); } finally{ session.close(); } } }
@Override Public void insertUser(User user) throws Exception { SqlSession sqlSession = sqlSessionFactory.openSession(); try { sqlSession.insert("insertUser", user); sqlSession.commit(); } finally{ session.close(); } }
<insert id="insertUser" parameterType="com.kkb.mybatis.po.User"> <!-- selectKey將主鍵返回,須要再返回 --> <selectKey keyProperty="id" order="AFTER" resultType="java.lang.Integer"> select LAST_INSERT_ID() </selectKey> insert into user(username,birthday,sex,address) values(#{username},#{birthday},#{sex},#{address}); </insert>
添加selectKey標籤實現主鍵返回。