目录
Mybatis
mybatis接口代理的模式开发
1. 创建maven工程
<dependencies>
<!--mybatis的核心依赖-->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.6</version>
</dependency>
<!--mysql的驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.47</version>
</dependency>
<!--日志-->
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.12.1</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
2. 编写核心配置文件
<?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>
<!--mybatis环境 defult="" 模式 development,worker-->
<environments default="development">
<!--environment标签中的id属性的值必需和environments标签中的default属性的值一致-->
<environment id="development">
<transactionManager type="JDBC"></transactionManager>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///803mbatis01"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
</configuration>
3. 创建表
CREATE TABLE `person` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(30) COLLATE utf8_bin DEFAULT NULL,
`gender` varchar(6) COLLATE utf8_bin DEFAULT NULL,
`age` int(11) DEFAULT NULL,
`birthday` date DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 COLLATE=utf8_bin
4.创建实体类
5. 定义一个接口,在接口中声明对person对象的增、删、改、查的方法
public interface PersonDao {
/**
* 打/**+回车
* 对Person对象进行保存
* @param person 要保存的person对象
*/
public void savePerson(Person person);
}
6. 写接口的映射文件
Namespace的值为接口的完全限定名
Id 为接口中所声明的方法的名子,如果接口中的方法有输入参数,parameterType来描述接口中方法的类型
7. 接口的映射文件一定要在mybatis的核心配置文件中进行注册
<mappers>
<mapper resource="cn/offcn/dao/PersonDaoMapper.xml"></mapper>
</mappers>
8. 测试
public class PersonTest {
public static void addPerson()throws Exception{
//1.获取mybatis核心配置文件的输入流
InputStream inputStream=Resources.getResourceAsStream("SqlMapperConfig.xml");
//2. 创建一个SqlSessionFacgtory对象
SqlSessionFactory sqlSessionFactory= new SqlSessionFactoryBuilder().build(inputStream);
//3. 获取session
SqlSession session=sqlSessionFactory.openSession();
//4.获取PersonDao接口的代理对象
PersonDao personDao=session.getMapper(PersonDao.class);
Person person=new Person("崔逸阳","男",20,new Date());
personDao.savePerson(person);
//5. 提交事务
session.commit();
//6. 关闭session
session.close();
}
public static void main(String[] args)throws Exception {
addPerson();
}
}
基于接口实现CRUD
接口:
public interface PersonDao {
/**
* 打/**+回车
* 对Person对象进行保存
* @param person 要保存的person对象
*/
public void savePerson(Person person);
/**
* 根据id查询person对象
* @param id 查询的条件id为主键
* @return person对象
*/
public Person getPersonById(Integer id);
/**
* 根据id删除指定的person对象
* @param id 主键
*/
public void deletePersonById(Integer id);
/**
* 根据id来更新person对象
* @param person 要更新person对象
*/
public void updatePerson(Person person);
}
映射文件:
<mapper namespace="cn.offcn.dao.PersonDao">
<insert id="savePerson" parameterType="Person">
insert into person (name,gender,age,birthday) values(#{name},#{gender},#{age},#{birthday})
</insert>
<select id="getPersonById" parameterType="java.lang.Integer" resultType="Person">
select * from person where id=#{id}
</select>
<select id="getPersons" resultType="Person">
select * from person
</select>
<delete id="deletePersonById" parameterType="java.lang.Integer">
delete from person where id=#{id}
</delete>
<update id="updatePerson" parameterType="Person">
update person set name=#{name},gender=#{gender},age=#{age},birthday=#{birthday}
where id=#{id}
</update>
</mapper>
parameterType表示参数的类型,如果是基本数据类型,可以直接写,对于封装类对象类型还可以写成 java.lang.xxxx
resultType 表示该方法的返回类型。
测试:
@Test
public void testGetPersonById(){
SqlSession session= MyBatisUtils.getSession();
PersonDao personDao = session.getMapper(PersonDao.class);
Person person=personDao.getPersonById(4);
System.out.println(person);
session.commit();
MyBatisUtils.close(session);
}
@Test
public void testGetPersons(){
SqlSession session= MyBatisUtils.getSession();
PersonDao personDao = session.getMapper(PersonDao.class);
List<Person> personList=personDao.getPersons();
for (Person person : personList) {
System.out.println(person);
}
session.commit();
MyBatisUtils.close(session);
}
@Test
public void testDeletePersonById(){
SqlSession session= MyBatisUtils.getSession();
PersonDao personDao = session.getMapper(PersonDao.class);
personDao.deletePersonById(2);
session.commit();
MyBatisUtils.close(session);
}
@Test
public void testUpdatePerson() throws Exception{
SqlSession session= MyBatisUtils.getSession();
PersonDao personDao = session.getMapper(PersonDao.class);
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
Date birthday=sdf.parse("1991-10-10");
Person person=new Person("王小五","男",30,birthday);
person.setId(5);
personDao.updatePerson(person);
session.commit();
MyBatisUtils.close(session);
}
mybatis多个参数处理
1. 如果一个接口所定义的方法的参数有多个,此时在映射文件中不需要写parameterType属性,在对应的sql语句中,可以使用下标来取参的值。
Mybatis 3.40以上版本argXXX
Mybatis 3.40以下版本
2. 如果一个接口所定义的方法的参数有多个,此时在映射文件中不需要写parameterType属性,在对应的sql语句中,可以使用别名的方式进行参数引用。
多参数的简化:
- 可以参数封装到实体类中
public List<Person> getPersonByGenderAndAage(Person person); - 可以把多个数据封装到Map集合中
#{}和${} 区别
#{}是不能写到字符串中的,如果写到字符串表达字串内容一部分。Mybatis是无法给这个占位符赋值。
${}是可以写到字符串中的,表达取${}中表描述的字段的值。
#{} 占位符使用jdbc的预编译处理,可以有防止sql注入。
${}表示取字符的值,有sql注入的可能。
主键值的返回操作
获取自增主键的值的方式有两种
- 设置useGeneratedKeys="true" keyProperty="id"
useGeneratedKeys=”true”,表示当向表中记录一条记录时,会自动取出主键值。
keyProperty 表示取出的主键值,要赋给实体类的哪些属性
- 通过selectKey标签取自增主键值
Select last_insert_id() 使用mysql的内函数取最后生成主键的值。
keyColumn : 表过取哪一列的值。
KeyProperty:将取出的主键值赋给实体类哪个属性
resultType: 主键的类型
Order: 执行sql之前取值 before,还是执行sql之后取值 after。