前言JDBC
1.什么是JDBC
JDBC(Java DataBase Connectivity) Java数据库连接
其实就是利用Java语言(Java程序)连接并访问数据库的一门技
2. JDBC代码实现
public class JdbcDemo {
public static void main(String[] args) throws Exception {
//注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
//获取连接
Connection conn = DriverManager.getConnection(
"jdbc:mysql:///yonghedb?charcaterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false",
"root","root");
System.out.println("连接成功");
//获取传输
Statement stat = conn.createStatement();
//执行sql,返回结果
ResultSet rs = stat.executeQuery("select * from emp");
//遍历rs对象中的数据,将每一条数据封装为一个Emp对象,放在List集合中
List<Emp> list = new ArrayList<Emp>();
Emp emp=null;
while(rs.next()) {
int id=rs.getInt("id");
String name=rs.getString("name");
String job=rs.getString("job");
double salary=rs.getDouble("salary");
//将当前遍历的这条记录封装到emp对象中
emp=new Emp();
emp.setId(id);
emp.setName(name);
emp.setJob(job);
emp.setSalary(salary);
//将封装好数据的emp对象存到list集合中
list.add(emp);
}
//打印list集合中数据对象
for (Emp e : list) {
System.out.println(e);
}
//6释放资源
rs.close();
stat.close();
conn.close();
}
}
MyBatis框架
1.什么是MyBatis
MyBatis是一个优秀的持久层框架,它对jdbc的操作数据库的过程进行封装,简化了JDBC代码,解决JDBC将结果集封装为Java对象的麻烦。
2.代码实现
2.1 pom.xml文件配置:
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.test</groupId>
<artifactId>Mybatis</artifactId>
<version>0.0.1-SNAPSHOT</version>
<dependencies>
<!-- junit单元测试 -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.9</version>
</dependency>
<!-- mysql驱动 -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.11</version>
</dependency>
<!-- mybatis -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.2.8</version>
</dependency>
<!-- 整合log4j -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.6.4</version>
</dependency>
</dependencies>
</project>
2.2 mybatis-config.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">
<!-- MyBatis的全局配置文件 -->
<configuration>
<!--配置开发环境 -->
<environments default="dev">
<environment id="dev">
<!--配置事物管理 JDBC:将事物交给JDBC管理-->
<transactionManager type="JDBC"></transactionManager>
<!--配置连接池信息 -->
<dataSource type="POOLED">
<property name="driver" value="com.mysql.cj.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///yonghedb?characterEncoding=utf-8&serverTimezone=Asia/Shanghai&useSSL=false"/>
<property name="username" value="root"/>
<property name="password" value="root"/>
</dataSource>
</environment>
</environments>
<!--导入XxxxMapper文件-->
<mappers>
<mapper resource="EmpMapper.xml"/>
</mappers>
</configuration>
2.3 EmpMapper.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">
<!-- 通过namespace值+id值可以定位要执行的是哪条sql语句-->
<mapper namespace="cn.tedu.dao.EmpMapper">
<!--查询-->
<select id="findAll" resultType="cn.tedu.pojo.Emp">
select * from emp
select ${colName} from emp
</select>
<!--新增-->
<insert id="insert">
insert into emp value(null,#{name},#{job},#{salary})
</insert>
<!--更新-->
<update id="update">
update emp set job=#{job},salary=#{salary} where name=#{name}
</insert>
<!--删除-->
<delete id="delete">
delete from emp where id=#{id}
</delete>
</mapper>
2.4 编辑log4j.properties日志文件:
# Global logging configuration
log4j.rootLogger=DEBUG, Console,LOGFILE
# Console output...
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%5p [%t] %d{yyyy-MM-dd hh:mm:ss}- %m%n
log4j.appender.LOGFILE=org.apache.log4j.FileAppender
log4j.appender.LOGFILE.file=./mylog.log
log4j.appender.LOGFILE.layout=org.apache.log4j.PatternLayout
log4j.appender.LOGFILE.layout.ConversionPattern=%5p [%t] %d{yyyy-MM-dd hh:mm:ss}- %m%n
2.5 编辑接口EmpMapper代码
public interface EmpMapper {
public List<Emp> findAll();
public void insert(Map map);
public void update(Emp emp);
public void delete(Integer id);
}
2.6 编辑测试类实现代码
//mybatis增删改查--通过接口EmpMapper.class
public class MybatisDemo {
SqlSession session=null;
//@Before标记的方法会在每个@Test标记的方法之前执行
@Before
public void beforeMethod() throws Exception {
//1读取mybatis核心配置文件中的配置信息(mybatis-config.xml)
InputStream in = Resources.getResourceAsStream("mybatis-config.xml");
//基于上面读取的配置信息获取SqlSessionFactory对象(工厂)
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
//通过工厂对象打开与数据库的连接(即通过工厂对象获取SqlSession对象)
session = factory.openSession(true);//true自动提交事物
}
//测试查询
@Test
public void testFindAll() {
//获取EmpMapper接口的子类(由mybatis提供)的对象实例
EmpMapper mapper = session.getMapper(EmpMapper.class);
List<Emp> list = mapper.findAll();
for (Emp emp : list) {
System.out.println(emp);
}
}
//测试新增
@Test
public void testInsert() {
EmpMapper mapper = session.getMapper(EmpMapper.class);
Map map= new HashMap();
map.put("name","李思");
map.put("job","程序员");
map.put("salary","25000");
mapper.insert(map);
}
//测试修改
@Test
public void testUpdate() {
EmpMapper mapper = session.getMapper(EmpMapper.class);
Emp emp =new Emp();
emp.setName("张三");
emp.setJob("董事长");
emp.setSalary(35000d);
mapper.update(emp);
}
//测试删除
@Test
public void testDelete() {
EmpMapper mapper = session.getMapper(EmpMapper.class);
mapper.delete(52);
}
}
3. 知识点
resultType属性:从这条SQL语句中返回所期望类型的类的完全限定名称(包名+类名)。
resultMap属性:复杂对象结构(例如多表关联查询等)。 使用 resultType 或 resultMap,但不能同时使用。
mybatis中的占位符: #{}和 ${}
#{}:在参数值传过来替换占位符的同时,会进行转义处理(在字符串或日期类型的值的两边加上单引号);
select * from emp where name=Xxx; – 错误
select * from emp where name=‘Xxx’; – 正确
${}:是为SQL片段(字符串)进行占位,将传过来的SQL片段直接拼接在 ${} 占位符所在的位置,不会进行任何的转义处理。
(由于是直接将参数拼接在SQL语句中,因此可能会引发SQL注入攻击问题)
select ${columns} from emp
拼接之后:select id,name,job from emp
需要注意的是,在传递 ${} 对应的值时,即使只有一个参数,也需要将值存入map集合中!!