java-SSM框架之mybatis框架總結
一.專案
1.資料庫準備
CREATE table blog(
id VARCHAR(50) not NULL COMMENT '博客id',
title VARCHAR(199) not null COMMENT '博客標題',
author varchar(30) not null COMMENT '博客作者',
createTime datetime not NULL COMMENT '創建時間',
views int(30) not null COMMENT '瀏覽量'
) ENGINE=INNODB DEFAULT CHARSET=utf8
SHOW tables;
SELECT * from blog;
use mybatis;
CREATE table teacher(
id int(10) not NULL,
`name` varchar(30) DEFAULT NULL,
PRIMARY key(id)
)ENGINE=INNODB DEFAULT charset=utf8;
insert into teacher(id,name) values(1,'秦老師');
CREATE table student(
id int(10) not NULL,
`name` VARCHAR(30) DEFAULT NULL,
tid int(10) DEFAULT NULL,
PRIMARY key(id),
KEY fktid (tid),
CONSTRAINT fktid FOREIGN key(tid) REFERENCES teacher (id)
)ENGINE=INNODB DEFAULT charset=utf8;
insert into student(id,name,tid) values
(1,'小明',1),
(2,'小王',1),
(3,'小李',1),
(4,'小廖',1),
(5,'小周',1)
2.idea環境搭建

父模塊下prom.xml匯入jar包,通過繼承后面創建的子專案都擁有這些jar包
工程目錄

