MyBatis的一個入門程式
MyBatis在操作資料庫時,主要分為8大步驟:
(1) 讀取MyBatis配置檔案mabatis-config.xml,mabatis-config.xml作為MaBatis的全域性配置檔案,配置了MyBatis的執行環境等資訊,其主要是獲取資料庫連線。
(2) 載入對映檔案Mapper.xml。Mapper.xml即SQL對映檔案,該檔案配置了操作資料庫的SQL語句,需要在mybatis-config.xml中載入才能執行。mybatis-config.xml可以新增多個配置檔案,每個配置檔案對應資料庫中的一張表。
(3) 構建會話工廠。通過MyBatis的環境等配置資訊構建會話工廠SqlSessionFactory。
(4) 建立SqlSession物件。由會話工廠建立SqlSession物件。,該物件中包含執行SQL的所有方法。
(5) MyBatis底層定義的一個Executor介面會根據SqlSession傳遞的引數動態生成SQL語句,同時負責查詢快取的維護。
(6) 根據生成的SQL語句生成MappedStatement物件。
(7) 向MappedStatement輸入對映物件,這裡的輸入引數的對映過程就相當於JDBC程式設計中對preparedStatement物件設定引數的過程。
(8) 執行SQL語句,對MappedStatement物件返回的結果進行處理。
下面通過一個入門程式來理解。
1.根據學號查詢學生資訊
(1)這裡用sql server資料庫。
在SQL Server資料庫中,建立一個名為student的資料庫,建立一個student表,並插入幾條資料。
建立程式碼:
create database student;
use student;
create table student
(
st_no int identity(1,1) primary key ,
st_name varchar(30) not null,
sex varchar(2) default ‘男’ not null,
tel varchar(11),
address varchar(30),
)
alter table student add constraint ck_sex check (sex in(‘男’,‘女’));
insert into student values(‘張三’,‘女’,‘13688883333’,‘湖南長沙’);
insert into student values(‘李四’,‘女’,‘13644443333’,‘湖南益陽’);
insert into student values(‘李元霸’,‘男’,‘13512222444’,‘湖南衡陽’);
insert into student values(‘張莉莉’,‘女’,‘13688883333’,‘湖南長沙’);
select * from student;
(2)在Myeclipse建立一個名為project01的Web專案,將MyBatis的核心jar包、依賴包,以及Sql Server資料庫驅動新增到專案的lib目錄下。
(3)在src目錄下建立log4j.properties檔案,內容如下 :
# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration…
log4j.logger.cn.swjd=DEBUG
# 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輸出日誌資訊,如果要在控制檯檢視sql語句,就必須
在src目錄下建立log4j.properties檔案。
(4)在src目錄下建立cn.swjd.entries包,在該包下建立持久化類Student。
package cn.swjd.entries;
//學生持久化類
public class Student {
//主鍵學號
private Integer st_no;
//姓名,性別,年齡,電話 ,地址
private String st_name, sex, tel, address;
public Integer getSt_no() {
return st_no;
}
public void setSt_no(Integer st_no) {
this.st_no = st_no;
}
public String getSt_name() {
return st_name;
}
public void setSt_name(String st_name) {
this.st_name = st_name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getTel() {
return tel;
}
public void setTel(String tel) {
this.tel = tel;
}
public String getAddress() {
return address;
}
public void setAddress(String address) {
this.address = address;
}
@Override
public String toString() {
return “Student [st_no=” + st_no + “, st_name=” + st_name + “, sex=”
+ sex + “, tel=” + tel + “, address=” + address + “]”;
}
}
(5)在src目錄下。建立cn.swjd.mapper包,在包裡建立對映檔案StudentMapper.xml。
select * from student where st_no= #{st_no}
說明:元素是配置檔案的根元素,它包含一個namespace屬性,該屬性指定了的唯一名稱空間,通常設定為“包名+SQL對映檔名”的形式。
子元素中的資訊是用於執行查詢操作的配置,id是唯一識別符號。 parameterType:指定傳入引數的型別。 resultType:指定返回結果的型別。 #{}:表示一個佔位符,相當於jdbc中的?,其裡面的內容為接受引數的名稱。 (6)在src目錄下,建立MyBatis的核心配置檔案mybatis-config.xml。 “http://mybatis.org/dtd/mybatis-3-config.dtd”> 說明: 下可配置多個執行環境,default屬性用於設定預設執行環境。 (7)在src目錄下,建立一個cn.swjd.test包,建立測試類MyBatisTest,再編寫一個方法findStudentByIdTest(int st_id),並在main方法裡呼叫。 package cn.swjd.test; import java.io.IOException; import java.io.InputStream; 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 cn.swjd.entries.Student; public class MyBatisTest { public static void findStudentByIdTest(int st_id) throws Exception{ //1.讀取配置檔案 String resource=“mybatis-config.xml”; InputStream inputstream=Resources.getResourceAsStream(resource); //2.根據配置檔案構建SqlSessionFactory SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(inputstream); //3.通過SqlSessionFactory構建SqlSession SqlSession sqlsession=factory.openSession(); //4.SqlSession執行對映檔案中定義的SQL,並返回其對映結果 Student s=sqlsession.selectOne(“cn.swjd.mapper.StudentMapper.findStudentById”,st_id); //列印輸出結果 System.out.println(s.toString()); } public static void main(String args[]) throws Exception{ findStudentByIdTest(1); } } 執行結果: 2.根據姓名模糊查詢學生資訊 修改對映檔案StudentMapper.xml,新增一個
select * from student where st_name like ‘%${value}%’
這裡傳入引數為什麼不設定為#{}而用${}呢?
假設傳入引數在程式裡為 String value=”張”;
如果使用的是#{},最終的sql語句就會變成:
select * from student where st_name like ‘’張’’
使用${},最終的sql語句就會變成:
select * from student where st_name like ‘張’
原因:如果使用的是#{},傳入引數?就會根據配置檔案中parameterType屬性(即資料型別)自動變換,如果parameterType=“String”,就會自動加入’’, 如果parameterType=“Integer”,就不會加’’。 而使用${} 不管parameterType屬性為何值,都不會自動加’’。 在類MyBatisTest,編寫一個方法findStudentByNameTest(String value),並在main方法裡呼叫。 public static void findStudentByNameTest(String st_name) throws Exception{ //1.讀取配置檔案 String resource=“mybatis-config.xml”; InputStream inputstream=Resources.getResourceAsStream(resource); //2.根據配置檔案構建SqlSessionFactory SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(inputstream); //3.通過SqlSessionFactory構建SqlSession SqlSession sqlsession=factory.openSession(); //4.SqlSession執行對映檔案中定義的SQL,並返回其對映結果 List s=sqlsession.selectList(“cn.swjd.mapper.StudentMapper.findStudentByName”,st_name); /selectList方法第一個引數為的namespace屬性+的id屬性,後面接傳入引數/
//列印輸出結果
for(Student stu:s)
System.out.println(stu.toString());
}
public static void main(String args[]) throws Exception{
findStudentByNameTest(“張”);
}
執行結果:
結果出來了,但是這裡有一個問題,使用“${}”拼接字串,無法防止sql注入問題。
比如這裡,如果把方法呼叫改成:
findStudentByNameTest("1’;delete from student where st_no>0;commit; select * from student where st_name like '”);
它竟然可以操作資料庫!把表所有內容都刪除了。顯然,實際專案開發中,是不能出現這種bug的,你永遠不知道使用者會輸入什麼東西。
所以,為了安全性,這裡不能用${},只能用#{},我們可以用SqlServer中的拼接函式concat()。
修改後:
select * from student where st_name like concat(’%’,#{value},’%’)
修改、刪除、增加操作都差不多
相比於查詢,就是多了sqlsession.commit()提交事務這一步驟而已
select * from student where st_no= #{st_no}
select * from student where st_name like concat(’#’,#{value},’#’)
>
update student set st_name=#{st_name},sex=#{sex},tel=#{tel},address=#{address} where st_no=#{st_no}
delete from student where st_no=#{id}
insert into student values (#{st_name},#{sex},#{tel},#{address})
package cn.swjd.test;
import java.io.IOException;
import java.io.InputStream;
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;
import cn.swjd.entries.Student;
public class MyBatisTest {
//根據學號查詢學生
public static void findStudentByIdTest(int st_id) throws Exception{
String resource=“mybatis-config.xml”;
InputStream inputstream=Resources.getResourceAsStream(resource);
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(inputstream);
SqlSession sqlsession=factory.openSession();
Student s=sqlsession.selectOne(“cn.swjd.mapper.StudentMapper.findStudentById”,st_id);
/selectOne方法第一個引數為的namespace屬性+的id屬性,後面接傳入引數/ //列印輸出結果 System.out.println(s.toString()); } //根據姓名模糊查詢學生 public static void findStudentByNameTest(String st_name) throws Exception{ //1.讀取配置檔案 String resource=“mybatis-config.xml”; InputStream inputstream=Resources.getResourceAsStream(resource); //2.根據配置檔案構建SqlSessionFactory SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(inputstream); //3.通過SqlSessionFactory構建SqlSession SqlSession sqlsession=factory.openSession(); //4.SqlSession執行對映檔案中定義的SQL,並返回其對映結果 List s=sqlsession.selectList(“cn.swjd.mapper.StudentMapper.findStudentByName”,st_name); /selectList方法第一個引數為的namespace屬性+的id屬性,後面接傳入引數/
//列印輸出結果
for(Student stu:s)
System.out.println(stu.toString());
}
//更新學生資訊
public static void updateStudent(Student s) throws IOException{
String resource=“mybatis-config.xml”;
InputStream inputstream=Resources.getResourceAsStream(resource);
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(inputstream);
SqlSession sqlsession=factory.openSession();
int i = sqlsession.update(“cn.swjd.mapper.StudentMapper.updateStudent”, s);
//提交事務
sqlsession.commit();
if(i>0){
System.out.println(“更新學號為”+s.getSt_no()+“學生資訊成功!”);
}
}
//刪除學生資訊
public static void deleteStudent(int st_no) throws IOException{
String resource=“mybatis-config.xml”;
InputStream inputstream=Resources.getResourceAsStream(resource);
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(inputstream);
SqlSession sqlsession=factory.openSession();
int i = sqlsession.delete(“cn.swjd.mapper.StudentMapper.deleteStudent”, st_no);
sqlsession.commit();
if(i>0){
System.out.println(“刪除學號為”+st_no+“的學生資訊成功!”);
}
}
//增加學生資訊
public static void addStudent(Student s) throws IOException{
String resource=“mybatis-config.xml”;
InputStream inputstream=Resources.getResourceAsStream(resource);
SqlSessionFactory factory=new SqlSessionFactoryBuilder().build(inputstream);
SqlSession sqlsession=factory.openSession();
int i = sqlsession.insert(“cn.swjd.mapper.StudentMapper.addStudent”, s);
sqlsession.commit();
if(i>0){
System.out.println(“新增一條學生資訊成功!”);
}
}
public static void main(String args[]) throws Exception{
Student s=new Student();
s.setSt_name(“李雲瑞”);
s.setSex(“男”);
addStudent(s);
}
}
瀋陽性病醫院哪家好