一、 Java API 不用config組態檔
SqlSessionUtil.java
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import dao.PersonMapper;
import entity.Person;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.transaction.TransactionFactory;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
/**
* @author 發現更多精彩 關注公眾號:木子的晝夜編程
* 一個生活在互聯網底層,做著增刪改查的碼農,不諳世事的造作
* @create 2021-09-04 17:15
*/
public class SqlSessionUtil {
// 資料庫配置
private static String user = "root";
private static String password = "123456";
private static Integer port = 3306;
private static String url = "jdbc:mysql://127.0.0.1:3306/test";
public static SqlSession getSession(){
// 1. 創建 DataSources
MysqlDataSource dataSource = new MysqlDataSource();
dataSource.setUser(user);
dataSource.setPassword(password);
dataSource.setPort(port);
dataSource.setUrl(url);
dataSource.setUseSSL(true);
// 2. 創建 TransactionFactory
TransactionFactory tsf = new JdbcTransactionFactory();
// 3. 創建 Environment
Environment ev = new Environment("development", tsf, dataSource);
// 4. 創建Configuration
Configuration cfg = new Configuration(ev);
// 4.1 注冊別名
cfg.getTypeAliasRegistry().registerAlias("person", Person.class);
// 也可以直接指定包路徑
// cfg.getTypeAliasRegistry().registerAliases("entity");
// 4.2 添加Mapper映射
cfg.addMapper(PersonMapper.class);
// 也可以直接指定包名
//cfg.addMappers("dao");
// 5. 創建SqlSessionFactoryBuilder
SqlSessionFactoryBuilder ssfb = new SqlSessionFactoryBuilder();
// 6. 創建SqlSessionFactory
SqlSessionFactory factory = ssfb.build(cfg);
return factory.openSession();
}
}
PersonMapper.java
package dao;
import entity.Person;
import org.apache.ibatis.annotations.Select;
import java.util.List;
/**
* @author 發現更多精彩 關注公眾號:木子的晝夜編程 分享一個生活在互聯網底層做著增刪改查的碼農的感悟與學習
* @create 2021-08-30 21:54
*/
public interface PersonMapper {
// 測驗
@Select({"select name,age from person"})
List<Person> select();
}
TestMain02.java
import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;
import dao.PersonMapper;
import entity.Person;
import org.apache.ibatis.mapping.Environment;
import org.apache.ibatis.session.Configuration;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.apache.ibatis.transaction.TransactionFactory;
import org.apache.ibatis.transaction.jdbc.JdbcTransactionFactory;
import java.sql.SQLException;
import java.util.List;
/**
* @author 發現更多精彩 關注公眾號:木子的晝夜編程
* 一個生活在互聯網底層,做著增刪改查的碼農,不諳世事的造作
* @create 2021-09-04 10:26
*/
public class TestMain02 {
public static void main(String[] args) throws SQLException {
// 7. 創建 SqlSession
try (SqlSession sqlSession = SqlSessionUtil.getSession()) {
// 8. 后邊就是常規操作了
PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
List<Person> list = mapper.select();
System.out.println(list);
}
}
}
輸出結果:

可以看到這里沒有用xml組態檔,創建SqlSession、查詢資料庫都是在JAVA類里完成的
二、 Java API 增刪改查
我經歷過很多專案,大部分的專案負責人包括我自己不是很喜歡用注解的方式寫SQL,原因可能因為
第一不好管理sql ,第二維護成本比較高 可能還有其他原因,但是不管用不用,你不能不會,你必須掌握簡單的使用方式,保不齊哪一天你去一個專案組,那技術負責人就喜歡用注解方式寫SQL呢?
下邊我寫一個增刪改查的例子:
PersonMapper.java
package dao;
import entity.Person;
import org.apache.ibatis.annotations.*;
import java.math.BigDecimal;
import java.sql.PseudoColumnUsage;
import java.util.List;
/**
* @author 發現更多精彩 關注公眾號:木子的晝夜編程 分享一個生活在互聯網底層做著增刪改查的碼農的感悟與學習
* @create 2021-08-30 21:54
*/
public interface PersonMapper {
// 串列
@Select({"select id , `name`,age,salary,job_name jobName from person"})
List<Person> select();
// 增加
@Insert("insert into person (`name`,job_name,salary,age) value (#{name},#{jobName},#{salary},#{age})")
void insert(Person p);
// 修改工資
@Update("update person set salary = #{salary} where id = #{id}")
void update(@Param("id") Long id, @Param("salary") BigDecimal salary);
// 洗掉記錄
@Delete("delete from person where id = #{id}")
void delete(Long id);
// 根據薪資范圍查詢person
@Select("select id , name,age,salary,job_name jobName from person where salary between #{start} and #{end}")
List<Person> listBySalary(@Param("start") BigDecimal start, @Param("end") BigDecimal end);
}
TestMain03.java
import dao.PersonMapper;
import entity.Person;
import org.apache.ibatis.session.SqlSession;
import java.math.BigDecimal;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
/**
* @author 發現更多精彩 關注公眾號:木子的晝夜編程
* 一個生活在互聯網底層,做著增刪改查的碼農,不諳世事的造作
* @create 2021-09-04 10:26
*/
public class TestMain03 {
public static void main(String[] args) throws SQLException {
try (SqlSession sqlSession = SqlSessionUtil.getSession()) {
PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
// 1. 查詢
System.out.println("初始值:");
List<Person> list = mapper.select();
System.out.println(list);
// 2. 洗掉
mapper.delete(1L);
System.out.println("洗掉后的值:");
List<Person> list02 = mapper.select();
System.out.println(list02);
// 3. 新增值
Person insert = new Person();
insert.setName("小明");
insert.setAge(18);
insert.setJobName("開發工程師(初級)");
insert.setSalary(BigDecimal.valueOf(60000));
mapper.insert(insert);
System.out.println("新增后的值:");
List<Person> list03 = mapper.select();
System.out.println(list03);
// 4. 更新值 給小月月漲工資
mapper.update(2L, BigDecimal.valueOf(888888));
System.out.println("更新后的值:");
List<Person> list04 = mapper.select();
System.out.println(list04);
// 5. 查詢工資是5萬到10萬的員工
List<Person> lists = mapper.listBySalary(BigDecimal.valueOf(50000), BigDecimal.valueOf(100000));
System.out.println("根據薪資范圍查詢的值:");
System.out.println(lists);
}
}
}
輸出結果:

