mybatis注释sql语句(CURD)

MyBatis是一个半自动的映射框架,之所以称为半自动,是因为它需要手工匹配提供的POJO、SQL、和映射关系。
下载地址:
http://www.mybatis.org/mybatis-3/zh/getting-started.html
创建项目,导入jar包(在pom.xml文件输入下例回车就可导入)
在这里插入图片描述

	<dependency>
		<groupId>mysql</groupId>
		<artifactId>mysql-connector-java</artifactId>
		<version>5.1.45</version>
	</dependency>
	<dependency>
		<groupId>org.slf4j</groupId>
		<artifactId>slf4j-log4j12</artifactId>
		<version>1.7.25</version>
		<scope>test</scope>
	</dependency>
	<dependency>
		<groupId>com.alibaba</groupId>
		<artifactId>fastjson</artifactId>
		<version>1.2.51</version>
	</dependency>
	<!-- 0.9.1.2版本会报错 :java.lang.AbstractMethodError: Method com/mchange/v2/c3p0/impl/NewProxyPreparedStatement.isClosed()-->
	<!-- <dependency>
		<groupId>c3p0</groupId>
		<artifactId>c3p0</artifactId>
		<version>0.9.1.2</version>
	</dependency> -->
	<dependency>
		<groupId>com.mchange</groupId>
		<artifactId>c3p0</artifactId>
		<version>0.9.5.2</version>
	</dependency>
	<!-- http://mp.baomidou.com/ -->
	<dependency>
		<groupId>com.baomidou</groupId>
		<artifactId>mybatis-plus</artifactId>
		<version>3.0.5</version>
	</dependency>
</dependencies>

创建两个连接数据库的配置文件(C3p0和JDBC)
#jdbc基本信息
c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/stu?useUnicode=true&useSSL=true&characterEncoding=UTF-8
c3p0.user=root
c3p0.password=密码
#c3p0最基本配置参数为:acquireIncrement、initialPoolSize、maxPoolSize、maxIdleTime、minPoolSize
#配置参照文档:https://www.mchange.com/projects/c3p0/#basic_pool_configuration
#c3p0连接池信息
c3p0.minPoolSize=3
c3p0.maxPoolSize=25
#当连接池中的连接耗尽的时候c3p0一次同时获取的连接数
c3p0.acquireIncrement=3
c3p0.initialPoolSize=7
#定义在从数据库获取新连接失败后重复尝试的次数
c3p0.acquireRetryAttempts=60
#两次连接中间隔时间,单位毫秒
c3p0.acquireRetryDelay=1000
#连接关闭时默认将所有未提交的操作回滚
c3p0.autoCommitOnClose=false
#当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出SQLException,如设为0则无限期等待。单位毫秒
c3p0.checkoutTimeout=3000
#每120秒检查所有连接池中的空闲连接。Default: 0
c3p0.idleConnectionTestPeriod=120
#最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0
c3p0.maxIdleTime=60
#如果设为true那么在取得连接的同时将校验连接的有效性。Default: false
c3p0.testConnectionOnCheckin=true
#c3p0将建一张名为c3p0TestTable的空表,并使用其自带的查询语句进行测试。
jdbc.automaticTestTable =c3p0TestTable

lo4j的配置文件
#定义LOG输出级别

ALL输出所有日志,如果换成DEBUG表示输出DEBUG以上级别日志

#log4j.rootLogger的第一个参数DEBUG定义所有日志的级别,第二个以后是定义的引用变量
log4j.rootLogger=TRACE, stdout, logfile
#定义stdout引用的日志输出目的地为控制台
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
#指定控制台日志输出格式由PatternLayout类进行处理
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
#指定日志输出时的具体格式
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
#定义logfile引用的日志输出为每日滚动生成的文件,由DailyRollingFileAppender类进行处理,文件大小到达指定尺寸的时候产生一个新的文件
log4j.appender.logfile=org.apache.log4j.DailyRollingFileAppender
#指定日志文件的输出目录和文件名
log4j.appender.logfile.File=D://log/bookstore.log
#警告的意思是DailyRollingFileAppender这个类不带属性maxBackupIndex,maxFileSize的,它是按日期来保存日志的,所以不需要设置该2个属性,所以以下兩個屬性不需要設置
#定义日志文件的大小
#log4j.appender.logfile.MaxFileSize=512KB
#定义日志文件生成的数量
#log4j.appender.logfile.MaxBackupIndex=3
#定义日志文件的输出级别
log4j.appender.File.Threshold = DEBUG
#文件日志由PatternLayout进行管理
log4j.appender.File.layout = org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH:mm:ss}][%c]%m%n
log4j.appender.logfile.layout=org.apache.log4j.PatternLayout
log4j.appender.logfile.layout.ConversionPattern=%d %p [%c] - %m%n
log4j.logger.com.ss=DEBUG
log4j.logger.com.ibatis=DEBUG
log4j.logger.com.ibatis.common.jdbc.SimpleDataSource=DEBUG
log4j.logger.com.ibatis.common.jdbc.ScriptRunner=DEBUG
log4j.logger.com.ibatis.sqlmap.engine.impl.SqlMapClientDelegate=DEBUG
log4j.logger.Java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG
Mybatis的基本构成
1、SqlSessionFactoryBuilder(构造器),根据配置信息或代码来生成SqlSessionFactory(工厂接口)
2、SqlSessionFactory:来生成SqlSession
3、SqlSession:执行SQL并返回结果
4、SQLMapper:由一个Java类和XML(或注解)构成
构建SqlSessionFactory
主映射文件:-mybatisConfig.xml

