使用Maven構建一個項目,導入相應的架包
在pom文件中導入以下架包

<!-- 添加項目jdk編譯插件 --> <build> <plugins> <!-- 設置編譯版本為1.8 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> <encoding>UTF-8</encoding> </configuration> </plugin> </plugins> </build> <!-- 導入需要的包 --> <dependencies> <!-- 測試包 --> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.8.1</version> <scope>test</scope> </dependency> <!-- 數據庫驅動包 --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.25</version> </dependency> <!-- mybatis包 --> <dependency> <groupId>org.mybatis</groupId> <artifactId>mybatis</artifactId> <version>3.4.6</version> </dependency> </dependencies>
創建數據庫和相應的表,下面放上sql語句
create table stu_info ( s_id int primary key auto_increment, s_name varchar(30) not null, s_age int not null, s_sex char(10) not null, s_tel varchar(20) not null, s_origin varchar(50) not null ) -- 班級信息表 create table class_info ( c_id int primary key auto_increment, c_name varchar(20) not null ) -- 關聯表 create table stu_class ( sc_id int primary key auto_increment, s_id int not null, c_id int not null ) info(s_name,s_age,s_sex,s_tel,s_origin) values('小李子',18,'男','18970711655','江西贛州' insert into stu_info(s_name,s_age,s_sex,s_tel,s_origin) values('小李子',18,'男','18875711955','江西贛州'),('春春',17,'男','17679077981','江西贛州'),('廖狗蛋',20,'男','17770719761','江西贛州') -- 添加幾個班級 insert into class_info(c_name) values('w10'),('w11'),('w12') -- 把創建的學生添加到班級中 insert into stu_class(s_id,c_id) values(47,1),(48,2),(49,3),(50,2) -- 根據id查詢學生信息 select s.*,c.c_name from stu_info s inner join stu_class sc on s.s_id = sc.s_id inner join class_info c on sc.c_id = c.c_id delete from stu_info where s_id = #{id} -- 修改學生信息 update stu_info set s_name = '',s_age = , s_sex = '', s_tel = '',s_origin = where s_id = -- 使用別名方式映射實體類查詢學生信息 SELECT s_id as sid ,s_name as sname,s_age as sage, s_sex as ssex, s_tel as stel,s_origin as origin from stu_info select * from stu_info where s_name like '小%' select * from stu_info where s_name like '小%' select * from stu_info where s_age BETWEEN 16 and 18 select * from stu_info where s_age BETWEEN 16 and 17 select * from stu_info where s_age = 17 select count(*) from stu_info select * from stu_info where s_age = 17 and s_origin like '江西%' delete from stu_info where s_id in(10,11,12,10,11,12)
創建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> <!-- typeAliases用於給類型指定別名 --> <typeAliases> <!-- 方式一:使用typeAlias設置別名 type屬性指定的是類的完整類名,alias屬性指定的是別名 --> <!--<typeAlias type="edu.nf.ch01.entity.Users" alias="Users"/>--> <!-- 方式二:直接給整個實體包定義別名,name屬性指定實體所在的包名 ,這樣會為每一個實體類自動生成一個別名, 而這個別名就是實體類的類名並且首字母小寫--> <package name="edu.wang.ch02.entity"/> </typeAliases> <!-- environments用於配置數據源環境,里面可以配置多個。 environment環境。 每個數據源環境都包含在environment子標簽中, default屬性指定使用默認的數據源環境是哪個, 對應environment標簽的id的值--> <environments default="mysql"> <!-- 配置一個mysql的數據源環境,id是自定義的 --> <environment id="mysql"> <!-- 指定事務管理器,這里使用JDBC的本地事務 --> <transactionManager type="JDBC"/> <!-- 配置數據源,type指定使用mybatis自帶的數據庫連接池 --> <dataSource type="POOLED"> <!-- 配置數據庫的連接屬性 --> <property name="driver" value="com.mysql.jdbc.Driver"/> <!-- 數據庫驅動 --> <property name="url" value="jdbc:mysql://localhost:3306/student?useSSL=true&useUnicode=true&characterEncoding=utf-8"/> <property name="username" value="root"/> <!-- 數據庫賬號 --> <property name="password" value="root"/> <!-- 數據庫密碼 --> </dataSource> </environment> </environments> <!-- 將所有的mapper映射配置文件加入到mappers配置中 --> <mappers>
<!--引入映射文件 -->
<!-- 使用注解不是用配置文件使用class配置 -->
<!--<mapper class="edu.wang.ch02.dao.StudentDao"/>-->
<!-- 使用注解不是用配置文件時也可以使用name配置 -->
<!--<package name="edu.wang.ch02.dao"/>-->
<!-- 當需要使用多表查詢的時候使用mapper.xml映射屬性字段需要映入xml文件,如果不用則使用上面配置即可 -->
<mapper resource="mapper/StudentMapper.xml"/>
</mappers>
</configuration>
創建一個MybatisUtil工具類獲取SqlSession會話
package edu.wang.studentsystem.commons; 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 java.io.InputStream; public class MybatisUtil { //定義一個全局變量方便調用 private static SqlSessionFactory sqlSessionFactory; static { try { //讀取mybatis-config.xml配置文件 InputStream is = Resources.getResourceAsStream("mybatis-config.xml"); //獲取會話工廠 sqlSessionFactory = new SqlSessionFactoryBuilder().build(is); } catch (Exception e) { new RuntimeException(e.getMessage()); } } //獲取會話 public static SqlSession getSession(){ //獲取一個sql會話 return sqlSessionFactory.openSession(); } /** * * @param autoCommit 如果為真則自動提交事務,否者需要手動提交事務 * @return */ public static SqlSession getSession(boolean autoCommit){ return sqlSessionFactory.openSession(autoCommit); } }
編寫一個StudentDao接口使用注解的方法
package edu.wang.ch02.dao; import com.sun.org.apache.xalan.internal.xsltc.runtime.InternalRuntimeError; import edu.wang.ch02.entity.Student; import org.apache.ibatis.annotations.*; import java.util.List; import java.util.Map; /** * @Author Waverly * @Date 2018/9/12 */ public interface StudentDao { /** * 保存用戶信息 * @param student * @Insert 注解標識要執行insert語句 * 主鍵策略: * 方式一:使用@Options注解實現主鍵自增長 * @Options(keyProperty = "s_id" , useGeneratedKeys = true) * keyProperty="指定要自增長的主鍵字段" useGeneratedKeys="true" 為真為使用自增長 * 方式二:使用@SelectKey注解生成UUID或sequence主鍵, * keyProperty指定實體的主鍵字段,resultType指定生成UUID的類型為String, * before指定為true表示在執行SQL之前生成uuid * statement指定查詢數據的函數生成uuid * * 例如:@SelectKey(keyProperty = "id", * resultType = String.class, * before = true,statement = "select uuid() from dual") * * keyProperty ="自增長的主鍵字段" * resultType = "生成什么類型如(String.class)" * before = true 在執行SQL之前插入 * statement = "select uuid() from dual" :生成的參數UUID * 方式三:自己維護主鍵生成,不需要任何注解 */ //傳入一個Student對象映射每個對應的字段 @Insert("insert into stu_info(s_name,s_age,s_sex,s_tel,s_origin) values(#{sname},#{sage},#{ssex},#{stel},#{origin})") //自動增長,使用了方式一 @Options(keyProperty = "s_id" , useGeneratedKeys = true) void saveStudent(Student student); //根據id刪除一條數據 @Delete("delete from stu_info where s_id = #{id}") void delStudentById(Integer id); //根據傳入的對象自動映射到對應的字段 @Update("update stu_info set s_name = #{sname},s_age = #{sage} , s_sex = #{ssex}, s_tel = #{stel},s_origin =#{origin} where s_id = #{sid}") void updateStudent(Student student); //因為實體類和數據庫中的字段名不一致,所以需要用as把數據庫中的每個字段變成實體類中的字段名 @Select(" SELECT s_id as sid ,s_name as sname,s_age as sage, s_sex as ssex, s_tel as stel,s_origin as origin from stu_info") //使用@ResultType注解指定返回結果集的類型, //這個注解並不強制要求,mybatis會通過反射獲取方法返回值的Class類型 //@ResultType(List.class) List<Student> findAllStudent(); //統計學生的個數 @Select("select count(*) from stu_info") @ResultType(Integer.class) Integer countStudent(); //多表查詢查詢所在班級 @Select("select s.*,c.c_name from stu_info s inner join stu_class sc on s.s_id = sc.s_id inner join class_info c on sc.c_id = c.c_id") //使用StudentMapper.xml映射字段屬性 @ResultMap("edu.wang.ch02.dao.StudentDao.StuMap") List<Student> getStudentList(); }
創建一個實體類進行映射
package edu.wang.ch02.entity; /** * @Author Waverly * @Date 2018/9/12 */ public class Student { private Integer sid; private String sname; private int sage; private String ssex; private String stel; private String origin;
//一對一關系,一個學生對應一個班級 private ClassInfo classInfo; @Override public String toString() { return "Student{" + "sid=" + sid + ", sname='" + sname + '\'' + ", sage='" + sage + '\'' + ", ssex='" + ssex + '\'' + ", stel='" + stel + '\'' + ", origin='" + origin + '\'' + ",classInfo="+classInfo+'\''+ '}'; } public Student() { } public Student(Integer sid, String sname, int sage, String ssex, String stel, String origin) { this.sid = sid; this.sname = sname; this.sage = sage; this.ssex = ssex; this.stel = stel; this.origin = origin; } public Integer getSid() { return sid; } public void setSid(Integer sid) { this.sid = sid; } public String getSname() { return sname; } public void setSname(String sname) { this.sname = sname; } public int getSage() { return sage; } public void setSage(int sage) { this.sage = sage; } public String getSsex() { return ssex; } public void setSsex(String ssex) { this.ssex = ssex; } public String getStel() { return stel; } public void setStel(String stel) { this.stel = stel; } public String getOrigin() { return origin; } public void setOrigin(String origin) { this.origin = origin; } }
package edu.wang.ch02.entity; /** * @Author Waverly * @Date 2018/9/19 */ public class ClassInfo { private Integer cid; private String cname; @Override public String toString() { return "ClassInfo{" + "cid=" + cid + ", cname='" + cname + '\'' + '}'; } }
編寫StudentMapper.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指定Dao接口的完整類名 mybatis會依據這個接口動態創建一個實現類去實現這個接口, 而這個實現類是一個Mapper對象--> <mapper namespace="edu.wang.ch02.dao.StudentDao"> <!-- 基於mybatis的增刪查改的sql映射配置 --> <!-- 插入操作,id指定UserDao接口中的方法名, parameterType指定方法參數的類型, 也可以設置為typeAliases中定義的別名。 useGeneratedKeys屬性設置為true表示使用主鍵自增長, keyProperty屬性指定實體中需要自增長的字段名稱 sql中的values設置參數的時候使用#{}, #{}是一個ognl表達式(對象圖導航語言), 這個表達式最終會被mybatis解析成具體的值, 在這里#{}中指定的是實體中的字段名--> <resultMap id="StuMap" type="Student"> <id column="s_id" property="sid"/><!-- 主鍵id映射 --> <result column="s_name" property="sname"></result> <result column="s_age" property="sage"></result> <result column="s_sex" property="ssex"></result> <result column="s_tel" property="stel"></result> <result column="s_origin" property="origin"></result> <association property="classInfo" resultMap="classMap"/><!-- 一對一 關系 --> </resultMap> <resultMap id="classMap" type="classInfo"> <id column="c_id" property="cid"/><!-- 映射實體類classInfo中的id --> <result column="c_name" property="cname"/><!-- 映射實體類classInfo中的cname --> </resultMap> </mapper>
注解需要跟配置文件中的id對應
最后編寫一下測試類測試是否有效
package edu.wang.ch02.test; import edu.wang.ch02.dao.StudentDao; import edu.wang.ch02.dao.impl.StudentDaoImpl; import edu.wang.ch02.entity.Student; import org.junit.Test; import java.util.List; /** * @Author Waverly * @Date 2018/9/18 */ public class StudentDaoImplTest { /** * 測試根據id刪除學生信息的方法 */ @Test public void testDelStudentById(){ StudentDao studentDao = new StudentDaoImpl(); studentDao.delStudentById(40); } /** * 測試添加學生信息的方法 */ @Test public void testSaveStudent(){ Student student = new Student(); student.setSname("張三"); student.setSage(18); student.setStel("18888888"); student.setSsex("男"); student.setOrigin("江西"); new StudentDaoImpl().saveStudent(student); } /** * 測試查詢所有學生信息的方法 */ @Test public void testFindAllStudent(){ List<Student> list = new StudentDaoImpl().findAllStudent(); for (Student student : list) { System.out.println(student); } } /** * 測試統計學生的方法 */ @Test public void testCountStudent(){ System.out.println(new StudentDaoImpl().countStudent()); } /** * 測試修改學生的方法 */ @Test public void testUpdateStudent(){ Student student = new Student(); student.setSid(47); student.setSname("張三"); student.setSage(18); student.setStel("18888888"); student.setSsex("男"); student.setOrigin("江西"); new StudentDaoImpl().updateStudent(student); } /** * 測試getStudentList */ @Test public void testGetStudentList(){ List<Student> studentList = new StudentDaoImpl().getStudentList(); for (Student student : studentList) { System.out.println(student); } } }
運行結果