☕ ☕ TuskLang Java Database Integration Guide
☕ TuskLang Java Database Integration Guide
"We don't bow to any king" - Java Edition
Master database integration in TuskLang Java with comprehensive coverage of all database adapters, @query operators, ORM integration, and advanced database features.
🗄️ Database Adapters
TuskLang Java supports multiple database adapters for seamless integration:
1. SQLite Adapter
import org.tusklang.java.TuskLang;
import org.tusklang.java.adapters.SQLiteAdapter;
import java.util.Map;public class SQLiteExample {
public static void main(String[] args) {
// Create SQLite adapter
SQLiteAdapter db = new SQLiteAdapter("app.db");
// Create TuskLang parser with database
TuskLang parser = new TuskLang();
parser.setDatabaseAdapter(db);
// TSK file with database queries
String tskContent = """
[database]
user_count: @query("SELECT COUNT(*) FROM users")
active_users: @query("SELECT COUNT(*) FROM users WHERE active = 1")
recent_orders: @query("SELECT COUNT(*) FROM orders WHERE created_at > ?", @date.subtract("7d"))
""";
Map<String, Object> config = parser.parse(tskContent);
System.out.println("User count: " + config.get("database"));
}
}
2. PostgreSQL Adapter
import org.tusklang.java.TuskLang;
import org.tusklang.java.adapters.PostgreSQLAdapter;
import org.tusklang.java.config.PostgreSQLConfig;public class PostgreSQLExample {
public static void main(String[] args) {
// Configure PostgreSQL adapter
PostgreSQLAdapter db = new PostgreSQLAdapter(PostgreSQLConfig.builder()
.host("localhost")
.port(5432)
.database("myapp")
.user("postgres")
.password("secret")
.poolSize(10)
.connectionTimeout(30)
.build());
TuskLang parser = new TuskLang();
parser.setDatabaseAdapter(db);
String tskContent = """
[analytics]
total_revenue: @query("SELECT SUM(amount) FROM orders WHERE status = 'completed'")
monthly_users: @query("SELECT COUNT(DISTINCT user_id) FROM orders WHERE created_at >= ?", @date.subtract("30d"))
top_products: @query("SELECT product_name, COUNT(*) as sales FROM order_items GROUP BY product_name ORDER BY sales DESC LIMIT 5")
""";
Map<String, Object> config = parser.parse(tskContent);
System.out.println("Analytics: " + config.get("analytics"));
}
}
3. MySQL Adapter
import org.tusklang.java.TuskLang;
import org.tusklang.java.adapters.MySQLAdapter;
import org.tusklang.java.config.MySQLConfig;public class MySQLExample {
public static void main(String[] args) {
// Configure MySQL adapter
MySQLAdapter db = new MySQLAdapter(MySQLConfig.builder()
.host("localhost")
.port(3306)
.database("myapp")
.user("root")
.password("secret")
.useSSL(false)
.autoReconnect(true)
.build());
TuskLang parser = new TuskLang();
parser.setDatabaseAdapter(db);
String tskContent = """
[users]
total_count: @query("SELECT COUNT(*) FROM users")
active_count: @query("SELECT COUNT(*) FROM users WHERE last_login > ?", @date.subtract("30d"))
premium_count: @query("SELECT COUNT(*) FROM users WHERE subscription_type = 'premium'")
""";
Map<String, Object> config = parser.parse(tskContent);
System.out.println("User stats: " + config.get("users"));
}
}
4. MongoDB Adapter
import org.tusklang.java.TuskLang;
import org.tusklang.java.adapters.MongoDBAdapter;
import org.tusklang.java.config.MongoDBConfig;public class MongoDBExample {
public static void main(String[] args) {
// Configure MongoDB adapter
MongoDBAdapter db = new MongoDBAdapter(MongoDBConfig.builder()
.host("localhost")
.port(27017)
.database("myapp")
.username("admin")
.password("secret")
.authDatabase("admin")
.build());
TuskLang parser = new TuskLang();
parser.setDatabaseAdapter(db);
String tskContent = """
[analytics]
user_count: @query("db.users.countDocuments()")
recent_orders: @query("db.orders.countDocuments({createdAt: {$gte: ?}})", @date.subtract("7d"))
top_categories: @query("db.orders.aggregate([{$group: {_id: '$category', count: {$sum: 1}}}, {$sort: {count: -1}}, {$limit: 5}])")
""";
Map<String, Object> config = parser.parse(tskContent);
System.out.println("MongoDB analytics: " + config.get("analytics"));
}
}
5. Redis Adapter
import org.tusklang.java.TuskLang;
import org.tusklang.java.adapters.RedisAdapter;
import org.tusklang.java.config.RedisConfig;public class RedisExample {
public static void main(String[] args) {
// Configure Redis adapter
RedisAdapter db = new RedisAdapter(RedisConfig.builder()
.host("localhost")
.port(6379)
.password("secret")
.database(0)
.timeout(30)
.build());
TuskLang parser = new TuskLang();
parser.setDatabaseAdapter(db);
String tskContent = """
[cache]
session_count: @query("SCARD sessions")
active_keys: @query("KEYS *")
memory_usage: @query("INFO memory")
""";
Map<String, Object> config = parser.parse(tskContent);
System.out.println("Redis stats: " + config.get("cache"));
}
}
⚡ @query Operator
Basic Queries
Simple queries
[database]
user_count: @query("SELECT COUNT(*) FROM users")
total_orders: @query("SELECT COUNT(*) FROM orders")
revenue: @query("SELECT SUM(amount) FROM orders WHERE status = 'completed'")Parameterized queries
recent_users: @query("SELECT COUNT(*) FROM users WHERE created_at > ?", @date.subtract("7d"))
user_by_id: @query("SELECT * FROM users WHERE id = ?", @request.user_id)
orders_by_status: @query("SELECT * FROM orders WHERE status = ?", "pending")
Complex Queries
Joins and aggregations
[analytics]
user_orders: @query("""
SELECT u.name, COUNT(o.id) as order_count, SUM(o.amount) as total_spent
FROM users u
LEFT JOIN orders o ON u.id = o.user_id
WHERE o.created_at > ?
GROUP BY u.id, u.name
ORDER BY total_spent DESC
LIMIT 10
""", @date.subtract("30d"))Subqueries
top_customers: @query("""
SELECT user_id, total_spent
FROM (
SELECT user_id, SUM(amount) as total_spent
FROM orders
WHERE status = 'completed'
GROUP BY user_id
) user_totals
WHERE total_spent > (
SELECT AVG(total_spent) FROM (
SELECT SUM(amount) as total_spent
FROM orders
WHERE status = 'completed'
GROUP BY user_id
) avg_totals
)
""")Window functions
user_rankings: @query("""
SELECT
user_id,
total_spent,
RANK() OVER (ORDER BY total_spent DESC) as rank,
PERCENT_RANK() OVER (ORDER BY total_spent DESC) as percentile
FROM (
SELECT user_id, SUM(amount) as total_spent
FROM orders
WHERE status = 'completed'
GROUP BY user_id
) user_totals
""")
Java Query Execution
import org.tusklang.java.TuskLang;
import org.tusklang.java.adapters.PostgreSQLAdapter;
import java.util.List;
import java.util.Map;public class QueryExample {
public static void main(String[] args) {
PostgreSQLAdapter db = new PostgreSQLAdapter(PostgreSQLConfig.builder()
.host("localhost")
.port(5432)
.database("myapp")
.user("postgres")
.password("secret")
.build());
TuskLang parser = new TuskLang();
parser.setDatabaseAdapter(db);
// Execute queries directly
List<Map<String, Object>> users = parser.query("SELECT * FROM users LIMIT 10");
System.out.println("Users: " + users);
// Execute with parameters
List<Map<String, Object>> recentOrders = parser.query(
"SELECT * FROM orders WHERE created_at > ?",
java.time.LocalDateTime.now().minusDays(7)
);
System.out.println("Recent orders: " + recentOrders);
// Execute single value query
Long userCount = parser.querySingle("SELECT COUNT(*) FROM users", Long.class);
System.out.println("User count: " + userCount);
}
}
🔄 ORM Integration
JPA/Hibernate Integration
import org.tusklang.java.TuskLang;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import org.springframework.stereotype.Service;
import jakarta.persistence.*;@SpringBootApplication
public class OrmExample {
public static void main(String[] args) {
SpringApplication.run(OrmExample.class, args);
}
}
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name")
private String name;
@Column(name = "email")
private String email;
@Column(name = "active")
private boolean active;
// Getters and setters
}
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findByActiveTrue();
long countByActiveTrue();
}
@Service
public class UserService {
private final UserRepository userRepository;
private final TuskLang parser;
public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
this.parser = new TuskLang();
}
public Map<String, Object> getUserStats() {
// Use TuskLang with JPA
String tskContent = """
[stats]
total_users: @query("SELECT COUNT(*) FROM users")
active_users: @query("SELECT COUNT(*) FROM users WHERE active = true")
recent_users: @query("SELECT COUNT(*) FROM users WHERE created_at > ?", @date.subtract("7d"))
""";
return parser.parse(tskContent);
}
}
MyBatis Integration
import org.tusklang.java.TuskLang;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
import java.util.List;
import java.util.Map;@Mapper
public interface UserMapper {
@Select("SELECT COUNT(*) FROM users")
long getUserCount();
@Select("SELECT COUNT(*) FROM users WHERE active = true")
long getActiveUserCount();
@Select("SELECT * FROM users WHERE created_at > #{date}")
List<User> getRecentUsers(java.time.LocalDateTime date);
}
@Service
public class MyBatisUserService {
private final UserMapper userMapper;
private final TuskLang parser;
public MyBatisUserService(UserMapper userMapper) {
this.userMapper = userMapper;
this.parser = new TuskLang();
}
public Map<String, Object> getUserStats() {
String tskContent = """
[stats]
total_users: @query("SELECT COUNT(*) FROM users")
active_users: @query("SELECT COUNT(*) FROM users WHERE active = true")
""";
return parser.parse(tskContent);
}
}
🔒 Transaction Management
Manual Transaction Control
import org.tusklang.java.TuskLang;
import org.tusklang.java.adapters.PostgreSQLAdapter;
import java.sql.Connection;public class TransactionExample {
public static void main(String[] args) {
PostgreSQLAdapter db = new PostgreSQLAdapter(PostgreSQLConfig.builder()
.host("localhost")
.port(5432)
.database("myapp")
.user("postgres")
.password("secret")
.build());
TuskLang parser = new TuskLang();
parser.setDatabaseAdapter(db);
// Execute in transaction
parser.executeInTransaction(connection -> {
// Execute multiple queries in transaction
parser.query("INSERT INTO users (name, email) VALUES (?, ?)", "Alice", "alice@example.com");
parser.query("INSERT INTO user_profiles (user_id, bio) VALUES (LAST_INSERT_ID(), ?)", "Software Developer");
return true; // Commit transaction
});
}
}
Spring Transaction Integration
import org.springframework.transaction.annotation.Transactional;
import org.springframework.stereotype.Service;@Service
public class TransactionalUserService {
private final TuskLang parser;
public TransactionalUserService() {
this.parser = new TuskLang();
}
@Transactional
public void createUserWithProfile(String name, String email, String bio) {
// These queries will be executed in a Spring-managed transaction
parser.query("INSERT INTO users (name, email) VALUES (?, ?)", name, email);
parser.query("INSERT INTO user_profiles (user_id, bio) VALUES (LAST_INSERT_ID(), ?)", bio);
}
@Transactional(readOnly = true)
public Map<String, Object> getUserStats() {
String tskContent = """
[stats]
total_users: @query("SELECT COUNT(*) FROM users")
active_users: @query("SELECT COUNT(*) FROM users WHERE active = true")
""";
return parser.parse(tskContent);
}
}
📊 Advanced Database Features
Connection Pooling
import org.tusklang.java.adapters.PostgreSQLAdapter;
import org.tusklang.java.config.PostgreSQLConfig;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;public class ConnectionPoolExample {
public static void main(String[] args) {
// Configure connection pool
HikariConfig hikariConfig = new HikariConfig();
hikariConfig.setJdbcUrl("jdbc:postgresql://localhost:5432/myapp");
hikariConfig.setUsername("postgres");
hikariConfig.setPassword("secret");
hikariConfig.setMaximumPoolSize(20);
hikariConfig.setMinimumIdle(5);
hikariConfig.setConnectionTimeout(30000);
hikariConfig.setIdleTimeout(600000);
hikariConfig.setMaxLifetime(1800000);
HikariDataSource dataSource = new HikariDataSource(hikariConfig);
// Create adapter with connection pool
PostgreSQLAdapter db = new PostgreSQLAdapter(dataSource);
TuskLang parser = new TuskLang();
parser.setDatabaseAdapter(db);
// Use with connection pooling
Map<String, Object> config = parser.parseFile("config.tsk");
System.out.println("Config with connection pool: " + config);
}
}
Read Replicas
import org.tusklang.java.adapters.PostgreSQLAdapter;
import org.tusklang.java.config.PostgreSQLConfig;
import java.util.List;public class ReadReplicaExample {
public static void main(String[] args) {
// Configure primary database
PostgreSQLAdapter primary = new PostgreSQLAdapter(PostgreSQLConfig.builder()
.host("primary-db.example.com")
.port(5432)
.database("myapp")
.user("postgres")
.password("secret")
.build());
// Configure read replicas
List<PostgreSQLAdapter> replicas = List.of(
new PostgreSQLAdapter(PostgreSQLConfig.builder()
.host("replica1.example.com")
.port(5432)
.database("myapp")
.user("readonly")
.password("secret")
.build()),
new PostgreSQLAdapter(PostgreSQLConfig.builder()
.host("replica2.example.com")
.port(5432)
.database("myapp")
.user("readonly")
.password("secret")
.build())
);
// Create adapter with read replicas
PostgreSQLAdapter db = new PostgreSQLAdapter(primary, replicas);
TuskLang parser = new TuskLang();
parser.setDatabaseAdapter(db);
// Queries will automatically use read replicas for SELECT operations
Map<String, Object> config = parser.parseFile("config.tsk");
System.out.println("Config with read replicas: " + config);
}
}
Database Migration Integration
import org.tusklang.java.TuskLang;
import org.flywaydb.core.Flyway;
import org.tusklang.java.adapters.PostgreSQLAdapter;public class MigrationExample {
public static void main(String[] args) {
// Run database migrations
Flyway flyway = Flyway.configure()
.dataSource("jdbc:postgresql://localhost:5432/myapp", "postgres", "secret")
.load();
flyway.migrate();
// Create TuskLang parser
PostgreSQLAdapter db = new PostgreSQLAdapter(PostgreSQLConfig.builder()
.host("localhost")
.port(5432)
.database("myapp")
.user("postgres")
.password("secret")
.build());
TuskLang parser = new TuskLang();
parser.setDatabaseAdapter(db);
// Use migrated database
Map<String, Object> config = parser.parseFile("config.tsk");
System.out.println("Config with migrations: " + config);
}
}
🔧 Performance Optimization
Query Caching
Cache expensive queries
[expensive_data]
user_analytics: @cache("5m", "get_user_analytics")
order_statistics: @cache("1h", "get_order_statistics")
revenue_metrics: @cache("30m", "get_revenue_metrics")
Lazy Loading
Lazy load data when needed
[lazy_data]
user_profiles: @lazy("load_user_profiles")
detailed_analytics: @lazy("load_detailed_analytics")
Parallel Queries
Execute queries in parallel
[parallel_data]
data1: @async("query1")
data2: @async("query2")
data3: @async("query3")
Java Performance Implementation
import org.tusklang.java.TuskLang;
import org.tusklang.java.cache.CacheManager;
import java.util.concurrent.CompletableFuture;public class PerformanceExample {
public static void main(String[] args) {
// Configure cache
CacheManager cacheManager = new CacheManager();
cacheManager.setDefaultTtl(300); // 5 minutes
TuskLang parser = new TuskLang();
parser.setCacheManager(cacheManager);
// Parallel query execution
CompletableFuture<Map<String, Object>> future1 = parser.parseAsync("config1.tsk");
CompletableFuture<Map<String, Object>> future2 = parser.parseAsync("config2.tsk");
CompletableFuture<Map<String, Object>> future3 = parser.parseAsync("config3.tsk");
// Wait for all to complete
CompletableFuture.allOf(future1, future2, future3).join();
Map<String, Object> config1 = future1.get();
Map<String, Object> config2 = future2.get();
Map<String, Object> config3 = future3.get();
System.out.println("All configurations loaded in parallel");
}
}
🔒 Security Best Practices
Parameterized Queries
Always use parameterized queries
[secure_queries]
user_by_id: @query("SELECT * FROM users WHERE id = ?", @request.user_id)
orders_by_status: @query("SELECT * FROM orders WHERE status = ?", "pending")
recent_data: @query("SELECT * FROM data WHERE created_at > ?", @date.subtract("7d"))
Connection Security
import org.tusklang.java.adapters.PostgreSQLAdapter;
import org.tusklang.java.config.PostgreSQLConfig;public class SecurityExample {
public static void main(String[] args) {
// Secure database configuration
PostgreSQLAdapter db = new PostgreSQLAdapter(PostgreSQLConfig.builder()
.host("localhost")
.port(5432)
.database("myapp")
.user("app_user") // Use dedicated user
.password(System.getenv("DB_PASSWORD")) // Use environment variable
.ssl(true) // Enable SSL
.sslMode("require") // Require SSL
.build());
TuskLang parser = new TuskLang();
parser.setDatabaseAdapter(db);
// Use secure configuration
Map<String, Object> config = parser.parseFile("config.tsk");
System.out.println("Secure configuration loaded");
}
}
🧪 Testing Database Integration
Unit Tests
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.BeforeEach;
import static org.junit.jupiter.api.Assertions.*;
import org.tusklang.java.TuskLang;
import org.tusklang.java.adapters.SQLiteAdapter;class DatabaseIntegrationTest {
private TuskLang parser;
private SQLiteAdapter db;
@BeforeEach
void setUp() {
// Setup test database
db = new SQLiteAdapter(":memory:");
parser = new TuskLang();
parser.setDatabaseAdapter(db);
// Setup test data
db.execute("""
CREATE TABLE users (id INTEGER, name TEXT, active BOOLEAN);
INSERT INTO users VALUES (1, 'Alice', 1), (2, 'Bob', 0);
""");
}
@Test
void testDatabaseQueries() {
String tskContent = """
[users]
count: @query("SELECT COUNT(*) FROM users")
active_count: @query("SELECT COUNT(*) FROM users WHERE active = 1")
""";
Map<String, Object> data = parser.parse(tskContent);
assertEquals(2, data.get("users"));
assertEquals(1, data.get("users"));
}
@Test
void testParameterizedQueries() {
String tskContent = """
[user]
alice: @query("SELECT * FROM users WHERE name = ?", "Alice")
""";
Map<String, Object> data = parser.parse(tskContent);
assertNotNull(data.get("user"));
}
}
🔧 Troubleshooting
Common Database Issues
1. Connection Timeout
// Increase connection timeout
PostgreSQLConfig config = PostgreSQLConfig.builder()
.host("localhost")
.port(5432)
.database("myapp")
.user("postgres")
.password("secret")
.connectionTimeout(60) // 60 seconds
.build();
2. Query Performance
// Enable query logging
parser.setDebug(true);// Use query execution time monitoring
long startTime = System.currentTimeMillis();
Map<String, Object> result = parser.parse(tskContent);
long endTime = System.currentTimeMillis();
System.out.println("Query execution time: " + (endTime - startTime) + "ms");
3. Memory Issues
// Use streaming for large result sets
List<Map<String, Object>> results = parser.queryStream("SELECT * FROM large_table");
results.forEach(row -> {
// Process each row individually
System.out.println("Processing row: " + row);
});
📚 Next Steps
1. Master @query operators - Complex queries and aggregations 2. Integrate with ORM frameworks - JPA, MyBatis, Hibernate 3. Implement caching strategies - Query caching and result caching 4. Add transaction management - ACID compliance and rollback handling 5. Optimize performance - Connection pooling and query optimization
---
"We don't bow to any king" - You now have complete mastery of database integration in TuskLang Java! From simple queries to complex ORM integration, you can build powerful applications with seamless database connectivity.