跟用xml寫sql差不多吧~
三、讀取插入后自增列的值
@Insert("insert into person (`name`,job_name,salary,age) value (#{name},#{jobName},#{salary},#{age})")
@SelectKey(resultType = Long.class, keyProperty = "id",
statement = {"SELECT LAST_INSERT_ID()"}, before = false)
Long insert(Person p);
public static void main(String[] args){
try (SqlSession sqlSession = SqlSessionUtil.getSession()) {
PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
// 3. 新增值
Person insert = new Person();
insert.setName("小明");
insert.setAge(18);
insert.setJobName("開發工程師(初級)");
insert.setSalary(BigDecimal.valueOf(60000));
mapper.insert(insert);
System.out.println("插入資料自增id:"+insert.getId());
}
}
經驗證,是可以回傳的,
四、注解sql怎么動態呢 - 第一種方法
例如根據名稱是否為空來查詢,前幾篇寫過的,不知道有人記得沒,
@Select({
"<script>",
"select * from person ",
"<where>",
"<if test='name != null and name !=\"\" '>name like concat('%',#{name},'%')</if>",
"</where>",
"</script>"
})
List<Person> select(@Param("name") String name);
五、 注解Sql怎么動態呢 - 第二種方法 SelectProvider
可以指定Java類來組合自己的SQL
PersonMapper.java
@SelectProvider(type = MySqlBuilder.class , method = "listByNameAndAge")
List<Person> selectByAgeAndName(@Param("name") String name, @Param("age") Integer age);
MySqlBuilder.java
package sql;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.jdbc.SQL;
/**
* @author 發現更多精彩 關注公眾號:木子的晝夜編程
* 一個生活在互聯網底層,做著增刪改查的碼農,不諳世事的造作
* @create 2021-09-04 19:06
*/
public class MySqlBuilder {
public static String listByNameAndAge(@Param("name") final String name, @Param("age") final Integer age){
System.out.println("自定義SQL");
return new SQL(){{
SELECT("*");
FROM("person ");
WHERE(" 1=1 ");
if (name != null) {
AND().WHERE("name like concat('%',#{name},'%')");
}
if (age != null) {
AND().WHERE("age = #{age}");
}
// 排序
ORDER_BY("id");
}}.toString();
}
}
測驗:
public static void main(String[] args){
try (SqlSession sqlSession = SqlSessionUtil.getSession()) {
PersonMapper mapper = sqlSession.getMapper(PersonMapper.class);
// 3. 新增值
List<Person> list = mapper.selectByAgeAndName("小月", 19);
System.out.println(list);
}
}
這個真的就是了解,萬一哪一天遇到了不會很懵逼的說這是個啥玩意,但是遇到的概率應該會很小很小
六、 上一篇說過databaseId 那注解方式是什么樣的呢
@Select(value = "SELECT 'mysql' ", databaseId = "mysql")
@Select(value = "SELECT 'oracle' ", databaseId = "oracle")
@Select("SELECT '其他'")
String getType();
可以直接寫多個Select標簽
七、 Results Result
像xml一樣指定sql欄位與物體類欄位的對應關系和型別
@Results(id="personResult", value = {
@Result(property = "name",column = "name" ,
javaType = String.class ,jdbcType = JdbcType.VARBINARY),
@Result(property = "jobName",column = "job_name" ,
javaType = String.class ,jdbcType = JdbcType.VARBINARY),
@Result(property = "age",column = "age" ,
javaType = Integer.class ,jdbcType = JdbcType.INTEGER),
@Result(property = "salary",column = "salary" ,
javaType = BigDecimal.class ,jdbcType = JdbcType.DECIMAL)
})
@Select("select * from person")
List<Person> select();
其實還有很多包括**@ConstructorArgs** 、@ResultType、@ResultMap等一些注解
如果想了解更多可以看一下官方檔案,但是我個人覺得理解有這種實作方式即可,不用太深的了解這些東西,如果時間充足去了解了解Spring的一些原理比這個強
下集預告:
Mybatis快取了解
有事兒沒事兒關注公眾號:木子的晝夜編程

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/297819.html
標籤:java
