一.原生jdbc程序中的問題
總結:
1淋纲、數(shù)據(jù)庫連接防嗡,使用時就創(chuàng)建,不使用立即釋放谒麦,對數(shù)據(jù)庫進行頻繁連接開啟和關閉峻仇,造成數(shù)據(jù)庫資源浪費公黑,影響數(shù)據(jù)庫性能邑商。
設想:使用數(shù)據(jù)庫連接池管理數(shù)據(jù)庫連接摄咆。。
2人断、將sql語句硬編碼到java代碼中吭从,如果sql語句修改,需要重新編譯java代碼恶迈,不利于系統(tǒng)維護涩金。
設想:將sql語句配置在xml配置文件中谱醇,即使sql變樣不需要對jaua代碼進行重新編譯.
3、向preparedStatement中設置多數(shù)步做,對占位符號位置和設置多數(shù)值副渴,硬編碼在java代碼中,不利于系統(tǒng)維護全度。
設想:將sql語句及占位符號和參數(shù)全部配置在xml中煮剧。
4、從resutSet中遍歷結果集數(shù)據(jù)時将鸵,存在硬編碼勉盅,將獲取表的字段進行硬編碼,顶掉,不利于系統(tǒng)維護草娜。。
設想痒筒,格查詢的結集集宰闰,自動映射成java對象。
二.什么是mybatis及解決原生jdbc中出現(xiàn)的問題:
1 mybatis是一個持久層的框架凸克,是apache下的頂級項目
2.mybatis讓程序將主要精力放在名義上议蟆,通過mybatis提供的映射方式,自由靈活生成(半自動化萎战,大部分需要程序員編寫sql)滿足需要型之語句咐容。
3.mybatis可以將preparedStatement中的輸入?yún)?shù)自動進行輸入映射,將查詢結果集靈活映射成java對象蚂维。(輸出映射)戳粒。
三.環(huán)境搭建
1.maven中配置mybatis包:
mybatis核心及配置文件
<!--mybatis核心-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.7</version>
</dependency>
<!--mybatis日志文件-->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.5</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.12</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2.mybatis配置文件
mybatis-config.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>
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"></property>
<property name="url" value="jdbc:mysql://localhost:3306/sams?serverTimezone=UTC "></property>
<property name="username" value="root"></property>
<property name="password" value="root"></property>
</dataSource>
</environment>
</environments>
<!--加載映射文件-->
<mappers>
<mapper resource="mapper/adminMap.xml"></mapper>
</mappers>
</configuration>
3.映射文件
adminMap.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="test">
<!--通過id查找用戶-->
<select id="findUserById" parameterType="int" resultType="cn.huan.mybatis.AdminBean">
SELECT * FROM admin WHERE a_id =#{a_id}
</select>
<!--模糊查詢-->
<select id="findUserByName" parameterType="java.lang.String" resultType="cn.huan.mybatis.AdminBean">
SELECT * FROM admin WHERE a_username LIKE '%${value}%'
</select>
<!--添加用戶-->
<insert id="insertUser" parameterType="cn.huan.mybatis.AdminBean">
<!--將插入數(shù)據(jù)的主鍵返回
SELECT Last_insert_ID 得到剛插入的主鍵值 只適用與自增主鍵
keyProperty :將查詢到主鍵值設置到parameterType指定的對象的那個屬性
order:SELECT Last_insert_ID執(zhí)行順序,相對于insert語句來說它的執(zhí)行順序-->
<selectKey keyProperty="a_id" order="AFTER" resultType="java.lang.Integer">
SELECT LAST_INSERT_ID()
</selectKey>
INSERT INTO admin (a_nameid,a_username,a_password,a_trank)
VALUES(#{a_nameid},#{a_username},#{a_password},#{a_trank})
</insert>
<!--刪除用戶 通過id-->
<delete id="deleteUser" parameterType="java.lang.Integer">
DELETE from admin where a_id =#{a_id}
</delete>
<!--更新用戶信息通過id-->
<update id="updateUser" parameterType="cn.huan.mybatis.AdminBean">
UPDATE admin set a_nameid=#{a_nameid},a_username=#{a_username},a_password=#{a_password},a_trank=#{a_trank} where a_id=#{a_id}
</update>
</mapper>
插入用戶及獲取插入時的主鍵(自增)SELECT UUID();
<insert id="insertUser" parameterType="cn.huan.mybatis.AdminBean">
<!--將插入數(shù)據(jù)的主鍵返回
SELECT Last_insert_ID 得到剛插入的主鍵值 只適用與自增主鍵
keyProperty :將查詢到主鍵值設置到parameterType指定的對象的那個屬性
order:SELECT Last_insert_ID執(zhí)行順序虫啥,相對于insert語句來說它的執(zhí)行順序-->
<selectKey keyProperty="a_id" order="BEFORE" resultType="java.lang.Integer">
SELECT UUID()
</selectKey>
INSERT INTO admin (a_id,a_nameid,a_username,a_password,a_trank) VALUES(#{a_id},#{a_nameid},#{a_username},#{a_password},#{a_trank})
</insert>
4.javaBean
AdminBean.java
package cn.huan.mybatis;
/**
* Created by 馬歡歡 on 2017/6/29.
*/
public class AdminBean {
private int a_id;
private String a_nameid;
private String a_username;
private String a_password;
private int a_trank;
@Override
public String toString() {
return "AdminBean{" +
"a_id=" + a_id +
", a_nameid='" + a_nameid + '\'' +
", a_username='" + a_username + '\'' +
", a_password='" + a_password + '\'' +
", a_trank=" + a_trank +
'}';
}
public int getA_id() {
return a_id;
}
public void setA_id(int a_id) {
this.a_id = a_id;
}
public String getA_nameid() {
return a_nameid;
}
public void setA_nameid(String a_nameid) {
this.a_nameid = a_nameid;
}
public String getA_username() {
return a_username;
}
public void setA_username(String a_username) {
this.a_username = a_username;
}
public String getA_password() {
return a_password;
}
public void setA_password(String a_password) {
this.a_password = a_password;
}
public int getA_trank() {
return a_trank;
}
public void setA_trank(int a_trank) {
this.a_trank = a_trank;
}
}
5.測試類
mybatisTest.java
測試1:通過id查詢用戶
測試2:模糊查詢用戶
測試3:插入用戶及獲取插入時的主鍵(自增)SELECT LAST_INSERT_ID();
測試4:刪除用戶 通過id
測試5:更新用戶信息 通過id
package cn.huan.mybatis;
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.Test;
import java.util.*;
import java.io.IOException;
import java.io.InputStream;
/**
* Created by 馬歡歡 on 2017/6/29.
*/
public class mybatisTest {
@Test
public void findUserById() throws IOException {
//配置文件
String resource = "mybatis-config.xml";
//的到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
//創(chuàng)建會話工廠
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//通過工廠的到sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//通過sqlSession操作數(shù)據(jù)庫
AdminBean adminBean =sqlSession.selectOne("test.findUserById",1);
System.out.println(adminBean);
sqlSession.close();
}
@Test
public void findUserByName() throws IOException {
//配置文件
String resource = "mybatis-config.xml";
//的到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
//創(chuàng)建會話工廠
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//通過工廠的到sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//通過sqlSession操作數(shù)據(jù)庫
List<AdminBean> adminBean =sqlSession.selectList("test.findUserByName","員");
System.out.println(adminBean);
sqlSession.close();
}
@Test
public void insertUser() throws IOException {
//配置文件
String resource = "mybatis-config.xml";
//的到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
//創(chuàng)建會話工廠
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//通過工廠的到sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
AdminBean adminBean = new AdminBean();
adminBean.setA_nameid("156414525");
adminBean.setA_username("小明1");
adminBean.setA_password("123456");
adminBean.setA_trank(3);
//通過sqlSession操作數(shù)據(jù)庫
sqlSession.insert("test.insertUser",adminBean);
//提交事務
sqlSession.commit();
System.out.println(adminBean.getA_id());
sqlSession.close();
}
@Test
public void deleteUser() throws IOException {
//配置文件
String resource = "mybatis-config.xml";
//的到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
//創(chuàng)建會話工廠
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//通過工廠的到sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
//通過sqlSession操作數(shù)據(jù)庫
sqlSession.delete("test.deleteUser",12);
//提交事務
sqlSession.commit();
sqlSession.close();
}
@Test
public void updateUser() throws IOException {
//配置文件
String resource = "mybatis-config.xml";
//的到配置文件流
InputStream inputStream = Resources.getResourceAsStream(resource);
//創(chuàng)建會話工廠
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
//通過工廠的到sqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
AdminBean adminBean = new AdminBean();
adminBean.setA_id(13);
adminBean.setA_nameid("111111");
adminBean.setA_username("大東");
adminBean.setA_password("454545");
adminBean.setA_trank(2);
//通過sqlSession操作數(shù)據(jù)庫
sqlSession.update("test.updateUser",adminBean);
//提交事務
sqlSession.commit();
sqlSession.close();
}
}
四.總結
1.parameterType:
在映射文件中通過patameterType
指定輸入?yún)?shù)的類型
2.resulType:
在映射文件中通過resulType
指定輸出結果的類型
3.#{}和${}
#{}
表示占位符號
接收參數(shù)是簡單類型時 #{}中可以寫#{value}或者其他名稱
${}
表示一個拼接號蔚约,會引起sql注入,所以不建議使用
接收參數(shù)是簡單類型時 ${}中只能寫#{value}
4.selectOne和selectList
selectOne
表示查詢出一條記錄進行映射涂籽。(可以使用selectList替代)
selectList
表示查詢出一個列表(多條記錄)進行映射苹祟。(不能使用selectOne替代)
.
文集:mybatis框架學習