<?xml version="1.0" encoding="UTF-8"?>
<properties resource="jdbc.properties"></properties>
    <!--  元素允许在主配置文件之外提供一个properties格式对应文件,从而使得主配置文件更加通用。这样对部署非常有用  -->
<!-- 设置别名 -->
<!-- 设置别名,一定要放在properties下面  -->
<typeAliases>
   <!-- 方式一 -->
   <!-- <typeAlias type="com.my.entity.User" alias="user"/> -->
   <!-- 方式二,常用 可以在实体类上定义@Alias("user")指定是user别名-->
   <package name="com.my.entity"/>
</typeAliases>
<environments default="dev">
<environment id="dev">
	<transactionManager type="JDBC"/>
		<dataSource type="com.ss.datasource.C3P0Datasource"/>
	《com.ss.datasource.C3P0Datasource 连接池连接数据库》
</environment>
</environments>
 <mappers>
    <mapper resource="com/ss/mapper/BookMapper.xml"/><--注释的mapper-->
<!-- 告知映射文件方式2,自动扫描包内的Mapper接口与配置文件 -->
<mapper class="com.ss.mapper.BookMap"/>
</mappers>

package com.ss.datasource;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.ibatis.datasource.DataSourceFactory;
import com.mchange.v2.c3p0.ComboPooledDataSource;
//通过ComboPooledDataSource获取dateSource即数据源,可从中获取数据库的链接。
//c3p0被称为数据库链接池,用来管理数据库链接的获取和存储。
public class C3P0Datasource implements DataSourceFactory{

@Override
public DataSource getDataSource() {
	// TODO Auto-generated method stub
	return new ComboPooledDataSource();
}

@Override
public void setProperties(Properties arg0) {
	// TODO Auto-generated method stub
	
}

代码:(创建工厂(单例模式))

package com.ss.util;
import java.io.IOException;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class SqlSessionFactorySington {

private final static SqlSessionFactorySington sessionFactorySington=new SqlSessionFactorySington();
private SqlSessionFactory factory;
private SqlSessionFactorySington(){
	try {
		factory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybetisConfig.xml"));
	} catch (IOException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
}
public static SqlSessionFactorySington getinstance(){
	return sessionFactorySington;
}

public SqlSession getSqlSession(boolean flag){
	return factory.openSession(flag);
}

}
SqlSession两个作用
1、获取映射器,让映射器通过命名空间和方法名称找到对应的SQL,执行SQL并返回结果
2、直接通过命名信息去执行SQL返回结果
映射器
映射器是由Java接口和XML文件(或注解)共同组成的。
作用如下:

  1.     定义参数类型
    
  2.     描述SQL语句
    
  3.     定义查询结果和POJO的映射关系
    
  4.     描述缓存
    

定义一个接口

public interface BookMap {

查询(可以查询数据的条数)
@SelectProvider(method=“search”,type=BookSqlProvider.class)
public List search(@Param(“book”)Book book);
修改
@UpdateProvider(method=“updateDao”,type=BookSqlProvider.class)
public Integer updateDao(@Param(“book”)Book book);
查询(查询出结果,单只能查询出一条)
//@Select(“select primary_id id,book_id bookId,book_name bookName,book_author bookAuthor,book_price bookPrice,publish_date publishDate,book_kind bookKind,total_store totalStore,total_sold totalSold,book_pic bookPic,book_profile bookProfile,book_status bookStatus from t_book where book_id=#{bookId}”)
@Results(value={
@Result(column=“primary_id”,property=“id”),
@Result(column=“book_id”,property=“bookId”),
@Result(column=“book_name”,property=“bookName”),
@Result(column=“book_price”,property=“bookPrice”),
@Result(column=“book_kind”,property=“bookKind”),
@Result(column=“total_store”,property=“totalStore”),
@Result(column=“total_sold”,property=“totalSold”),
@Result(column=“book_pic”,property=“bookPic”),
@Result(column=“book_profile”,property=“bookProfile”),
@Result(column=“book_status”,property=“bookStatus”),
@Result(column=“book_author”,property=“bookAuthor”),
@Result(column=“publish_date”,property=“publishDate”),
})
@Select(“select * from t_book where book_id=#{bookId}”)
public Book selectBookByBook(Long bookId);

}
定义对应的UserMapper映射文件(bookMapper.xml)
增删改查

<?xml version="1.0" encoding="UTF-8" ?>
<insert id="createBook" useGeneratedKeys="true" keyProperty="id">
	insert into t_book(<include refid="bookProperty"></include>) value(<include refid="bookValues"></include>)
</insert>

<delete id="deleteBook">
	delete from t_book where primary_id=#{bookId};
</delete>

<update id="updateBook" parameterType="book">
	update t_book
	<!-- <set>
		<if test="bookName">
			book_Name=#{bookName}
		</if>
		<if test="bookPrice">
			,book_price=#{bookPrice}
		</if>
	</set> -->
	<trim prefix="set" suffixOverrides=",">
	<if test="bookName">
			book_Name=#{bookName},
		</if>
		<if test="bookPrice">
			book_price=#{bookPrice},
		</if>
		<if test="bookPic">
			book_pic=#{bookPic}
		</if>
	</trim>
	where primary_id=#{id}
</update>

<insert id="batchBook" parameterType="book">
	insert into t_book(<include refid="bookProperty"/>) values
		<foreach collection="list" item="book" separator=",">
	(<include refid="batchBookValues"/>)
		</foreach>
</insert>

<select id="selectBookByBookIds" resultMap="bookResultMap">
	select primary_id,<include refid="bookProperty"/>
	from t_book
	where book_id=#{bookId};
</select>

<resultMap type="book" id="bookResultMap">
<result property="id" column="primary_id"/>
<result property="bookId" column="book_id"/>
<result property="bookName" column="book_name"/>
<result property="bookAuthor" column="book_author"/>
<result property="bookPrice" column="book_price"/>
<result property="publishDate" column="publish_date"/>
<result property="bookKind" column="book_kind"/>
<result property="totalStore" column="total_store"/>
<result property="totalSold" column="total_sold"/>
<result property="bookPic" column="book_pic"/>
<result property="bookProfile" column="book_profile"/>
<result property="bookStatus" column="book_status"/>

</resultMap>
<sql id="bookProperty">
	book_id,book_name,book_author,book_price,publish_date,book_kind,total_store,total_sold,book_pic,book_profile,book_status
</sql>
<sql id="bookValues">
	#{bookId},#{bookName},#{bookAuthor},#{bookPrice},#{publishDate},#{bookKind},#{totalStore},#{totalSold},#{bookPic},#{bookProfile},#{bookStatus}
</sql>
<sql id="batchBookValues">
	#{book.bookId},#{book.bookName},#{book.bookAuthor},#{book.bookPrice},#{book.publishDate},#{book.bookKind},#{book.totalStore},#{book.totalSold},#{book.bookPic},#{book.bookProfile},#{book.bookStatus}
</sql>

运行的类(@Test注解是通过对测试类和测试方法的命名来确定是否是测试,且所有的测试类必须继承junit的测试基类)

package com.ss.dao;
import java.util.ArrayList;
import java.util.List;
import org.apache.ibatis.session.SqlSession;
import org.junit.After;
import org.junit.Test;
import com.ss.mapper.BookMap;
import com.ss.pojo.Book;
import com.ss.util.SqlSessionFactorySington;
public class CRUDBook {

SqlSession session=SqlSessionFactorySington.getinstance().getSqlSession(true);
@Test《增加》
public void createBooks(){
	Book book=new Book(10028L, "完美世界", "辰东", 128, "2016-10-10", "玄幻",8658, 5868, "8888", "简介1314", true);
	int rows = session.insert("com.ss.mapper.BookMapper.createBook", book);
	System.out.println("受影响的行数:"+rows);
	System.out.println("id:"+book.getId());
}

@Test(删除)
public void deleteBooks(){
	session.delete("com.ss.mapper.BookMapper.deleteBook", 10024);
}

@Test(修改)
public void updateBooks(){
	Book book=new Book();
	book.setId(10017L);
	book.setBookName("完美世界");
	book.setBookPrice(888888);
	session.update("com.ss.mapper.BookMapper.updateBook", book);
}


@Test (批量增加)
public void batchBooks(){
	List<Book> book = new ArrayList<>();
	book.add(new Book(10088L, "斗破苍穹", "我是西红柿", 288, "2018-02-16", "玄幻", 8658, 5868, "11111", "简介:5688", true));
	book.add(new Book(10086L, "我是大明星", "辰东", 266, "2018-05-14", "都市", 8658, 5868, "888888", "简介:8688", true));
	book.add(new Book(5868L, "斗罗大陆", "天蚕土豆", 268, "2018-10-21", "玄幻", 8658, 5868, "8888888", "简介:8888", true));
	int rows = session.insert("com.ss.mapper.BookMapper.batchBook", book);
	System.out.println("rows :" +rows);
}


/*@Test
public void batchInsert(){
	List<Book> book = new ArrayList<>();
	book.add(new Book(10088L, "斗破苍穹", "我是西红柿", 288, "2018-02-16", "玄幻", 8658, 5868, "11111", "简介:5688", true));
	book.add(new Book(10086L, "我是大明星", "辰东", 266, "2018-05-14", "都市", 8658, 5868, "888888", "简介:8688", true));
	book.add(new Book(5868L, "斗罗大陆", "天蚕土豆", 268, "2018-10-21", "玄幻", 8658, 5868, "8888888", "简介:8888", true));
	BookMapper mapper = session.getMapper(BookMapper.class);
	Integer rows = mapper.batchInsert(book);
	System.out.println("affected:"+rows);
}*/

@Test(查询)
public void search(){
	Book book=new Book();
	book.setBookId(12567L);
	book.setBookKind("玄幻魔法修真");
	List<Book> lists = session.getMapper(BookMap.class).search(book);
	System.out.println(lists.size());
}


@Test(注释修改)
public void updateDao(){
	Book book=new Book();
	book.setBookName("神的女儿");
	book.setId(10023L);
	session.getMapper(BookMap.class).updateDao(book);
}


@Test(注释查询)
public void selectBookByBook(){
	Book book = session.getMapper(BookMap.class).selectBookByBook(58688L);
	System.out.println("book:"+book);
}



@Test(查询)
public void selectBookByBookIds(){
	Book book = session.selectOne("com.ss.mapper.BookMapper.selectBookByBookIds", 35465L);
	System.out.println("book:"+book);
	
}
@After(关闭 回话)
public void after(){
	session.close();
}

}

动态SQL
解决大量拼装SQL的工作
if
需求:我们现在做用户查询,有可能带用户名,有可能不带

where

trim :替换的作用

choose、when、otherwise
多个查询条件同时出现的时候,排优先级

Set
假如一个表有多个字段,但我只需要更新需要更新的字段,减少网络带宽

foreach
案例,我们做批量的删除或更新
方式一,以整型数组的方式

Int[] id = new int[]{1,2,3,4,5}
Delete from user where id in(s)
方式二:以集合的方式

方式三:以map的方式

mybatis的创建总结:
首先注意我们mybatis的搭建环境;配置他的主配置文件;
创建工厂获取sqlsessionFacctory,
SqlSession两个作用
1、获取映射器,让映射器通过命名空间和方法名称找到对应的SQL,执行SQL并返回结果
2、直接通过命名信息去执行SQL返回结果
映射器定义接口:实现CRUD的方法:
xml的方式:在接口下创建一个和接口名一样的UserMapper.xml文件,映射空间为接口类,里面写我们接口的CRUD的方法操作sql语句,写好了映射之后要记得在我们的主配置文件里面配置我们

他们的id都是我们接口里对应的方法名,resultType=“user” 是我们的返回的类型,parameterType=“int” 是方法参数的类型,条件的值注意是用#{id} 来获取,比如:delete from user where id=#{id}
其中模糊查询的语句为:
select id,username,password,role_name as roleName from user
where username like concat(’%’,#{username},’%’)
注解的方式:定义一个接口。
public interface UserMapper2 { //注解的形式
@Select(“select * from user where id=#{id}”)
public User getById(int id);
}
修改主配置文件的mappers,改为类名

设置别名:如下,设置好别名之后,我们接口的映射文件返回类型就可以改为user
resultType=“user”






抽取创建工厂的工具类,避免写重复的代码:
1.自身私有化
2.得到一个工厂对象,单例
3.提供一个得到sqlSession对象的方法
传递多个参数的方式:
1、采用map的方式传递
2、采用注解的方式

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值