1.Statement 和 PreparedStatement 的区别:
PreparedStatement 存在的优势:
- 更好的可读性,可维护性.
- 可以提供更好的性能(预编译). MySQL 不支持 PreparedStatement 性能优化.
- 更安全,可以防止 SQL 注入的问题
如果使用Statement语句对象,我们是把参数直接拼接到 SQL 中然后执行,此时,如果参数会改变SQL
的语法结构,执行的结果就会存在问题了,如,在登录查询的 SQL 中,如果用户名参数值为: ' or 1=1 or
', 此时,填写的密码无论是多少,登录都会成功, 这就是 SQL 注入的问题.
叩丁狼教育这个问题可以使用预编译语句对象完美解决 - 预先发送带有占位符的 SQL 到数据库中进行编译, 语句结构固定下来
- 设置参数给对应的占位符,然后再执行 SQL
这里无论是什么参数,都不会再改变 SQL 的语法结构,达到防止 SQL 注入问题的目的
2.javabean
无参构造器
提供一对getter和setter
私有化成员变量
类public修饰
3.注解
lombok插件安装:file -> setting -> plugins -> 搜索lombok安装
使用:在javabean中使用 常用注解:@Getter @Setter @data @AllArgsConstructor @NoArgsConstructor @ToString

4.mybatis环境搭建
mybatis官方文档:
https://mybatis.org/mybatis-3/zh/sqlmap-xml.html#select
- 环境准备
添加需要的jar包:mybatis、lombok、数据库驱动。 - 建表
- 新建实体类
- mybatis-config配置
- xxxMapper文件书写
- dao层
接口IUserDao
实体类UserDaoImpl
dao接口 - 在 cn.wolfcode.mybatis.dao 包中创建 dao 接口: IUserDAO.java
- dao 接口实现类
- 在 cn.wolfcode.mybatis.dao.impl 包中创建 dao 的实现类: UserDAOImpl.java
按以下 API 实现数据的保存操作:
SqlSessionFactory : 对连接池(DataSource)的封装
SqlSession openSession() : 获取SqlSession对象
SqlSession,对连接(Connection)的封装
int insert(String statementid, Object param);
statementid: 有mapper配置文件中的namespace+sqlid组成
void commit(): 提交事务
void close() : 释放资源 - 测试
//2建表
CREATE TABLE `user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`name` varchar(255) DEFAULT NULL,
`age` int(255) DEFAULT NULL,
`salary` decimal(10,0) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;
//3新建实体类
@Getter@Setter@ToString
@NoArgsConstructor@AllArgsConstructor
public class User {
private Long id;
private String name;
private Integer age;
private BigDecimal salary;
private Date hiredate;
}
//4mybatis-config配置
//1. 在项目的resources(source folder)下创建mybatis-config.xml配置文件
//2. 拷贝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">
<?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">
//3. 添加环境配置(事务管理器 / 连接池 / 映射文件)
<?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>
<environments default="dev">
<environment id="dev">
<!--
MyBatis 内置的事务管理器
JDBC:org.apache.ibatis.transaction.jdbc.JdbcTransaction的别名
-->
<transactionManager type="JDBC"/>
<!--
MyBatis 内置的连接池
POOLED:org.apache.ibatis.datasource.pooled.PooledDataSource的别
名
-->
<dataSource type="POOLED">
<!--
driver:这是POOLED连接池对象的驱动类的属性名,
Druid连接池对象的驱动类属性名是driverClassName
-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatis"/>
<?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>
<environments default="dev">
<environment id="dev">
<!--
MyBatis 内置的事务管理器
JDBC:org.apache.ibatis.transaction.jdbc.JdbcTransaction的别名
-->
<transactionManager type="JDBC"/>
<!--
MyBatis 内置的连接池
POOLED:org.apache.ibatis.datasource.pooled.PooledDataSource的别
名
-->
<dataSource type="POOLED">
<!--
driver:这是POOLED连接池对象的驱动类的属性名,
Druid连接池对象的驱动类属性名是driverClassName
-->
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///mybatis"/>
<property name="username" value="root"/>
<property name="password" value="admin"/>
</dataSource>
</environment>
</environments>
<mappers>
<mapper resource="cn/wolfcode/mybatis/mapper/UserMapper.xml"/>
</mappers>
</configuration>
//5xxxMapper文件书写
//mapper 映射文件: UserMapper.xml
//mybatis中,访问数据库的SQL语句是编写在mapper配置文件中的,程序员按照这个文件约定
的格式进行配置即可
在包 cn.wolfcode.mybatis.mapper 中创建配置文件: UserMapper.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配置文件来编写SQL语句
每条SQL语句都需要有一个唯一的标识
这个唯一的标识由 namespace + sqlid 组成
使用下面的namespace+sqlid就得到了保存用户信息的唯一标识:
cn.wolfcode.mybatis.mapper.UserMapper.insert
接下来,我们就可以使用上面的标识找到这条SQL语句了
-->
<mapper namespace="cn.wolfcode.mybatis.mapper.UserMapper">
<insert id="insert">
insert into user(name,age,salary,hiredate)
values(#{name}, #{age}, #{salary}, #{hiredate})
</insert>
</mapper>
<mappers>
<!--
这里是mapper文件的路径,所以使用/分割
-->
<mapper resource="cn/wolfcode/mybatis/mapper/UserMapper.xml"/>
</mappers>
注意: 一定记得在 mybatis-config.xml 配置文件中关联映射文件
6.dao
//6dao层
接口IUserDao
实体类UserDaoImpl
//调用 SqlSession 中的 insert 方法,执行指定的 SQL
public class UserDAOImpl implements IUserDAO {
public void insert(User u) {
try {
InputStream in = Resources.getResourceAsStream("mybatisconfig.xml");
SqlSessionFactory fac = new
SqlSessionFactoryBuilder().build(in);
SqlSession session = fac.openSession();
session.insert("cn.wolfcode.mybatis.mapper.UserMapper.insert",
u);
session.commit();
session.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
//在测试类中测试 insert 方法
public class UserDAOTest {
private IUserDAO dao = new UserDAOImpl();
@Test
public void testInsert() {
User u = new User(null,"张三",20,new BigDecimal(20000), new Date());
dao.insert(u);
}
}
Comments | NOTHING