父porm.xml和子porm.xml要點示例
//父porm.xml有子模塊的架構
<modules>
<module>mybatis-01</module>
<module>mybatis-03</module>
<module>mybatis-04</module>
<module>mybatis-1more</module>
<module>mybatis-project</module>
</modules>
//子porm.xml有父模塊的標記
<parent>
<artifactId>Mybatis-Study</artifactId>
<groupId>org.example</groupId>
<version>1.0-SNAPSHOT</version>
</parent>
//解決資源檔案無法被匯出到target
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
<include>**/*.xml</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
</build>
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>
//讀取資料庫屬性組態檔db.properties
<properties resource="db.properties"/>
//設定日志和資料表欄位與物體類的駝峰和下劃線互轉的配置
<settings>
<setting name="logImpl" value="STDOUT_LOGGING"/>
<setting name="mapUnderscoreToCamelCase" value="true" />
</settings>
//屬性配置之別名優化
<typeAliases>
<package name="com.com.huang.pojo"/>
</typeAliases>
//配置運行的環境
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="${driver}"/>
<property name="url" value="${url}"/>
<property name="username" value="${username}"/>
<property name="password" value="${password}"/>
</dataSource>
</environment>
</environments>
//Mapper介面對應的xml檔案必須要在此處注冊,有三種寫法
//我們通常使用class,但前提是Mapper介面和對應的xml檔案在一個包下,且名字一樣
<mappers>
<mapper class="com.com.huang.dao.StudentMapper"/>
<mapper class="com.com.huang.dao.TeacherMapper"/>
</mappers>
</configuration>
MybatisUtils工具類獲取sqlSession物件
package com.huang.utils;
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.IOException;
import java.io.InputStream;
public class MybatisUtils {
public static SqlSessionFactory sqlSessionFactory;
static {
try {
InputStream inputStream = Resources.getResourceAsStream("mybatis.config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}
//此處設定布林值true,增刪改就無需sqlSession.commit()提交事務了
public static SqlSession getSqlSession(){
return sqlSessionFactory.openSession(true);
}
}
資料庫屬性組態檔db.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/${需要連接的資料庫名如:mybatis}?useSSL=true&useUnicode=true&characterEncoding=UTF-8
username=${資料庫用戶名}
password=${資料庫密碼}
Mapper介面示例
package com.huang.dao;
import com.huang.pojo.Student;
import java.util.List;
public interface StudentMapper {
// 多對一(學生對老師)的處理---按照查詢嵌套處理
List<Student> getStudent();
// 多對一(學生對老師)的處理---按照查詢嵌套處理
List<Student> getStudent2();
}
Mapper介面對應的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">
//namespace為相對路徑下的Mapper介面
<mapper namespace="com.huang.dao.StudentMapper">
//此處撰寫sql陳述句,示例
<select id="getStudent" resultMap="StudentTeacher">
select * from mybatis.student;
</select>
</mapper>
補充lombok插件的配置
1.安裝lombok插件
2.在子porm.xml中配置依賴
<dependencies>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
</dependencies>
3.使用注解@Data即可,見物體類使用
完成了以上環境搭建,我們可以開始測驗了
1.測驗目錄

2.測驗類示例
// 測驗環境搭建成功
@Test
public void test1(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
TeacherMapper mapper = sqlSession.getMapper(TeacherMapper.class);
List<Teacher> teacherList = mapper.getTeacher();
for (Teacher teacher : teacherList) {
System.out.println(teacher);
}
sqlSession.close();
}
3.多對一的處理
物體類pojo
package com.huang.pojo;
import lombok.Data;
@Data
public class Teacher {
private int id;
private String name;
}
package com.huang.pojo;
import lombok.Data;
@Data
public class Student {
private int id;
private String name;
// 外鍵關聯的老師物件
private Teacher teacher;
}
1.按照查詢嵌套處理
<select id="getStudent" resultMap="StudentTeacher">
select * from mybatis.student;
</select>
<resultMap id="StudentTeacher" type="Student">
<result property="id" column="id"/>
<result property="name" column="name"/>
//注意一下固定寫法
<association property="teacher" column="tid" javaType="teacher" select="getSTeacher"/>
</resultMap>
// #{tid}中tid可以為任何內容
<select id="getSTeacher" resultType="Teacher">
select * from mybatis.teacher where id = #{tid};
</select>
2.按照結果嵌套處理
<select id="getStudent2" resultMap="Student2Teacher2">
select s.id sid,s.name sname,t.name tname from mybatis.student s,mybatis.teacher t where s.tid = t.id;
</select>
<resultMap id="Student2Teacher2" type="student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<association property="teacher" javaType="teacher">
<result property="name" column="tname"/>
</association>
</resultMap>
4.多對一的處理(以下對應的mapper和xml檔案沒有給出)
物體類pojo
package com.huang.pojo;
import lombok.Data;
@Data
public class Teacher {
private int id;
private String name;
private List<Student> students;
}
package com.huang.pojo;
import lombok.Data;
@Data
public class Student {
private int id;
private String name;
private int tid;
}
1.按照查詢嵌套處理
<select id="getTeacher2" resultMap="TeacherStudent2">
select * from mybatis.teacher where id = #{id};
</select>
<resultMap id="TeacherStudent2" type="Teacher"
<collection property="students" column="id" javaType="ArrayList" ofType="Student" select="getStudentByTeacherId"/>
</resultMap>
// #{id}中id可以為任何內容
<select id="getStudentByTeacherId" resultType="Student">
select * from mybatis.student where tid = #{id};
</select>
2.按照結果嵌套處理
<select id="getTeacher" resultMap="TeacherStudent">
select s.id sid,s.name sname,t.name tname,t.id tid
from student s,teacher t
where s.tid = t.id and t.id = #{id};
</select>
<resultMap id="TeacherStudent" type="Teacher">
<result property="id" column="tid"/>
<result property="name" column="tname"/>
<collection property="students" ofType="Student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<result property="tid" column="tid"/>
</collection >
</resultMap>
5.動態sql
1.if陳述句
<select id="getStudent" resultType="student">
SELECT * FROM mybatis.student
<if test="name!=null">
AND name = #{name}
</if>
</select>
2.where標簽
<select id="getStudent" resultType="student" parameterType="map">
SELECT * mybatis.student
//where會自動添加或者洗掉and,choose和when滿足一個就不會繼續往后,
//類似switch,case/break
<where>
<choose>
<when test="name!= null">
AND name = #{name}
</when>
<when test="tid != null">
AND tid =#{tid }
</when>
<otherwise>
AND id= "2"
</otherwise>
</choose>
</where>
</select>
3.set標簽
<update id="updateEmprById2" parameterType="emp">
UPDATE mybatis.student
//set會自動添加或者洗掉,保證sql陳述句的合法性
<set>
<if test="name!=null"> name=#{name},</if>
<if test="tid!=null"> tid=#{tid},</if>
</set>
where id = #{id}
</update>
6.補充一些點
一.mybatis實作分頁方式1
//1.介面
List<User> getUserListByLimit(Map<String,Integer> map);
//2.mapper.xml配置
//配合使用結果集映射,解決欄位名不一致的問題
<resultMap id="UserMap" type="user">
<result property="password" column="pwd"/>
</resultMap>
<select id="getUserListByLimit" resultMap="UserMap">
select * from mybatis.user limit #{startIndex},#{pageSize};
</select>
//3.測驗類
@Test
public void testLimit(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserDao userdao = sqlSession.getMapper(UserDao.class);
Logger logger = Logger.getLogger(UserDaoTest.class);
logger.info("info:用分頁來查詢資料");
HashMap<String, Integer> map = new HashMap<>();
map.put("startIndex",0);
map.put("pageSize",2);
List<User> userList = userdao.getUserListByLimit(map);
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();
}
二.mybatis實作分頁方式2
//1.介面
List<User> getUserListByRowBounds();
//2.mapper.xml配置
//配合使用結果集映射
<resultMap id="UserMap" type="user">
<result property="password" column="pwd"/>
</resultMap>
<select id="getUserListByRowBounds" resultMap="UserMap">
//此處要查詢全部
select * from mybatis.user;
</select>
//3.測驗類
@Test
public void testRowBounds(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
// RowBounds實作
RowBounds rowBounds = new RowBounds(0, 1);
logger.info("info:使用RowBounds來進行分頁");
// Java代碼層面實作分頁 這里是sqlSession執行sql語言的第二種方式,(不推薦)
List<User> userList = sqlSession.selectList("com.huang.dao.UserDao.getUserListByRowBounds", null, rowBounds);
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();
}
三.模糊查詢
//Mapper介面
List<User> getUserListByNameLike(String name);
//模糊查詢
<select id="getUserListByNameLike" resultType="user">
select * from mybatis.user where name like concat("%",#{name},"%");
</select>
//測驗類
@Test
public void testLike(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserDao userDao = sqlSession.getMapper(UserDao.class);
//測驗模糊查詢
//方式一:List<User> userList = userDao.getUserListByNameLike("%王%");
List<User> userList = userDao.getUserListByNameLike("王");
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();
}
四.map引數
//Mapper介面
List<User> getUserListById2(Map<String,Object> map);
//使用map可以自定義引數名
<select id="getUserListById2" resultType="user" parameterType="map">
select * from mybatis.user where id = #{selfDefinedField};
</select>
//測驗類
@Test
public void test0(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserDao userDao = sqlSession.getMapper(UserDao.class);
HashMap<String, Object> map = new HashMap<String, Object>();
map.put("selfDefinedField",5);
List<User> userList = userDao.getUserListById2(map);
for (User user : userList) {
System.out.println(user);
}
sqlSession.close();
}
五.注解
//增加一個用戶 注解適用于簡單的業務邏輯
@Insert("insert into user(id,name,pwd) values(#{id},#{name},#{password})")
int insertUser(User user);
六.Log4j日志
1.匯入jar包
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
2.在resource下新建log4j.properties組態檔
# priority :debug<info<warn<error
#you cannot specify every priority with different file for log4j
log4j.rootLogger=debug,stdout,info,debug,warn,error
#console
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern= [%d{yyyy-MM-dd HH:mm:ss a}]:%p %l%m%n
#info log
log4j.logger.info=info
log4j.appender.info=org.apache.log4j.DailyRollingFileAppender
log4j.appender.info.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.info.File=./src/log/info.log
log4j.appender.info.Append=true
log4j.appender.info.Threshold=INFO
log4j.appender.info.layout=org.apache.log4j.PatternLayout
log4j.appender.info.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n
#debug log
log4j.logger.debug=debug
log4j.appender.debug=org.apache.log4j.DailyRollingFileAppender
log4j.appender.debug.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.debug.File=./src/log/debug.log
log4j.appender.debug.Append=true
log4j.appender.debug.Threshold=DEBUG
log4j.appender.debug.layout=org.apache.log4j.PatternLayout
log4j.appender.debug.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n
#warn log
log4j.logger.warn=warn
log4j.appender.warn=org.apache.log4j.DailyRollingFileAppender
log4j.appender.warn.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.warn.File=./src/log/warn.log
log4j.appender.warn.Append=true
log4j.appender.warn.Threshold=WARN
log4j.appender.warn.layout=org.apache.log4j.PatternLayout
log4j.appender.warn.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n
#error
log4j.logger.error=error
log4j.appender.error = org.apache.log4j.DailyRollingFileAppender
log4j.appender.error.DatePattern='_'yyyy-MM-dd'.log'
log4j.appender.error.File = ./src/log/error.log
log4j.appender.error.Append = true
log4j.appender.error.Threshold = ERROR
log4j.appender.error.layout = org.apache.log4j.PatternLayout
log4j.appender.error.layout.ConversionPattern = %d{yyyy-MM-dd HH:mm:ss a} [Thread: %t][ Class:%c >> Method: %l ]%n%p:%m%n
3.在mybatis.config.xml核心組態檔中配置
<settings>
<setting name="logImpl" value="LOG4J"/>
//解決駝峰轉資料庫中的_
<setting name="mapUnderscoreToCamelCase" value="true"/>
</settings>
4.在測驗類中測驗
static Logger logger = Logger.getLogger(類物件【Student.class】)
logger.info("info:進入了資訊輸出");
logger.debug("debug:進入了debug階段");
logger.error("error:進入了error階段");
@Test
public void test1(){
SqlSession sqlSession = MybatisUtils.getSqlSession();
UserDao userdao = sqlSession.getMapper(UserDao.class);
List<User> userlist = userdao.getUserListById(1);
logger.info("info:進入了資訊輸出");
for (User user : userlist) {
System.out.println(user);
}
sqlSession.close();
}
@Test
public void test2(){
logger.info("info:進入了資訊輸出");
}
5.最后會在log4j.properties指定的位置生成日志檔案

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/252169.html
標籤:其他
上一篇:配置springcloud配置中心讀取github上的組態檔報錯:com.jcraft.jsch.JSchException: Auth fail解決方案
下一篇:c#入門學習
