1. 程式人生 > >MyBatis的一個入門程式

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);

}

}

瀋陽性病醫院哪家好