您好,登錄后才能下訂單哦!
1、 mybatis配置文件,包括Mybatis全局配置文件和Mybatis映射文件,其中全局配置文件配置了數(shù)據(jù)源、事務(wù)等信息;映射文件配置了SQL執(zhí)行相關(guān)的 信息。
2、 mybatis通過讀取配置文件信息(全局配置文件和映射文件),構(gòu)造出SqlSessionFactory,即會話工廠。
3、 通過SqlSessionFactory,可以創(chuàng)建SqlSession即會話。Mybatis是通過SqlSession來操作數(shù)據(jù)庫的。
4、 SqlSession本身不能直接操作數(shù)據(jù)庫,它是通過底層的Executor執(zhí)行器接口來操作數(shù)據(jù)庫的。Executor接口有兩個實現(xiàn)類,一個是普通執(zhí)行器,一個是緩存執(zhí)行器(默認)。
5、 Executor執(zhí)行器要處理的SQL信息是封裝到一個底層對象MappedStatement中。該對象包括:SQL語句、輸入?yún)?shù)映射信息、輸出結(jié)果集映射信息。其中輸入?yún)?shù)和輸出結(jié)果的映射類型包括HashMap集合對象、POJO對象類型。
引入 jar
mybatis-3.2.7.jar
mysql-connector-java-5.1.7-bin.jar
創(chuàng)建實體
public class User {
private int id;
private String name;
private String dept;
private String phone;
private String website;
// 省略 get set 方法
}
創(chuàng)建配置
<?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>
<typeAlias alias="User" type="com.kernel.bean.User" />
</typeAliases>
<!-- 配置環(huán)境 -->
<environments default="development">
<environment id="development">
<!-- 事務(wù)管理類型 -->
<transactionManager type="JDBC" />
<!--
數(shù)據(jù)源類型:
UNPOOLED:為每個數(shù)據(jù)操作創(chuàng)建一個連接
POOLED:創(chuàng)建一個數(shù)據(jù)庫連接池,連接池中的每個連接將被用于數(shù)據(jù)庫操作,一旦數(shù)據(jù)操作完成,MyBatis將連接返回給連接池
JNDI:向配置好的JNDI數(shù)據(jù)源獲取數(shù)據(jù)庫連接,生產(chǎn)環(huán)境有限考慮此方式
-->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://127.0.0.1:3306/mybatis" />
<property name="username" value="root" />
<property name="password" value="123456" />
</dataSource>
</environment>
</environments>
<!-- 配置映射文件 -->
<mappers>
<mapper resource="com/kernel/bean/User.xml" />
</mappers>
</configuration>
創(chuàng)建映射
<?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="com.kernel.bean">
<select id="getUserById" parameterType="int" resultType="User">
select * from user where id = #{id}
</select>
</mapper>
測試
public class Main {
private static SqlSessionFactory sqlSessionFactory;
private static SqlSession sqlSession;
private static Reader reader;
static {
try {
reader = Resources.getResourceAsReader("config/mybatis-config.xml");
} catch (IOException e) {
e.printStackTrace();
}
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
sqlSession = sqlSessionFactory.openSession();
}
@Test
public void test {
User user = sqlSession.selectOne("getUserById", 1);
System.out.println(user);
}
}
創(chuàng)建實體(同上)
創(chuàng)建 IUser
public interface IUser {
public List<User> getUserList();
public void insertUser(User user);
public void updateUser(User user);
public void deleteUser(int userId);
public User getUser(int id);
}
創(chuàng)建配置(同上)
創(chuàng)建映射
<?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="com.kernel.dao.IUser">
<select id="insertUser" parameterType="User">
insert into user (name, dept, website, phone)values (#{name}, #{dept}, #{website}, #{phone})
</select>
<select id="deleteUser" parameterType="int">
delete from user where id = #{id}
</select>
<select id="updateUser" parameterType="User">
update user set name = #{name}, dept = #{dept}, website = #{website}, phone = #{phone} where id = #{id}
</select>
<select id="getUser" parameterType="int" resultType="User">
select * from user where id = #{id}
</select>
<select id="getUserList" resultType="User">
select * from user
</select>
</mapper>
創(chuàng)建實體
User
public class User implements Serializable {
private int id;
private String username;
private String mobile;
private List<Post> posts;
// 省略 get 和 set
// 重寫 toString
}
Post
public class Post implements Serializable {
private int id;
private User user;
private String title;
private String content;
// 省略 get 和 set
// 重寫 toString
}
創(chuàng)建配置(同上)
創(chuàng)建映射
<?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="com.kernel.dao.IUser">
<resultMap id="resultUserMap" type="User">
<result property="id" column="user_id"/>
<result property="username" column="username"/>
<result property="mobile" column="mobile"/>
<collection property="posts" ofType="Post" column="userid">
<id property="id" column="post_id" javaType="int" jdbcType="INTEGER"/>
<result property="title" column="title" javaType="string" jdbcType="VARCHAR"/>
<result property="content" column="content" javaType="string" jdbcType="VARCHAR"/>
</collection>
</resultMap>
<select id="getUser" parameterType="int" resultMap="resultUserMap">
select u.*,p.* from user u, post p where u.id = p.userid and u.id = #{id}
</select>
</mapper>
創(chuàng)建實體(同上)
創(chuàng)建配置(同上)
創(chuàng)建映射
<?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="com.kernel.dao">
<resultMap id="resultPostsMap" type="Post">
<result property="id" column="post_id"/>
<result property="title" column="title"/>
<result property="content" column="content"/>
<association property="user" javaType="User">
<id property="id" column="userid"/>
<result property="username" column="username"/>
<result property="mobile" column="mobile"/>
</association>
</resultMap>
<select id="getPosts" parameterType="int" resultMap="resultPostsMap">
select u.*,p.* from user u, post p where u.id = p.userid and p.post_id = #{id}
</select>
</mapper>
創(chuàng)建實體
OrderItem
public class OrderItem {
private int id;
private int number;
private Order order;
private Product product;
// 省略 get 和 set
}
Order
public class Order {
private int id;
private String code;
List<OrderItem> orderItems;
// 省略 get 和 set
}
創(chuàng)建映射
OrderItem.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="com.kernel.pojo">
<insert id="addOrderItem" parameterType="OrderItem">
insert into order_item_
values(null,#{order.id},#{product.id},#{number})
</insert>
<insert id="deleteOrderItem" parameterType="OrderItem">
delete from order_item_
where oid = #{order.id} and pid = #{product.id}
</insert>
</mapper>
Order.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="com.kernel.pojo">
<resultMap type="Order" id="orderBean">
<id column="oid" property="id" />
<result column="code" property="code" />
<collection property="orderItems" ofType="OrderItem">
<id column="oiid" property="id" />
<result column="number" property="number" />
<association property="product" javaType="Product">
<id column="pid" property="id"/>
<result column="pname" property="name"/>
<result column="price" property="price"/>
</association>
</collection>
</resultMap>
<select id="listOrder" resultMap="orderBean">
select o.*,p.*,oi.*, o.id 'oid', p.id 'pid', oi.id 'oiid', p.name 'pname'
from order_ o
left join order_item_ oi on o.id =oi.oid
left join product_ p on p.id = oi.pid
</select>
<select id="getOrder" resultMap="orderBean">
select o.*,p.*,oi.*, o.id 'oid', p.id 'pid', oi.id 'oiid', p.name 'pname'
from order_ o
left join order_item_ oi on o.id =oi.oid
left join product_ p on p.id = oi.pid
where o.id = #{id}
</select>
</mapper>
Product.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="com.kernel.pojo">
<resultMap type="Product" id="productBean">
<id column="pid" property="id" />
<result column="pname" property="name" />
<result column="price" property="price" />
<!-- 多對一的關(guān)系 -->
<!-- property: 指的是屬性名稱, javaType:指的是屬性的類型 -->
<association property="category" javaType="Category">
<id column="cid" property="id"/>
<result column="cname" property="name"/>
</association>
</resultMap>
<select id="listProduct" resultMap="productBean">
select c.*, p.*, c.id 'cid', p.id 'pid', c.name 'cname', p.name 'pname'
from category_ c
left join product_ p on c.id = p.cid
</select>
<select id="getProduct" resultMap="productBean">
select c.*, p.*, c.id 'cid', p.id 'pid', c.name 'cname', p.name 'pname'
from category_ c
left join product_ p on c.id = p.cid
where p.id = #{id}
</select>
</mapper>
如果沒有傳參數(shù) name,那么就查詢所有,如果有 name 參數(shù),那么就進行模糊查詢。
<select id="listProduct" resultType="Product">
select * from product_
<if test="name!=null">
where name like concat('%',#{name},'%')
</if>
</select>
如果任何條件都不成立,那么在 sql 中不會出現(xiàn) where,如果有一個條件成立,則 sql 中會去掉 and、or。
<select id="listProduct" resultType="Product">
select * from product
<where>
<if test="name!=null">
and name like concat('%',#{name},'%')
</if>
<if test="price!=null and price!=0">
and price > #{price}
</if>
</where>
</select>
效果與 where 類似,用于 update
<update id="updateProduct" parameterType="Product" >
update product_
<set>
<if test="name != null">name=#{name},</if>
<if test="price != null">price=#{price}</if>
</set>
where id=#{id}
</update>
自定義標簽
<select id="listProduct" resultType="Product">
select * from product_
<trim prefix="where" prefixOverrides="and">
<if test="name!=null">
and name like concat('%', #{name}, '%')
</if>
<if test="price != null and price !=0">
and price > #{price}
</if>
</trim>
</select>
實現(xiàn) if/else 的效果
<select id="listProduct" resultType="Product">
select * from product_
<where>
<choose>
<when test="name != null">
and name like concat('%', #{name}, '%')
</when>
<when test="price != null and price >0">
and price > #{price}
</when>
<otherwise>
and id = 1
</otherwise>
</choose>
</where>
</select>
<select id="listProduct" resultType="Product">
select * from product_ where id in
<foreach item="item" index="index" collection="list"
open="(" separator="," close=")">
#{item}
</foreach>
</select>
<select id="listProduct" resultType="Product">
<bind name="likeName" value="'%' + name + '%'" />
select * from product_ where name like #{likeName}
</select>
設(shè)置參數(shù) | 描述 | 有效值 | 默認值 |
---|---|---|---|
cacheEnabled | 全局地開啟或關(guān)閉配置文件中的所有映射器已經(jīng)配置的任何緩存。 | true | false | true |
lazyLoadingEnabled | 延遲加載的全局開關(guān)。當開啟時,所有關(guān)聯(lián)對象都會延遲加載。 特定關(guān)聯(lián)關(guān)系中可通過設(shè)置fetchType 屬性來覆蓋該項的開關(guān)狀態(tài)。 |
true | false | false |
aggressiveLazyLoading | 當開啟時,任何方法的調(diào)用都會加載該對象的所有屬性。否則,每個屬性會按需加載(參考lazyLoadTriggerMethods ). |
true | false | false (true in ≤3.4.1) |
multipleResultSetsEnabled | 是否允許單一語句返回多結(jié)果集(需要兼容驅(qū)動)。 | true | false | true |
useColumnLabel | 使用列標簽代替列名。不同的驅(qū)動在這方面會有不同的表現(xiàn), 具體可參考相關(guān)驅(qū)動文檔或通過測試這兩種不同的模式來觀察所用驅(qū)動的結(jié)果。 | true | false | true |
useGeneratedKeys | 允許 JDBC 支持自動生成主鍵,需要驅(qū)動兼容。 如果設(shè)置為 true 則這個設(shè)置強制使用自動生成主鍵,盡管一些驅(qū)動不能兼容但仍可正常工作(比如 Derby)。 | true | false | False |
autoMappingBehavior | 指定 MyBatis 應(yīng)如何自動映射列到字段或?qū)傩浴?NONE 表示取消自動映射;PARTIAL 只會自動映射沒有定義嵌套結(jié)果集映射的結(jié)果集。 FULL 會自動映射任意復(fù)雜的結(jié)果集(無論是否嵌套)。 | NONE, PARTIAL, FULL | PARTIAL |
autoMappingUnknownColumnBehavior | 指定發(fā)現(xiàn)自動映射目標未知列(或者未知屬性類型)的行為。NONE : 不做任何反應(yīng)WARNING : 輸出提醒日志 ('org.apache.ibatis.session.AutoMappingUnknownColumnBehavior' 的日志等級必須設(shè)置為 WARN )FAILING : 映射失敗 (拋出 SqlSessionException ) |
NONE, WARNING, FAILING | NONE |
defaultExecutorType | 配置默認的執(zhí)行器。SIMPLE 就是普通的執(zhí)行器;REUSE 執(zhí)行器會重用預(yù)處理語句(prepared statements); BATCH 執(zhí)行器將重用語句并執(zhí)行批量更新。 | SIMPLE REUSE BATCH | SIMPLE |
defaultStatementTimeout | 設(shè)置超時時間,它決定驅(qū)動等待數(shù)據(jù)庫響應(yīng)的秒數(shù)。 | 任意正整數(shù) | Not Set (null) |
defaultFetchSize | 為驅(qū)動的結(jié)果集獲取數(shù)量(fetchSize)設(shè)置一個提示值。此參數(shù)只可以在查詢設(shè)置中被覆蓋。 | 任意正整數(shù) | Not Set (null) |
safeRowBoundsEnabled | 允許在嵌套語句中使用分頁(RowBounds)。如果允許使用則設(shè)置為false。 | true | false | False |
safeResultHandlerEnabled | 允許在嵌套語句中使用分頁(ResultHandler)。如果允許使用則設(shè)置為false。 | true | false | True |
mapUnderscoreToCamelCase | 是否開啟自動駝峰命名規(guī)則(camel case)映射,即從經(jīng)典數(shù)據(jù)庫列名 A_COLUMN 到經(jīng)典 Java 屬性名 aColumn 的類似映射。 | true | false | False |
localCacheScope | MyBatis 利用本地緩存機制(Local Cache)防止循環(huán)引用(circular references)和加速重復(fù)嵌套查詢。 默認值為 SESSION,這種情況下會緩存一個會話中執(zhí)行的所有查詢。 若設(shè)置值為 STATEMENT,本地會話僅用在語句執(zhí)行上,對相同 SqlSession 的不同調(diào)用將不會共享數(shù)據(jù)。 | SESSION | STATEMENT | SESSION |
jdbcTypeForNull | 當沒有為參數(shù)提供特定的 JDBC 類型時,為空值指定 JDBC 類型。 某些驅(qū)動需要指定列的 JDBC 類型,多數(shù)情況直接用一般類型即可,比如 NULL、VARCHAR 或 OTHER。 | JdbcType 常量. 大多都為: NULL, VARCHAR and OTHER | OTHER |
lazyLoadTriggerMethods | 指定哪個對象的方法觸發(fā)一次延遲加載。 | 用逗號分隔的方法列表。 | equals,clone,hashCode,toString |
defaultScriptingLanguage | 指定動態(tài) SQL 生成的默認語言。 | 一個類型別名或完全限定類名。 | org.apache.ibatis.scripting.xmltags.XMLLanguageDriver |
defaultEnumTypeHandler | 指定 Enum 使用的默認 TypeHandler 。 (從3.4.5開始) |
一個類型別名或完全限定類名。 | org.apache.ibatis.type.EnumTypeHandler |
callSettersOnNulls | 指定當結(jié)果集中值為 null 的時候是否調(diào)用映射對象的 setter(map 對象時為 put)方法,這對于有 Map.keySet() 依賴或 null 值初始化的時候是有用的。注意基本類型(int、boolean等)是不能設(shè)置成 null 的。 | true | false | false |
returnInstanceForEmptyRow | 當返回行的所有列都是空時,MyBatis默認返回null 。 當開啟這個設(shè)置時,MyBatis會返回一個空實例。 請注意,它也適用于嵌套的結(jié)果集 (i.e. collectioin and association)。(從3.4.2開始) |
true | false | false |
logPrefix | 指定 MyBatis 增加到日志名稱的前綴。 | 任何字符串 | Not set |
logImpl | 指定 MyBatis 所用日志的具體實現(xiàn),未指定時將自動查找。 | SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING | Not set |
proxyFactory | 指定 Mybatis 創(chuàng)建具有延遲加載能力的對象所用到的代理工具。 | CGLIB | JAVASSIST | JAVASSIST (MyBatis 3.3 or above) |
vfsImpl | 指定VFS的實現(xiàn) | 自定義VFS的實現(xiàn)的類全限定名,以逗號分隔。 | Not set |
useActualParamName | 允許使用方法簽名中的名稱作為語句參數(shù)名稱。 為了使用該特性,你的工程必須采用Java 8編譯,并且加上-parameters 選項。(從3.4.1開始) |
true | false | true |
configurationFactory | 指定一個提供Configuration 實例的類。 這個被返回的Configuration實例用來加載被反序列化對象的懶加載屬性值。 這個類必須包含一個簽名方法static Configuration getConfiguration() . (從 3.2.3 版本開始) |
創(chuàng)建接口,使用 @Insert()、@Update()、@Select()、@Delete() 替代 xml 的語句
在配置文件中增加 <mapper class=“com.kernel.mapper.CategoryMapper"/>
@Results 通過 @Result 和 @Many 中調(diào)用多端方法相結(jié)合,來獲取一對多關(guān)系
CategoryMapper
public interface CategoryMapper {
@Select("select * from category_")
@Results({
@Result(property = "id", column = "id"),
@Result(property = "products",
javaType = List.class,
column = "id",
many = @Many(select = "com.kernel.pojo.ProductMapper.listByCategory"))
})
public List<Category> list();
}
ProductMapper
public interface ProductMapper {
@Select(" select * from product_ where cid = #{cid}")
public List<Product> listByCategory(int cid);
}
ProductMapper
@Select("select * from product_")
@Results(
@Result(property = "category", column = "id", one = @One(select = "com.kernel.pojo.CategoryMapper.get"))
)
public List<Product> list();
CategoryMapper
@Select("select * from category_ where id = #{id}")
public Category get(int id);
ProductMapper
public interface ProductMapper {
@Select("select * from product_ where id = #{id}")
public Product get(int id);
}
OrderItemMapper
public interface OrderItemMapper {
@Select("select * from order_item_ where oid = #{oid}")
@Results({
@Result(property = "product", column = "pid", one = @One(select = "com.kernel.pojo.ProductMapper.get"))
})
public List<OrderItem> listByOrder(int oid);
}
OrderMapper
public interface OrderMapper {
@Select("select * from order_")
@Results({
@Result(property = "id", column = "id"),
@Result(property = "orderItems", javaType = List.class, column = "id",
many = @Many(select = "com.kernel.pojo.OrderItemMapper.listByOrder"))
})
public List<Order> list();
}
關(guān)于 sql 類
private String selectPersonSql() {
return new SQL() {{
SELECT("P.ID, P.USERNAME, P.PASSWORD, P.FULL_NAME");
SELECT("P.LAST_NAME, P.CREATED_ON, P.UPDATED_ON");
FROM("PERSON P");
FROM("ACCOUNT A");
INNER_JOIN("DEPARTMENT D on D.ID = P.DEPARTMENT_ID");
INNER_JOIN("COMPANY C on D.COMPANY_ID = C.ID");
WHERE("P.ID = A.ID");
WHERE("P.FIRST_NAME like ?");
OR();
WHERE("P.LAST_NAME like ?");
GROUP_BY("P.ID");
HAVING("P.LAST_NAME like ?");
OR();
HAVING("P.FIRST_NAME like ?");
ORDER_BY("P.ID");
ORDER_BY("P.FULL_NAME");
}}.toString();
}
使用 SQL 類的方式構(gòu)建
public class CategsoryDynaSqlProvider {
public String list() {
return new SQL()
.SELECT("*")
.FROM("category_")
.toString();
}
public String get() {
return new SQL()
.SELECT("*")
.FROM("category_")
.WHERE("id=#{id}")
.toString();
}
public String add(){
return new SQL()
.INSERT_INTO("category_")
.VALUES("name", "#{name}")
.toString();
}
public String update(){
return new SQL()
.UPDATE("category_")
.SET("name=#{name}")
.WHERE("id=#{id}")
.toString();
}
public String delete(){
return new SQL()
.DELETE_FROM("category_")
.WHERE("id=#{id}")
.toString();
}
}
注解
手寫sql語句
@Insert(" insert into category_ ( name ) values (#{name}) ")
public int add(Category category);
使用sql類
@InsertProvider(type=CategoryDynaSqlProvider.class,method="add")
public int add(Category category);
MyBatis 默認是積極加載的,開啟日志,一對多查詢,走起
當我查詢商品分類和商品時,控制臺發(fā)送的sql如下:
DEBUG [main] - ==> Preparing: select * from category_
DEBUG [main] - ==> Parameters:
TRACE [main] - <== Columns: id, name
TRACE [main] - <== Row: 1, category1
TRACE [main] - <== Row: 2, category2
DEBUG [main] - <== Total: 2
category1
DEBUG [main] - ==> Preparing: select * from product_ where cid = ?
DEBUG [main] - ==> Parameters: 1(Integer)
TRACE [main] - <== Columns: id, name, price, cid
TRACE [main] - <== Row: 1, product a, 88.88, 1
TRACE [main] - <== Row: 2, product b, 88.88, 1
TRACE [main] - <== Row: 3, product c, 88.88, 1
DEBUG [main] - <== Total: 3
product a
product b
product c
category2
DEBUG [main] - ==> Preparing: select * from product_ where cid = ?
DEBUG [main] - ==> Parameters: 2(Integer)
TRACE [main] - <== Columns: id, name, price, cid
TRACE [main] - <== Row: 4, product x, 88.88, 2
TRACE [main] - <== Row: 5, product y, 88.88, 2
TRACE [main] - <== Row: 6, product z, 88.88, 2
DEBUG [main] - <== Total: 3
當我只查詢商品分類時,發(fā)送的 sql 還是三條,所以 MyBatis 是默認開啟積極加載的
開啟延遲加載
<settings>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="false"/>
</settings>
再次查詢,當我需要使用商品時,才發(fā)送對應(yīng)的 sql
同一個 session 中查詢相同的記錄,只查詢一次,不同 session,發(fā)送多次,所以一級緩存是 session 級別的。
二級緩存是 sessionFactory 的緩存
<settings>
<!-- 打開延遲加載的開關(guān) -->
<setting name="lazyLoadingEnabled" value="true" />
<!-- 將積極加載改為消息加載即按需加載 -->
<setting name="aggressiveLazyLoading" value="false"/>
<setting name="cacheEnabled" value="true"/>
</settings>
將映射文件中 sql 包含在 cache 標簽中
<mapper namespace="com.how2java.pojo">
<cache/>
<insert id="addCategory" parameterType="Category" >
insert into category_ ( name ) values (#{name})
</insert>
<delete id="deleteCategory" parameterType="Category" >
delete from category_ where id= #{id}
</delete>
<select id="getCategory" parameterType="_int" resultType="Category">
select * from category_ where id= #{id}
</select>
<update id="updateCategory" parameterType="Category" >
update category_ set name=#{name} where id=#{id}
</update>
<select id="listCategory" resultType="Category">
select * from category_
<if test="start!=null and count!=null">
limit #{start},#{count}
</if>
</select>
</mapper>
Mybatis Generator是一個用于Mybatis逆向工程的工具,通過表創(chuàng)建 pojo、mapper
導(dǎo)包 mysql-connector-java-5.0.8-bin.jar
generatorConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE generatorConfiguration
PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
"http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
<generatorConfiguration>
<context id="testTables" targetRuntime="MyBatis3">
<commentGenerator>
<!--去掉生成日期那行注釋-->
<property name="suppressDate" value="true"/>
<!--是否去除自動生成的注釋-->
<property name="suppressAllComments" value="false"/>
</commentGenerator>
<!--數(shù)據(jù)庫連接信息-->
<jdbcConnection driverClass="com.mysql.jdbc.Driver" connectionURL="jdbc:mysql:///mybatis" userId="root" password="123456"/>
<javaTypeResolver>
<property name="forceBigDecimals" value="false"/>
</javaTypeResolver>
<!--生成pojo-->
<javaModelGenerator targetPackage="com.kernel.pojo" targetProject="src">
<!--是否讓schema作為包的后綴-->
<property name="enableSubPackages" value="true"/>
<!--從數(shù)據(jù)庫返回的值被清理前后的空格-->
<property name="trimStrings" value="true"/>
</javaModelGenerator>
<!--生成mapper-->
<sqlMapGenerator targetPackage="com.kernel.pojo" targetProject="src">
<property name="enableSubPackages" value="true"/>
</sqlMapGenerator>
<!--生成dao-->
<javaClientGenerator type="XMLMAPPER" targetPackage="com.kernel.mapper" targetProject="src">
<!--是否讓schema作為包的后綴-->
<property name="enableSubPackages" value="true"/>
</javaClientGenerator>
<!--
enableCountByExample(默認true):MyBatis3Simple為false,指定是否生成動態(tài)查詢總條數(shù)語句(用于分頁的總條數(shù)查詢)
enableUpdateByExample(默認true):MyBatis3Simple為false,指定是否生成動態(tài)修改語句(只修改對象中不為空的屬性)
enableDeleteByExample(默認true):MyBatis3Simple為false,指定是否生成動態(tài)刪除語句;
enableSelectByExample(默認true):MyBatis3Simple為false,指定是否生成動態(tài)查詢語句;
-->
<table tableName="category_" domainObjectName="Category" enableCountByExample="false" enableUpdateByExample="false" enableDeleteByExample="false" enableSelectByExample="true" selectByPrimaryKeyQueryId="false">
<!--忽略keyColumn、keyProperty和useGeneratedKeys三個屬性的生成-->
<property name="my.isgen.usekeys" value="true"/>
<!--使用自動增長主鍵-->
<generatedKey column="id" sqlStatement="JDBC"/>
</table>
</context>
</generatorConfiguration>
測試
public class Test {
public static void main(String[] args) throws IOException, XMLParserException, InvalidConfigurationException, SQLException, InterruptedException {
List<String> warnings = new ArrayList<String>();
boolean overwrite = true;
InputStream is= Test.class.getClassLoader().getResource("generatorConfig.xml").openStream();
ConfigurationParser cp = new ConfigurationParser(warnings);
Configuration config = cp.parseConfiguration(is);
is.close();
DefaultShellCallback callback = new DefaultShellCallback(overwrite);
MyBatisGenerator myBatisGenerator = new MyBatisGenerator(config, callback, warnings);
myBatisGenerator.generate(null);
System.out.println("生成成功");
}
}
在 src 下創(chuàng)建 log4j.properties
# Global logging configuration
log4j.rootLogger=ERROR, stdout
# MyBatis logging configuration...
log4j.logger.com.how2java=TRACE
# 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 會自動打印出sql語句
xml方式
<select id="listCategory" resultType="Category">
select * from category_
<if test="start!=null and count!=null">
limit #{start},#{count}
</if>
</select>
注解方式
@Select("select * from category_ limit #{start},#{count}")
public List<Category> listByPage(@Param("start") int start, @Param("count") int count);
將事務(wù)提交方式設(shè)置為 jdbc 后,將采用 jdbc 的方式提交事務(wù),加入有一條記錄失敗,自動回滾,注意,數(shù)據(jù)表的類型必須是 INNODB
PageHelper 是一款 Mybatis 分頁插件。
加入jar
pagehelper-5.1.0-beta2.jar、jsqlparser-1.0.jar
配置插件
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor"/>
</plugins>
分頁查詢只需要在執(zhí)行查詢之前,執(zhí)行
PageHelper.offsetPage(0, 5);
獲取總數(shù)
PageInfo page = new PageInfo<>(list);
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。